credit_card_field_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 14using base::ASCIIToUTF16; 15 16namespace autofill { 17 18class 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 46TEST_F(CreditCardFieldTest, Empty) { 47 Parse(); 48 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 49} 50 51TEST_F(CreditCardFieldTest, NonParse) { 52 list_.push_back(new AutofillField); 53 Parse(); 54 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 55} 56 57TEST_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 73TEST_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 85TEST_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 116TEST_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 169TEST_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 207TEST_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 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} // namespace autofill 351