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 using base::ASCIIToUTF16;
     15 
     16 namespace autofill {
     17 
     18 class CreditCardFieldTest : public testing::Test {
     19  public:
     20   CreditCardFieldTest() {}
     21   virtual ~CreditCardFieldTest() {}
     22 
     23  protected:
     24   ScopedVector<const AutofillField> list_;
     25   scoped_ptr<const CreditCardField> field_;
     26   ServerFieldTypeMap field_type_map_;
     27 
     28   // Parses the contents of |list_| as a form, and stores the result into
     29   // |field_|.
     30   void Parse() {
     31     AutofillScanner scanner(list_.get());
     32     field_.reset(
     33         static_cast<const CreditCardField*>(CreditCardField::Parse(&scanner)));
     34   }
     35 
     36   // Associates fields with their corresponding types, based on the previous
     37   // call to Parse().
     38   bool ClassifyField() {
     39     return field_->ClassifyField(&field_type_map_);
     40   }
     41 
     42  private:
     43   DISALLOW_COPY_AND_ASSIGN(CreditCardFieldTest);
     44 };
     45 
     46 TEST_F(CreditCardFieldTest, Empty) {
     47   Parse();
     48   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     49 }
     50 
     51 TEST_F(CreditCardFieldTest, NonParse) {
     52   list_.push_back(new AutofillField);
     53   Parse();
     54   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     55 }
     56 
     57 TEST_F(CreditCardFieldTest, ParseCreditCardNoNumber) {
     58   FormFieldData field;
     59   field.form_control_type = "text";
     60 
     61   field.label = ASCIIToUTF16("Exp Month");
     62   field.name = ASCIIToUTF16("ccmonth");
     63   list_.push_back(new AutofillField(field, ASCIIToUTF16("month1")));
     64 
     65   field.label = ASCIIToUTF16("Exp Year");
     66   field.name = ASCIIToUTF16("ccyear");
     67   list_.push_back(new AutofillField(field, ASCIIToUTF16("year2")));
     68 
     69   Parse();
     70   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     71 }
     72 
     73 TEST_F(CreditCardFieldTest, ParseCreditCardNoDate) {
     74   FormFieldData field;
     75   field.form_control_type = "text";
     76 
     77   field.label = ASCIIToUTF16("Card Number");
     78   field.name = ASCIIToUTF16("card_number");
     79   list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
     80 
     81   Parse();
     82   ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
     83 }
     84 
     85 TEST_F(CreditCardFieldTest, ParseMiniumCreditCard) {
     86   FormFieldData field;
     87   field.form_control_type = "text";
     88 
     89   field.label = ASCIIToUTF16("Card Number");
     90   field.name = ASCIIToUTF16("card_number");
     91   list_.push_back(new AutofillField(field, ASCIIToUTF16("number1")));
     92 
     93   field.label = ASCIIToUTF16("Exp Month");
     94   field.name = ASCIIToUTF16("ccmonth");
     95   list_.push_back(new AutofillField(field, ASCIIToUTF16("month2")));
     96 
     97   field.label = ASCIIToUTF16("Exp Year");
     98   field.name = ASCIIToUTF16("ccyear");
     99   list_.push_back(new AutofillField(field, ASCIIToUTF16("year3")));
    100 
    101   Parse();
    102   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    103   EXPECT_TRUE(ClassifyField());
    104   ASSERT_TRUE(
    105       field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end());
    106   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number1")]);
    107   ASSERT_TRUE(
    108       field_type_map_.find(ASCIIToUTF16("month2")) != field_type_map_.end());
    109   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month2")]);
    110   ASSERT_TRUE(
    111       field_type_map_.find(ASCIIToUTF16("year3")) != field_type_map_.end());
    112   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    113       field_type_map_[ASCIIToUTF16("year3")]);
    114 }
    115 
    116 TEST_F(CreditCardFieldTest, ParseFullCreditCard) {
    117   FormFieldData field;
    118   field.form_control_type = "text";
    119 
    120   field.label = ASCIIToUTF16("Card Type");
    121   field.name = ASCIIToUTF16("card_type");
    122   list_.push_back(new AutofillField(field, ASCIIToUTF16("type")));
    123 
    124   field.label = ASCIIToUTF16("Name on Card");
    125   field.name = ASCIIToUTF16("name_on_card");
    126   list_.push_back(new AutofillField(field, ASCIIToUTF16("name")));
    127 
    128   field.label = ASCIIToUTF16("Card Number");
    129   field.name = ASCIIToUTF16("card_number");
    130   list_.push_back(new AutofillField(field, ASCIIToUTF16("number")));
    131 
    132   field.label = ASCIIToUTF16("Exp Month");
    133   field.name = ASCIIToUTF16("ccmonth");
    134   list_.push_back(new AutofillField(field, ASCIIToUTF16("month")));
    135 
    136   field.label = ASCIIToUTF16("Exp Year");
    137   field.name = ASCIIToUTF16("ccyear");
    138   list_.push_back(new AutofillField(field, ASCIIToUTF16("year")));
    139 
    140   field.label = ASCIIToUTF16("Verification");
    141   field.name = ASCIIToUTF16("verification");
    142   list_.push_back(new AutofillField(field, ASCIIToUTF16("cvc")));
    143 
    144   Parse();
    145   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    146   EXPECT_TRUE(ClassifyField());
    147   ASSERT_TRUE(
    148       field_type_map_.find(ASCIIToUTF16("type")) != field_type_map_.end());
    149   EXPECT_EQ(CREDIT_CARD_TYPE, field_type_map_[ASCIIToUTF16("type")]);
    150   ASSERT_TRUE(
    151       field_type_map_.find(ASCIIToUTF16("name")) != field_type_map_.end());
    152   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name")]);
    153   ASSERT_TRUE(
    154       field_type_map_.find(ASCIIToUTF16("number")) != field_type_map_.end());
    155   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number")]);
    156   ASSERT_TRUE(
    157       field_type_map_.find(ASCIIToUTF16("month")) != field_type_map_.end());
    158   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month")]);
    159   ASSERT_TRUE(
    160       field_type_map_.find(ASCIIToUTF16("year")) != field_type_map_.end());
    161   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    162       field_type_map_[ASCIIToUTF16("year")]);
    163   ASSERT_TRUE(
    164       field_type_map_.find(ASCIIToUTF16("cvc")) != field_type_map_.end());
    165   EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
    166       field_type_map_[ASCIIToUTF16("cvc")]);
    167 }
    168 
    169 TEST_F(CreditCardFieldTest, ParseExpMonthYear) {
    170   FormFieldData field;
    171   field.form_control_type = "text";
    172 
    173   field.label = ASCIIToUTF16("Name on Card");
    174   field.name = ASCIIToUTF16("name_on_card");
    175   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    176 
    177   field.label = ASCIIToUTF16("Card Number");
    178   field.name = ASCIIToUTF16("card_number");
    179   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    180 
    181   field.label = ASCIIToUTF16("ExpDate Month / Year");
    182   field.name = ASCIIToUTF16("ExpDate");
    183   list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
    184 
    185   field.label = ASCIIToUTF16("ExpDate Month / Year");
    186   field.name = ASCIIToUTF16("ExpDate");
    187   list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
    188 
    189   Parse();
    190   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    191   EXPECT_TRUE(ClassifyField());
    192   ASSERT_TRUE(
    193       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    194   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    195   ASSERT_TRUE(
    196       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    197   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    198   ASSERT_TRUE(
    199       field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
    200   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
    201   ASSERT_TRUE(
    202       field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
    203   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    204       field_type_map_[ASCIIToUTF16("year4")]);
    205 }
    206 
    207 TEST_F(CreditCardFieldTest, ParseExpMonthYear2) {
    208   FormFieldData field;
    209   field.form_control_type = "text";
    210 
    211   field.label = ASCIIToUTF16("Name on Card");
    212   field.name = ASCIIToUTF16("name_on_card");
    213   list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
    214 
    215   field.label = ASCIIToUTF16("Card Number");
    216   field.name = ASCIIToUTF16("card_number");
    217   list_.push_back(new AutofillField(field, ASCIIToUTF16("number2")));
    218 
    219   field.label = ASCIIToUTF16("Expiration date Month / Year");
    220   field.name = ASCIIToUTF16("ExpDate");
    221   list_.push_back(new AutofillField(field, ASCIIToUTF16("month3")));
    222 
    223   field.label = ASCIIToUTF16("Expiration date Month / Year");
    224   field.name = ASCIIToUTF16("ExpDate");
    225   list_.push_back(new AutofillField(field, ASCIIToUTF16("year4")));
    226 
    227   Parse();
    228   ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get());
    229   EXPECT_TRUE(ClassifyField());
    230   ASSERT_TRUE(
    231       field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
    232   EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]);
    233   ASSERT_TRUE(
    234       field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end());
    235   EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]);
    236   ASSERT_TRUE(
    237       field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end());
    238   EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]);
    239   ASSERT_TRUE(
    240       field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end());
    241   EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    242       field_type_map_[ASCIIToUTF16("year4")]);
    243 }
    244 
    245 TEST_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 
    276 TEST_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 
    307 TEST_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.
    324 TEST_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 }  // namespace autofill
    351