Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/memory/scoped_ptr.h"
      6 #include "base/memory/scoped_vector.h"
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "components/autofill/core/browser/autofill_field.h"
      9 #include "components/autofill/core/browser/autofill_scanner.h"
     10 #include "components/autofill/core/browser/credit_card_field.h"
     11 #include "components/autofill/core/common/form_field_data.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace autofill {
     15 
     16 class CreditCardFieldTest : public testing::Test {
     17  public:
     18   CreditCardFieldTest() {}
     19 
     20  protected:
     21   ScopedVector<const AutofillField> list_;
     22   scoped_ptr<CreditCardField> field_;
     23   ServerFieldTypeMap field_type_map_;
     24 
     25   // Downcast for tests.
     26   static CreditCardField* Parse(AutofillScanner* scanner) {
     27     return static_cast<CreditCardField*>(CreditCardField::Parse(scanner));
     28   }
     29 
     30  private:
     31   DISALLOW_COPY_AND_ASSIGN(CreditCardFieldTest);
     32 };
     33 
     34 TEST_F(CreditCardFieldTest, Empty) {
     35   AutofillScanner scanner(list_.get());
     36   field_.reset(Parse(&scanner));
     37   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     38 }
     39 
     40 TEST_F(CreditCardFieldTest, NonParse) {
     41   list_.push_back(new AutofillField);
     42   AutofillScanner scanner(list_.get());
     43   field_.reset(Parse(&scanner));
     44   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     45 }
     46 
     47 TEST_F(CreditCardFieldTest, ParseCreditCardNoNumber) {
     48   FormFieldData field;
     49   field.form_control_type = "text";
     50 
     51   field.label = ASCIIToUTF16("Exp Month");
     52   field.name = ASCIIToUTF16("ccmonth");
     53   list_.push_back(new AutofillField(field, ASCIIToUTF16("month1")));
     54 
     55   field.label = ASCIIToUTF16("Exp Year");
     56   field.name = ASCIIToUTF16("ccyear");
     57   list_.push_back(new AutofillField(field, ASCIIToUTF16("year2")));
     58 
     59   AutofillScanner scanner(list_.get());
     60   field_.reset(Parse(&scanner));
     61   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     62 }
     63 
     64 TEST_F(CreditCardFieldTest, ParseCreditCardNoDate) {
     65   FormFieldData field;
     66   field.form_control_type = "text";
     67 
     68   field.label = ASCIIToUTF16("Card Number");
     69   field.name = ASCIIToUTF16("card_number");
     70   list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
     71 
     72   AutofillScanner scanner(list_.get());
     73   field_.reset(Parse(&scanner));
     74   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     75 }
     76 
     77 TEST_F(CreditCardFieldTest, ParseMiniumCreditCard) {
     78   FormFieldData field;
     79   field.form_control_type = "text";
     80 
     81   field.label = ASCIIToUTF16("Card Number");
     82   field.name = ASCIIToUTF16("card_number");
     83   list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
     84 
     85   field.label = ASCIIToUTF16("Exp Month");
     86   field.name = ASCIIToUTF16("ccmonth");
     87   list_.push_back(new AutofillField(field, ASCIIToUTF16("month2")));
     88 
     89   field.label = ASCIIToUTF16("Exp Year");
     90   field.name = ASCIIToUTF16("ccyear");
     91   list_.push_back(new AutofillField(field, ASCIIToUTF16("year3")));
     92 
     93   AutofillScanner scanner(list_.get());
     94   field_.reset(Parse(&scanner));
     95   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
     96   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
     97   ASSERT_TRUE(
     98       field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end());
     99   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number1")]);
    100   ASSERT_TRUE(
    101       field_type_map_.find(ASCIIToUTF16("month2")) != field_type_map_.end());
    102   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month2")]);
    103   ASSERT_TRUE(
    104       field_type_map_.find(ASCIIToUTF16("year3")) != field_type_map_.end());
    105   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    106       field_type_map_[ASCIIToUTF16("year3")]);
    107 }
    108 
    109 TEST_F(CreditCardFieldTest, ParseFullCreditCard) {
    110   FormFieldData field;
    111   field.form_control_type = "text";
    112 
    113   field.label = ASCIIToUTF16("Card Type");
    114   field.name = ASCIIToUTF16("card_type");
    115   list_.push_back(new AutofillField(field, ASCIIToUTF16("type")));
    116 
    117   field.label = ASCIIToUTF16("Name on Card");
    118   field.name = ASCIIToUTF16("name_on_card");
    119   list_.push_back(new AutofillField(field, ASCIIToUTF16("name")));
    120 
    121   field.label = ASCIIToUTF16("Card Number");
    122   field.name = ASCIIToUTF16("card_number");
    123   list_.push_back(new AutofillField(field, ASCIIToUTF16("number")));
    124 
    125   field.label = ASCIIToUTF16("Exp Month");
    126   field.name = ASCIIToUTF16("ccmonth");
    127   list_.push_back(new AutofillField(field, ASCIIToUTF16("month")));
    128 
    129   field.label = ASCIIToUTF16("Exp Year");
    130   field.name = ASCIIToUTF16("ccyear");
    131   list_.push_back(new AutofillField(field, ASCIIToUTF16("year")));
    132 
    133   field.label = ASCIIToUTF16("Verification");
    134   field.name = ASCIIToUTF16("verification");
    135   list_.push_back(new AutofillField(field, ASCIIToUTF16("cvc")));
    136 
    137   AutofillScanner scanner(list_.get());
    138   field_.reset(Parse(&scanner));
    139   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    140   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    141   ASSERT_TRUE(
    142       field_type_map_.find(ASCIIToUTF16("type")) != field_type_map_.end());
    143   EXPECT_EQ(CREDIT_CARD_TYPE, field_type_map_[ASCIIToUTF16("type")]);
    144   ASSERT_TRUE(
    145       field_type_map_.find(ASCIIToUTF16("name")) != field_type_map_.end());
    146   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name")]);
    147   ASSERT_TRUE(
    148       field_type_map_.find(ASCIIToUTF16("number")) != field_type_map_.end());
    149   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number")]);
    150   ASSERT_TRUE(
    151       field_type_map_.find(ASCIIToUTF16("month")) != field_type_map_.end());
    152   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month")]);
    153   ASSERT_TRUE(
    154       field_type_map_.find(ASCIIToUTF16("year")) != field_type_map_.end());
    155   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    156       field_type_map_[ASCIIToUTF16("year")]);
    157   ASSERT_TRUE(
    158       field_type_map_.find(ASCIIToUTF16("cvc")) != field_type_map_.end());
    159   EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
    160       field_type_map_[ASCIIToUTF16("cvc")]);
    161 }
    162 
    163 TEST_F(CreditCardFieldTest, ParseExpMonthYear) {
    164   FormFieldData field;
    165   field.form_control_type = "text";
    166 
    167   field.label = ASCIIToUTF16("Name on Card");
    168   field.name = ASCIIToUTF16("name_on_card");
    169   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    170 
    171   field.label = ASCIIToUTF16("Card Number");
    172   field.name = ASCIIToUTF16("card_number");
    173   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    174 
    175   field.label = ASCIIToUTF16("ExpDate Month / Year");
    176   field.name = ASCIIToUTF16("ExpDate");
    177   list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
    178 
    179   field.label = ASCIIToUTF16("ExpDate Month / Year");
    180   field.name = ASCIIToUTF16("ExpDate");
    181   list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
    182 
    183   AutofillScanner scanner(list_.get());
    184   field_.reset(Parse(&scanner));
    185   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    186   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    187   ASSERT_TRUE(
    188       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    189   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    190   ASSERT_TRUE(
    191       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    192   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    193   ASSERT_TRUE(
    194       field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
    195   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
    196   ASSERT_TRUE(
    197       field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
    198   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    199       field_type_map_[ASCIIToUTF16("year4")]);
    200 }
    201 
    202 TEST_F(CreditCardFieldTest, ParseExpMonthYear2) {
    203   FormFieldData field;
    204   field.form_control_type = "text";
    205 
    206   field.label = ASCIIToUTF16("Name on Card");
    207   field.name = ASCIIToUTF16("name_on_card");
    208   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    209 
    210   field.label = ASCIIToUTF16("Card Number");
    211   field.name = ASCIIToUTF16("card_number");
    212   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    213 
    214   field.label = ASCIIToUTF16("Expiration date Month / Year");
    215   field.name = ASCIIToUTF16("ExpDate");
    216   list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
    217 
    218   field.label = ASCIIToUTF16("Expiration date Month / Year");
    219   field.name = ASCIIToUTF16("ExpDate");
    220   list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
    221 
    222   AutofillScanner scanner(list_.get());
    223   field_.reset(Parse(&scanner));
    224   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    225   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    226   ASSERT_TRUE(
    227       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    228   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    229   ASSERT_TRUE(
    230       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    231   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    232   ASSERT_TRUE(
    233       field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
    234   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
    235   ASSERT_TRUE(
    236       field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
    237   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    238       field_type_map_[ASCIIToUTF16("year4")]);
    239 }
    240 
    241 TEST_F(CreditCardFieldTest, ParseExpField) {
    242   FormFieldData field;
    243   field.form_control_type = "text";
    244 
    245   field.label = ASCIIToUTF16("Name on Card");
    246   field.name = ASCIIToUTF16("name_on_card");
    247   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    248 
    249   field.label = ASCIIToUTF16("Card Number");
    250   field.name = ASCIIToUTF16("card_number");
    251   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    252 
    253   field.label = ASCIIToUTF16("Expiration Date (MM/YYYY)");
    254   field.name = ASCIIToUTF16("cc_exp");
    255   list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3")));
    256 
    257   AutofillScanner scanner(list_.get());
    258   field_.reset(Parse(&scanner));
    259   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    260   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    261   ASSERT_TRUE(
    262       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    263   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    264   ASSERT_TRUE(
    265       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    266   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    267   ASSERT_TRUE(
    268       field_type_map_.find(ASCIIToUTF16("exp3")) != field_type_map_.end());
    269   EXPECT_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
    270             field_type_map_[ASCIIToUTF16("exp3")]);
    271 }
    272 
    273 TEST_F(CreditCardFieldTest, ParseExpField2DigitYear) {
    274   FormFieldData field;
    275   field.form_control_type = "text";
    276 
    277   field.label = ASCIIToUTF16("Name on Card");
    278   field.name = ASCIIToUTF16("name_on_card");
    279   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    280 
    281   field.label = ASCIIToUTF16("Card Number");
    282   field.name = ASCIIToUTF16("card_number");
    283   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    284 
    285   field.label = ASCIIToUTF16("Expiration Date (MM/YY)");
    286   field.name = ASCIIToUTF16("cc_exp");
    287   list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3")));
    288 
    289   AutofillScanner scanner(list_.get());
    290   field_.reset(Parse(&scanner));
    291   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    292   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    293   ASSERT_TRUE(
    294       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    295   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    296   ASSERT_TRUE(
    297       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    298   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    299   ASSERT_TRUE(
    300       field_type_map_.find(ASCIIToUTF16("exp3")) != field_type_map_.end());
    301   EXPECT_EQ(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
    302             field_type_map_[ASCIIToUTF16("exp3")]);
    303 }
    304 
    305 TEST_F(CreditCardFieldTest, ParseCreditCardHolderNameWithCCFullName) {
    306   FormFieldData field;
    307   field.form_control_type = "text";
    308 
    309   field.label = ASCIIToUTF16("Name");
    310   field.name = ASCIIToUTF16("ccfullname");
    311   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    312 
    313   AutofillScanner scanner(list_.get());
    314   field_.reset(Parse(&scanner));
    315   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    316   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    317   ASSERT_TRUE(
    318       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    319   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    320 }
    321 
    322 }  // namespace autofill
    323