blob: 4b0820d5f2a2f55e08862a47ce33da7968b5904e [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/common/autofill_regexes.h"
#include <stddef.h>
#include "base/macros.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/common/autofill_regex_constants.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::ASCIIToUTF16;
namespace autofill {
struct InputPatternTestCase {
const char* const input;
const char* const pattern;
};
class PositiveSampleTest
: public testing::TestWithParam<InputPatternTestCase> {};
TEST_P(PositiveSampleTest, SampleRegexes) {
auto test_case = GetParam();
SCOPED_TRACE(test_case.input);
SCOPED_TRACE(test_case.pattern);
EXPECT_TRUE(MatchesPattern(ASCIIToUTF16(test_case.input),
ASCIIToUTF16(test_case.pattern)));
}
INSTANTIATE_TEST_CASE_P(AutofillRegexes,
PositiveSampleTest,
testing::Values(
// Empty pattern
InputPatternTestCase{"", ""},
InputPatternTestCase{
"Look, ma' -- a non-empty string!", ""},
// Substring
InputPatternTestCase{"string", "tri"},
// Substring at beginning
InputPatternTestCase{"string", "str"},
InputPatternTestCase{"string", "^str"},
// Substring at end
InputPatternTestCase{"string", "ring"},
InputPatternTestCase{"string", "ring$"},
// Case-insensitive
InputPatternTestCase{"StRiNg", "string"}));
class NegativeSampleTest
: public testing::TestWithParam<InputPatternTestCase> {};
TEST_P(NegativeSampleTest, SampleRegexes) {
auto test_case = GetParam();
SCOPED_TRACE(test_case.input);
SCOPED_TRACE(test_case.pattern);
EXPECT_FALSE(MatchesPattern(ASCIIToUTF16(test_case.input),
ASCIIToUTF16(test_case.pattern)));
}
INSTANTIATE_TEST_CASE_P(AutofillRegexes,
NegativeSampleTest,
testing::Values(
// Empty string
InputPatternTestCase{
"", "Look, ma' -- a non-empty pattern!"},
// Substring
InputPatternTestCase{"string", "trn"},
// Substring at beginning
InputPatternTestCase{"string", " str"},
InputPatternTestCase{"string", "^tri"},
// Substring at end
InputPatternTestCase{"string", "ring "},
InputPatternTestCase{"string", "rin$"}));
struct InputTestCase {
const char* const input;
};
class ExpirationDate2DigitYearPositive
: public testing::TestWithParam<InputTestCase> {};
TEST_P(ExpirationDate2DigitYearPositive, ExpirationDate2DigitYearRegexes) {
auto test_case = GetParam();
SCOPED_TRACE(test_case.input);
const base::string16 pattern = ASCIIToUTF16(kExpirationDate2DigitYearRe);
EXPECT_TRUE(MatchesPattern(ASCIIToUTF16(test_case.input), pattern));
}
INSTANTIATE_TEST_CASE_P(
AutofillRegexes,
ExpirationDate2DigitYearPositive,
testing::Values(InputTestCase{"mm / yy"},
InputTestCase{"mm/ yy"},
InputTestCase{"mm /yy"},
InputTestCase{"mm/yy"},
InputTestCase{"mm - yy"},
InputTestCase{"mm- yy"},
InputTestCase{"mm -yy"},
InputTestCase{"mm-yy"},
InputTestCase{"mmyy"},
// Complex two year cases
InputTestCase{"Expiration Date (MM / YY)"},
InputTestCase{"Expiration Date (MM/YY)"},
InputTestCase{"Expiration Date (MM - YY)"},
InputTestCase{"Expiration Date (MM-YY)"},
InputTestCase{"Expiration Date MM / YY"},
InputTestCase{"Expiration Date MM/YY"},
InputTestCase{"Expiration Date MM - YY"},
InputTestCase{"Expiration Date MM-YY"},
InputTestCase{"expiration date yy"},
InputTestCase{"Exp Date (MM / YY)"}));
class ExpirationDate2DigitYearNegative
: public testing::TestWithParam<InputTestCase> {};
TEST_P(ExpirationDate2DigitYearNegative, ExpirationDate2DigitYearRegexes) {
auto test_case = GetParam();
SCOPED_TRACE(test_case.input);
const base::string16 pattern = ASCIIToUTF16(kExpirationDate2DigitYearRe);
EXPECT_FALSE(MatchesPattern(ASCIIToUTF16(test_case.input), pattern));
}
INSTANTIATE_TEST_CASE_P(
AutofillRegexes,
ExpirationDate2DigitYearNegative,
testing::Values(InputTestCase{""},
InputTestCase{"Look, ma' -- an invalid string!"},
InputTestCase{"mmfavouritewordyy"},
InputTestCase{"mm a yy"},
InputTestCase{"mm a yyyy"},
// Simple four year cases
InputTestCase{"mm / yyyy"},
InputTestCase{"mm/ yyyy"},
InputTestCase{"mm /yyyy"},
InputTestCase{"mm/yyyy"},
InputTestCase{"mm - yyyy"},
InputTestCase{"mm- yyyy"},
InputTestCase{"mm -yyyy"},
InputTestCase{"mm-yyyy"},
InputTestCase{"mmyyyy"},
// Complex four year cases
InputTestCase{"Expiration Date (MM / YYYY)"},
InputTestCase{"Expiration Date (MM/YYYY)"},
InputTestCase{"Expiration Date (MM - YYYY)"},
InputTestCase{"Expiration Date (MM-YYYY)"},
InputTestCase{"Expiration Date MM / YYYY"},
InputTestCase{"Expiration Date MM/YYYY"},
InputTestCase{"Expiration Date MM - YYYY"},
InputTestCase{"Expiration Date MM-YYYY"},
InputTestCase{"expiration date yyyy"},
InputTestCase{"Exp Date (MM / YYYY)"}));
class ExpirationDate4DigitYearPositive
: public testing::TestWithParam<InputTestCase> {};
TEST_P(ExpirationDate4DigitYearPositive, ExpirationDate4DigitYearRegexes) {
auto test_case = GetParam();
const base::string16 pattern = ASCIIToUTF16(kExpirationDate4DigitYearRe);
SCOPED_TRACE(test_case.input);
EXPECT_TRUE(MatchesPattern(ASCIIToUTF16(test_case.input), pattern));
}
INSTANTIATE_TEST_CASE_P(AutofillRegexes,
ExpirationDate4DigitYearPositive,
testing::Values(
// Simple four year cases
InputTestCase{"mm / yyyy"},
InputTestCase{"mm/ yyyy"},
InputTestCase{"mm /yyyy"},
InputTestCase{"mm/yyyy"},
InputTestCase{"mm - yyyy"},
InputTestCase{"mm- yyyy"},
InputTestCase{"mm -yyyy"},
InputTestCase{"mm-yyyy"},
InputTestCase{"mmyyyy"},
// Complex four year cases
InputTestCase{"Expiration Date (MM / YYYY)"},
InputTestCase{"Expiration Date (MM/YYYY)"},
InputTestCase{"Expiration Date (MM - YYYY)"},
InputTestCase{"Expiration Date (MM-YYYY)"},
InputTestCase{"Expiration Date MM / YYYY"},
InputTestCase{"Expiration Date MM/YYYY"},
InputTestCase{"Expiration Date MM - YYYY"},
InputTestCase{"Expiration Date MM-YYYY"},
InputTestCase{"expiration date yyyy"},
InputTestCase{"Exp Date (MM / YYYY)"}));
class ExpirationDate4DigitYearNegative
: public testing::TestWithParam<InputTestCase> {};
TEST_P(ExpirationDate4DigitYearNegative, ExpirationDate4DigitYearRegexes) {
auto test_case = GetParam();
const base::string16 pattern = ASCIIToUTF16(kExpirationDate4DigitYearRe);
SCOPED_TRACE(test_case.input);
EXPECT_FALSE(MatchesPattern(ASCIIToUTF16(test_case.input), pattern));
}
INSTANTIATE_TEST_CASE_P(
AutofillRegexes,
ExpirationDate4DigitYearNegative,
testing::Values(InputTestCase{""},
InputTestCase{"Look, ma' -- an invalid string!"},
InputTestCase{"mmfavouritewordyy"},
InputTestCase{"mm a yy"},
InputTestCase{"mm a yyyy"},
// Simple two year cases
InputTestCase{"mm / yy"},
InputTestCase{"mm/ yy"},
InputTestCase{"mm /yy"},
InputTestCase{"mm/yy"},
InputTestCase{"mm - yy"},
InputTestCase{"mm- yy"},
InputTestCase{"mm -yy"},
InputTestCase{"mm-yy"},
InputTestCase{"mmyy"},
// Complex two year cases
InputTestCase{"Expiration Date (MM / YY)"},
InputTestCase{"Expiration Date (MM/YY)"},
InputTestCase{"Expiration Date (MM - YY)"},
InputTestCase{"Expiration Date (MM-YY)"},
InputTestCase{"Expiration Date MM / YY"},
InputTestCase{"Expiration Date MM/YY"},
InputTestCase{"Expiration Date MM - YY"},
InputTestCase{"Expiration Date MM-YY"},
InputTestCase{"expiration date yy"},
InputTestCase{"Exp Date (MM / YY)"}));
} // namespace autofill