blob: 90a715b876cb63e0e3f07bb7be650e8be39afbbe [file]
// 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/field_types.h"
#include "components/autofill/core/browser/field_type_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace autofill {
namespace {
using ::testing::Optional;
TEST(FieldTypesTest, TypeStringConversion) {
EXPECT_EQ(TypeNameToFieldType(FieldTypeToStringView(NO_SERVER_DATA)),
NO_SERVER_DATA);
for (int i = 0; i < MAX_VALID_FIELD_TYPE; ++i) {
if (FieldType raw_value = static_cast<FieldType>(i); // nocheck
ToSafeFieldType(raw_value).has_value()) {
EXPECT_EQ(TypeNameToFieldType(FieldTypeToStringView(raw_value)),
raw_value);
}
}
}
TEST(FieldTypesTest, IsValidFieldType) {
const std::set<FieldType> kValidFieldTypes{
NO_SERVER_DATA,
UNKNOWN_TYPE,
EMPTY_TYPE,
NAME_FIRST,
NAME_MIDDLE,
NAME_LAST,
NAME_MIDDLE_INITIAL,
NAME_FULL,
NAME_SUFFIX,
ALTERNATIVE_FULL_NAME,
ALTERNATIVE_GIVEN_NAME,
ALTERNATIVE_FAMILY_NAME,
EMAIL_ADDRESS,
PHONE_HOME_NUMBER,
PHONE_HOME_NUMBER_PREFIX,
PHONE_HOME_NUMBER_SUFFIX,
PHONE_HOME_CITY_CODE,
PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX,
PHONE_HOME_COUNTRY_CODE,
PHONE_HOME_CITY_AND_NUMBER,
PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX,
PHONE_HOME_WHOLE_NUMBER,
ADDRESS_HOME_LINE1,
ADDRESS_HOME_LINE2,
ADDRESS_HOME_APT,
ADDRESS_HOME_APT_NUM,
ADDRESS_HOME_APT_TYPE,
ADDRESS_HOME_CITY,
ADDRESS_HOME_STATE,
ADDRESS_HOME_ZIP,
ADDRESS_HOME_COUNTRY,
CREDIT_CARD_NAME_FULL,
CREDIT_CARD_NUMBER,
CREDIT_CARD_EXP_MONTH,
CREDIT_CARD_EXP_2_DIGIT_YEAR,
CREDIT_CARD_EXP_4_DIGIT_YEAR,
CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
CREDIT_CARD_STANDALONE_VERIFICATION_CODE,
CREDIT_CARD_TYPE,
CREDIT_CARD_VERIFICATION_CODE,
COMPANY_NAME,
MERCHANT_EMAIL_SIGNUP,
MERCHANT_PROMO_CODE,
PASSWORD,
ACCOUNT_CREATION_PASSWORD,
ADDRESS_HOME_STREET_ADDRESS,
ADDRESS_HOME_SORTING_CODE,
ADDRESS_HOME_DEPENDENT_LOCALITY,
ADDRESS_HOME_LINE3,
NOT_ACCOUNT_CREATION_PASSWORD,
USERNAME,
USERNAME_AND_EMAIL_ADDRESS,
NEW_PASSWORD,
PROBABLY_NEW_PASSWORD,
NOT_NEW_PASSWORD,
CREDIT_CARD_NAME_FIRST,
CREDIT_CARD_NAME_LAST,
PHONE_HOME_EXTENSION,
CONFIRMATION_PASSWORD,
AMBIGUOUS_TYPE,
SEARCH_TERM,
PRICE,
NOT_PASSWORD,
SINGLE_USERNAME,
NOT_USERNAME,
IBAN_VALUE,
ADDRESS_HOME_STREET_NAME,
ADDRESS_HOME_HOUSE_NUMBER,
ADDRESS_HOME_HOUSE_NUMBER_AND_APT,
ADDRESS_HOME_SUBPREMISE,
ADDRESS_HOME_OTHER_SUBUNIT,
NAME_LAST_FIRST,
NAME_LAST_CONJUNCTION,
NAME_LAST_SECOND,
NAME_HONORIFIC_PREFIX,
ADDRESS_HOME_ADDRESS,
ADDRESS_HOME_ADDRESS_WITH_NAME,
ADDRESS_HOME_FLOOR,
NUMERIC_QUANTITY,
ONE_TIME_CODE,
ADDRESS_HOME_LANDMARK,
ADDRESS_HOME_BETWEEN_STREETS,
ADDRESS_HOME_ADMIN_LEVEL2,
DELIVERY_INSTRUCTIONS,
ADDRESS_HOME_OVERFLOW,
ADDRESS_HOME_STREET_LOCATION,
ADDRESS_HOME_BETWEEN_STREETS_1,
ADDRESS_HOME_BETWEEN_STREETS_2,
ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK,
ADDRESS_HOME_OVERFLOW_AND_LANDMARK,
ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY,
ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK,
ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK,
SINGLE_USERNAME_FORGOT_PASSWORD,
SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES,
PASSPORT_NUMBER,
PASSPORT_ISSUING_COUNTRY,
PASSPORT_EXPIRATION_DATE,
PASSPORT_ISSUE_DATE,
LOYALTY_MEMBERSHIP_PROGRAM,
LOYALTY_MEMBERSHIP_PROVIDER,
LOYALTY_MEMBERSHIP_ID,
VEHICLE_LICENSE_PLATE,
VEHICLE_VIN,
VEHICLE_MAKE,
VEHICLE_MODEL,
DRIVERS_LICENSE_REGION,
DRIVERS_LICENSE_NUMBER,
DRIVERS_LICENSE_EXPIRATION_DATE,
DRIVERS_LICENSE_ISSUE_DATE,
VEHICLE_YEAR,
VEHICLE_PLATE_STATE,
EMAIL_OR_LOYALTY_MEMBERSHIP_ID,
NATIONAL_ID_CARD_NUMBER,
NATIONAL_ID_CARD_EXPIRATION_DATE,
NATIONAL_ID_CARD_ISSUE_DATE,
NATIONAL_ID_CARD_ISSUING_COUNTRY,
REDRESS_NUMBER,
KNOWN_TRAVELER_NUMBER,
KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE,
ADDRESS_HOME_ZIP_PREFIX,
ADDRESS_HOME_ZIP_SUFFIX,
FLIGHT_RESERVATION_FLIGHT_NUMBER,
FLIGHT_RESERVATION_CONFIRMATION_CODE,
FLIGHT_RESERVATION_TICKET_NUMBER,
FLIGHT_RESERVATION_DEPARTURE_DATE,
ADDRESS_HOME_ZIP_AND_CITY,
ORDER_ID,
ORDER_DATE,
ORDER_MERCHANT_NAME,
SHIPMENT_TRACKING_NUMBER,
};
static_assert(FieldType::MAX_VALID_FIELD_TYPE == 220,
"New field type needs to be added to kValidFieldTypes.");
FieldType kInvalidValue = static_cast<FieldType>(123456);
ASSERT_FALSE(kValidFieldTypes.count(kInvalidValue));
for (int i = -10; i < MAX_VALID_FIELD_TYPE + 10; ++i) {
FieldType raw_value = static_cast<FieldType>(i);
if (kValidFieldTypes.contains(raw_value)) {
EXPECT_THAT(ToSafeFieldType(raw_value), Optional(raw_value));
} else {
EXPECT_EQ(ToSafeFieldType(raw_value), std::nullopt);
}
}
}
TEST(FieldTypesTest, TestWith2DigitExpirationYear) {
FieldType assumed_field_type =
ToSafeFieldType(CREDIT_CARD_EXP_2_DIGIT_YEAR).value_or(NO_SERVER_DATA);
size_t result = DetermineExpirationYearLength(assumed_field_type);
EXPECT_EQ(result, static_cast<size_t>(2));
}
TEST(FieldTypesTest, TestWith4DigitExpirationYear) {
FieldType assumed_field_type =
ToSafeFieldType(CREDIT_CARD_EXP_4_DIGIT_YEAR).value_or(NO_SERVER_DATA);
size_t result = DetermineExpirationYearLength(assumed_field_type);
EXPECT_EQ(result, static_cast<size_t>(4));
}
// Tests that ToSafeHtmlFieldType() (which is constexpr) is equivalent to
// mojom::IsKnownEnumValue().
TEST(FieldTypesTest, ToSafeHtmlFieldType) {
for (auto raw = std::to_underlying(HtmlFieldType::kMinValue) - 1;
raw <= std::to_underlying(HtmlFieldType::kMaxValue) + 1; ++raw) {
EXPECT_EQ(
ToSafeHtmlFieldType(raw).has_value(),
mojom::IsKnownEnumValue(static_cast<HtmlFieldType>(raw))); // nocheck
}
}
} // namespace
} // namespace autofill