| // 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 |