credit_card_field_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch// found in the LICENSE file.
478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "base/memory/scoped_ptr.h"
678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "base/memory/scoped_vector.h"
778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "base/strings/utf_string_conversions.h"
878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "components/autofill/core/browser/autofill_field.h"
978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "components/autofill/core/browser/autofill_scanner.h"
1078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "components/autofill/core/browser/credit_card_field.h"
1178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "components/autofill/core/common/form_field_data.h"
1278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
1378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
1478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdochusing base::ASCIIToUTF16;
1578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
1678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdochnamespace autofill {
1778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
1878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdochclass CreditCardFieldTest : public testing::Test {
1978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch public:
2078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  CreditCardFieldTest() {}
2178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  virtual ~CreditCardFieldTest() {}
2278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
2378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch protected:
2478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ScopedVector<AutofillField> list_;
2578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  scoped_ptr<const CreditCardField> field_;
2678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ServerFieldTypeMap field_type_map_;
2778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
2878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  // Parses the contents of |list_| as a form, and stores the result into
2978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  // |field_|.
3078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  void Parse() {
3178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch    AutofillScanner scanner(list_.get());
3278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch    field_.reset(
3378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch        static_cast<const CreditCardField*>(CreditCardField::Parse(&scanner)));
3478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  }
3578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
3678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  // Associates fields with their corresponding types, based on the previous
3778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  // call to Parse().
3878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  bool ClassifyField() {
3978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch    return field_->ClassifyField(&field_type_map_);
4078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  }
4178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
4278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch private:
4378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(CreditCardFieldTest);
4478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch};
4578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
4678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, Empty) {
4778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
4878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
4978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
5078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
5178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, NonParse) {
5278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField);
5378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
5478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
5578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
5678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
5778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseCreditCardNoNumber) {
5878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
5978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
6078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
6178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Month");
6278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccmonth");
6378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("month1")));
6478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
6578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Year");
6678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccyear");
6778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("year2")));
6878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
6978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
7078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
7178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
7278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
7378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseCreditCardNoDate) {
7478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
7578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
7678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
7778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Number");
7878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_number");
7978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
8078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
8178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
8278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
8378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
8478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
8578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseMiniumCreditCard) {
8678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
8778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
8878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
8978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Number");
9078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_number");
9178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
9278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
9378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Month");
9478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccmonth");
9578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("month2")));
9678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
9778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Year");
9878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccyear");
9978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("year3")));
10078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
10178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
10278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
10378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_TRUE(ClassifyField());
10478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
10578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end());
10678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number1")]);
10778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
10878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("month2")) != field_type_map_.end());
10978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month2")]);
11078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
11178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("year3")) != field_type_map_.end());
11278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
11378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_[ASCIIToUTF16("year3")]);
11478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
11578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
11678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseFullCreditCard) {
11778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
11878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
11978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
12078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Type");
12178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_type");
12278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("type")));
12378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
12478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Name on Card");
12578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("name_on_card");
12678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("name")));
12778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
12878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Number");
12978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_number");
13078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("number")));
13178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
13278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Month");
13378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccmonth");
13478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("month")));
13578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
13678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Exp Year");
13778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ccyear");
13878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("year")));
13978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
14078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Verification");
14178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("verification");
14278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("cvc")));
14378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
14478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
14578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
14678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_TRUE(ClassifyField());
14778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
14878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("type")) != field_type_map_.end());
14978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_TYPE, field_type_map_[ASCIIToUTF16("type")]);
15078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
15178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("name")) != field_type_map_.end());
15278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name")]);
15378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
15478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("number")) != field_type_map_.end());
15578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number")]);
15678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
15778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("month")) != field_type_map_.end());
15878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month")]);
15978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
16078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("year")) != field_type_map_.end());
16178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
16278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_[ASCIIToUTF16("year")]);
16378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
16478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("cvc")) != field_type_map_.end());
16578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
16678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_[ASCIIToUTF16("cvc")]);
16778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
16878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
16978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseExpMonthYear) {
17078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
17178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
17278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
17378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Name on Card");
17478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("name_on_card");
17578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
17678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
17778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Number");
17878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_number");
17978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
18078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
18178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("ExpDate Month / Year");
18278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ExpDate");
18378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
18478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
18578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("ExpDate Month / Year");
18678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ExpDate");
18778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
18878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
18978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
19078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
19178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_TRUE(ClassifyField());
19278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
19378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
19478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
19578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
19678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
19778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
19878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
19978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
20078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
20178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
20278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
20378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
20478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_[ASCIIToUTF16("year4")]);
20578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
20678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
20778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben MurdochTEST_F(CreditCardFieldTest, ParseExpMonthYear2) {
20878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  FormFieldData field;
20978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.form_control_type = "text";
21078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
21178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Name on Card");
21278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("name_on_card");
21378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
21478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
21578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Card Number");
21678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("card_number");
21778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
21878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
21978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Expiration date Month / Year");
22078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ExpDate");
22178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
22278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
22378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.label = ASCIIToUTF16("Expiration date Month / Year");
22478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  field.name = ASCIIToUTF16("ExpDate");
22578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
22678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch
22778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  Parse();
22878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
22978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_TRUE(ClassifyField());
23078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
23178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
23278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
23378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
23478901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
23578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
23678901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
23778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
23878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
23978901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  ASSERT_TRUE(
24078901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
24178901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
24278901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch      field_type_map_[ASCIIToUTF16("year4")]);
24378901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch}
244
245TEST_F(CreditCardFieldTest, ParseExpField) {
246  FormFieldData field;
247  field.form_control_type = "text";
248
249  field.label = ASCIIToUTF16("Name on Card");
250  field.name = ASCIIToUTF16("name_on_card");
251  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
252
253  field.label = ASCIIToUTF16("Card Number");
254  field.name = ASCIIToUTF16("card_number");
255  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
256
257  field.label = ASCIIToUTF16("Expiration Date (MM/YYYY)");
258  field.name = ASCIIToUTF16("cc_exp");
259  list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3")));
260
261  Parse();
262  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
263  EXPECT_TRUE(ClassifyField());
264  ASSERT_TRUE(
265      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
266  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
267  ASSERT_TRUE(
268      field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
269  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
270  ASSERT_TRUE(
271      field_type_map_.find(ASCIIToUTF16("exp3")) != field_type_map_.end());
272  EXPECT_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
273            field_type_map_[ASCIIToUTF16("exp3")]);
274}
275
276TEST_F(CreditCardFieldTest, ParseExpField2DigitYear) {
277  FormFieldData field;
278  field.form_control_type = "text";
279
280  field.label = ASCIIToUTF16("Name on Card");
281  field.name = ASCIIToUTF16("name_on_card");
282  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
283
284  field.label = ASCIIToUTF16("Card Number");
285  field.name = ASCIIToUTF16("card_number");
286  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
287
288  field.label = ASCIIToUTF16("Expiration Date (MM/YY)");
289  field.name = ASCIIToUTF16("cc_exp");
290  list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3")));
291
292  Parse();
293  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
294  EXPECT_TRUE(ClassifyField());
295  ASSERT_TRUE(
296      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
297  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
298  ASSERT_TRUE(
299      field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
300  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
301  ASSERT_TRUE(
302      field_type_map_.find(ASCIIToUTF16("exp3")) != field_type_map_.end());
303  EXPECT_EQ(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
304            field_type_map_[ASCIIToUTF16("exp3")]);
305}
306
307TEST_F(CreditCardFieldTest, ParseCreditCardHolderNameWithCCFullName) {
308  FormFieldData field;
309  field.form_control_type = "text";
310
311  field.label = ASCIIToUTF16("Name");
312  field.name = ASCIIToUTF16("ccfullname");
313  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
314
315  Parse();
316  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
317  EXPECT_TRUE(ClassifyField());
318  ASSERT_TRUE(
319      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
320  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
321}
322
323// Verifies that <input type="month"> controls are able to be parsed correctly.
324TEST_F(CreditCardFieldTest, ParseMonthControl) {
325  FormFieldData field;
326
327  field.form_control_type = "text";
328  field.label = ASCIIToUTF16("Card number:");
329  field.name = ASCIIToUTF16("ccnumber");
330  list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
331
332  field.form_control_type = "month";
333  field.label = ASCIIToUTF16("Expiration date:");
334  field.name = ASCIIToUTF16("ccexp");
335  list_.push_back(new AutofillField(field, ASCIIToUTF16("date2")));
336
337  Parse();
338  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
339  EXPECT_TRUE(ClassifyField());
340  ASSERT_TRUE(
341      field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end());
342  EXPECT_EQ(CREDIT_CARD_NUMBER,
343            field_type_map_[ASCIIToUTF16("number1")]);
344  ASSERT_TRUE(
345      field_type_map_.find(ASCIIToUTF16("date2")) != field_type_map_.end());
346  EXPECT_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
347            field_type_map_[ASCIIToUTF16("date2")]);
348}
349
350// Verify that heuristics <input name="ccyear" maxlength="2"/> considers
351// *maxlength* attribute while parsing 2 Digit expiration year.
352TEST_F(CreditCardFieldTest, ParseCreditCardExpYear_2DigitMaxLength) {
353  FormFieldData field;
354  field.form_control_type = "text";
355
356  field.label = ASCIIToUTF16("Card Number");
357  field.name = ASCIIToUTF16("card_number");
358  list_.push_back(new AutofillField(field, ASCIIToUTF16("number")));
359
360  field.label = ASCIIToUTF16("Expiration Date");
361  field.name = ASCIIToUTF16("ccmonth");
362  list_.push_back(new AutofillField(field, ASCIIToUTF16("month")));
363
364  field.name = ASCIIToUTF16("ccyear");
365  field.max_length = 2;
366  list_.push_back(new AutofillField(field, ASCIIToUTF16("year")));
367
368  Parse();
369  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
370  EXPECT_TRUE(ClassifyField());
371  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number")) !=
372              field_type_map_.end());
373  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number")]);
374  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("month")) !=
375              field_type_map_.end());
376  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month")]);
377  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("year")) !=
378              field_type_map_.end());
379  EXPECT_EQ(CREDIT_CARD_EXP_2_DIGIT_YEAR,
380            field_type_map_[ASCIIToUTF16("year")]);
381}
382
383TEST_F(CreditCardFieldTest, ParseCreditCardNumberWithSplit) {
384  FormFieldData field;
385  field.form_control_type = "text";
386
387  field.label = ASCIIToUTF16("Card Number");
388  field.name = ASCIIToUTF16("card_number_q1");
389  field.max_length = 4;
390  list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
391
392  field.label = ASCIIToUTF16("Card Number");
393  field.name = ASCIIToUTF16("card_number_q2");
394  field.max_length = 4;
395  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
396
397  field.label = ASCIIToUTF16("Card Number");
398  field.name = ASCIIToUTF16("card_number_q3");
399  field.max_length = 4;
400  list_.push_back(new AutofillField(field, ASCIIToUTF16("number3")));
401
402  // For last credit card number input field it simply ignores the |max_length|
403  // attribute. So even having a very big number, does not conside it an invalid
404  // split for autofilling.
405  field.label = ASCIIToUTF16("Card Number");
406  field.name = ASCIIToUTF16("card_number_q4");
407  field.max_length = 20;
408  list_.push_back(new AutofillField(field, ASCIIToUTF16("number4")));
409
410  field.label = ASCIIToUTF16("Exp Month");
411  field.name = ASCIIToUTF16("ccmonth");
412  list_.push_back(new AutofillField(field, ASCIIToUTF16("month5")));
413
414  field.label = ASCIIToUTF16("Exp Year");
415  field.name = ASCIIToUTF16("ccyear");
416  list_.push_back(new AutofillField(field, ASCIIToUTF16("year6")));
417
418  Parse();
419  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
420  EXPECT_TRUE(ClassifyField());
421
422  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number1")) !=
423              field_type_map_.end());
424  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number1")]);
425  EXPECT_EQ(0U, list_[0]->credit_card_number_offset());
426
427  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number2")) !=
428              field_type_map_.end());
429  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
430  EXPECT_EQ(4U, list_[1]->credit_card_number_offset());
431
432  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number3")) !=
433              field_type_map_.end());
434  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number3")]);
435  EXPECT_EQ(8U, list_[2]->credit_card_number_offset());
436
437  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number4")) !=
438              field_type_map_.end());
439  EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number4")]);
440  EXPECT_EQ(12U, list_[3]->credit_card_number_offset());
441
442  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("month5")) !=
443              field_type_map_.end());
444  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month5")]);
445  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("year6")) !=
446              field_type_map_.end());
447  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
448            field_type_map_[ASCIIToUTF16("year6")]);
449}
450
451TEST_F(CreditCardFieldTest, ParseCreditCardNumberWithInvalidSplit) {
452  FormFieldData field;
453  field.form_control_type = "text";
454
455  field.label = ASCIIToUTF16("Name on Card");
456  field.name = ASCIIToUTF16("name_on_card");
457  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
458
459  field.label = ASCIIToUTF16("Card Number");
460  field.name = ASCIIToUTF16("card_number");
461  list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
462
463  field.label = ASCIIToUTF16("Not Card Number");
464  field.name = ASCIIToUTF16("not_card_number");
465  list_.push_back(new AutofillField(field, ASCIIToUTF16("number3")));
466
467  field.label = ASCIIToUTF16("Exp Month");
468  field.name = ASCIIToUTF16("ccmonth");
469  list_.push_back(new AutofillField(field, ASCIIToUTF16("month4")));
470
471  field.label = ASCIIToUTF16("Exp Year");
472  field.name = ASCIIToUTF16("ccyear");
473  list_.push_back(new AutofillField(field, ASCIIToUTF16("year5")));
474
475  Parse();
476  ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
477  EXPECT_TRUE(ClassifyField());
478
479  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("name1")) !=
480              field_type_map_.end());
481  EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
482  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number2")) ==
483              field_type_map_.end());
484  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("number3")) ==
485              field_type_map_.end());
486  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("month4")) !=
487              field_type_map_.end());
488  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month4")]);
489  ASSERT_TRUE(field_type_map_.find(ASCIIToUTF16("year5")) !=
490              field_type_map_.end());
491  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
492            field_type_map_[ASCIIToUTF16("year5")]);
493}
494
495}  // namespace autofill
496