credit_card_field_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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 14namespace autofill { 15 16class CreditCardFieldTest : public testing::Test { 17 public: 18 CreditCardFieldTest() {} 19 virtual ~CreditCardFieldTest() {} 20 21 protected: 22 ScopedVector<const AutofillField> list_; 23 scoped_ptr<const CreditCardField> field_; 24 ServerFieldTypeMap field_type_map_; 25 26 // Parses the contents of |list_| as a form, and stores the result into 27 // |field_|. 28 void Parse() { 29 AutofillScanner scanner(list_.get()); 30 field_.reset( 31 static_cast<const CreditCardField*>(CreditCardField::Parse(&scanner))); 32 } 33 34 // Associates fields with their corresponding types, based on the previous 35 // call to Parse(). 36 bool ClassifyField() { 37 return field_->ClassifyField(&field_type_map_); 38 } 39 40 private: 41 DISALLOW_COPY_AND_ASSIGN(CreditCardFieldTest); 42}; 43 44TEST_F(CreditCardFieldTest, Empty) { 45 Parse(); 46 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 47} 48 49TEST_F(CreditCardFieldTest, NonParse) { 50 list_.push_back(new AutofillField); 51 Parse(); 52 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 53} 54 55TEST_F(CreditCardFieldTest, ParseCreditCardNoNumber) { 56 FormFieldData field; 57 field.form_control_type = "text"; 58 59 field.label = ASCIIToUTF16("Exp Month"); 60 field.name = ASCIIToUTF16("ccmonth"); 61 list_.push_back(new AutofillField(field, ASCIIToUTF16("month1"))); 62 63 field.label = ASCIIToUTF16("Exp Year"); 64 field.name = ASCIIToUTF16("ccyear"); 65 list_.push_back(new AutofillField(field, ASCIIToUTF16("year2"))); 66 67 Parse(); 68 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 69} 70 71TEST_F(CreditCardFieldTest, ParseCreditCardNoDate) { 72 FormFieldData field; 73 field.form_control_type = "text"; 74 75 field.label = ASCIIToUTF16("Card Number"); 76 field.name = ASCIIToUTF16("card_number"); 77 list_.push_back(new AutofillField(field, ASCIIToUTF16("number1"))); 78 79 Parse(); 80 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get()); 81} 82 83TEST_F(CreditCardFieldTest, ParseMiniumCreditCard) { 84 FormFieldData field; 85 field.form_control_type = "text"; 86 87 field.label = ASCIIToUTF16("Card Number"); 88 field.name = ASCIIToUTF16("card_number"); 89 list_.push_back(new AutofillField(field, ASCIIToUTF16("number1"))); 90 91 field.label = ASCIIToUTF16("Exp Month"); 92 field.name = ASCIIToUTF16("ccmonth"); 93 list_.push_back(new AutofillField(field, ASCIIToUTF16("month2"))); 94 95 field.label = ASCIIToUTF16("Exp Year"); 96 field.name = ASCIIToUTF16("ccyear"); 97 list_.push_back(new AutofillField(field, ASCIIToUTF16("year3"))); 98 99 Parse(); 100 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 101 EXPECT_TRUE(ClassifyField()); 102 ASSERT_TRUE( 103 field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end()); 104 EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number1")]); 105 ASSERT_TRUE( 106 field_type_map_.find(ASCIIToUTF16("month2")) != field_type_map_.end()); 107 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month2")]); 108 ASSERT_TRUE( 109 field_type_map_.find(ASCIIToUTF16("year3")) != field_type_map_.end()); 110 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, 111 field_type_map_[ASCIIToUTF16("year3")]); 112} 113 114TEST_F(CreditCardFieldTest, ParseFullCreditCard) { 115 FormFieldData field; 116 field.form_control_type = "text"; 117 118 field.label = ASCIIToUTF16("Card Type"); 119 field.name = ASCIIToUTF16("card_type"); 120 list_.push_back(new AutofillField(field, ASCIIToUTF16("type"))); 121 122 field.label = ASCIIToUTF16("Name on Card"); 123 field.name = ASCIIToUTF16("name_on_card"); 124 list_.push_back(new AutofillField(field, ASCIIToUTF16("name"))); 125 126 field.label = ASCIIToUTF16("Card Number"); 127 field.name = ASCIIToUTF16("card_number"); 128 list_.push_back(new AutofillField(field, ASCIIToUTF16("number"))); 129 130 field.label = ASCIIToUTF16("Exp Month"); 131 field.name = ASCIIToUTF16("ccmonth"); 132 list_.push_back(new AutofillField(field, ASCIIToUTF16("month"))); 133 134 field.label = ASCIIToUTF16("Exp Year"); 135 field.name = ASCIIToUTF16("ccyear"); 136 list_.push_back(new AutofillField(field, ASCIIToUTF16("year"))); 137 138 field.label = ASCIIToUTF16("Verification"); 139 field.name = ASCIIToUTF16("verification"); 140 list_.push_back(new AutofillField(field, ASCIIToUTF16("cvc"))); 141 142 Parse(); 143 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 144 EXPECT_TRUE(ClassifyField()); 145 ASSERT_TRUE( 146 field_type_map_.find(ASCIIToUTF16("type")) != field_type_map_.end()); 147 EXPECT_EQ(CREDIT_CARD_TYPE, field_type_map_[ASCIIToUTF16("type")]); 148 ASSERT_TRUE( 149 field_type_map_.find(ASCIIToUTF16("name")) != field_type_map_.end()); 150 EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name")]); 151 ASSERT_TRUE( 152 field_type_map_.find(ASCIIToUTF16("number")) != field_type_map_.end()); 153 EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number")]); 154 ASSERT_TRUE( 155 field_type_map_.find(ASCIIToUTF16("month")) != field_type_map_.end()); 156 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month")]); 157 ASSERT_TRUE( 158 field_type_map_.find(ASCIIToUTF16("year")) != field_type_map_.end()); 159 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, 160 field_type_map_[ASCIIToUTF16("year")]); 161 ASSERT_TRUE( 162 field_type_map_.find(ASCIIToUTF16("cvc")) != field_type_map_.end()); 163 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, 164 field_type_map_[ASCIIToUTF16("cvc")]); 165} 166 167TEST_F(CreditCardFieldTest, ParseExpMonthYear) { 168 FormFieldData field; 169 field.form_control_type = "text"; 170 171 field.label = ASCIIToUTF16("Name on Card"); 172 field.name = ASCIIToUTF16("name_on_card"); 173 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1"))); 174 175 field.label = ASCIIToUTF16("Card Number"); 176 field.name = ASCIIToUTF16("card_number"); 177 list_.push_back(new AutofillField(field, ASCIIToUTF16("number2"))); 178 179 field.label = ASCIIToUTF16("ExpDate Month / Year"); 180 field.name = ASCIIToUTF16("ExpDate"); 181 list_.push_back(new AutofillField(field, ASCIIToUTF16("month3"))); 182 183 field.label = ASCIIToUTF16("ExpDate Month / Year"); 184 field.name = ASCIIToUTF16("ExpDate"); 185 list_.push_back(new AutofillField(field, ASCIIToUTF16("year4"))); 186 187 Parse(); 188 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 189 EXPECT_TRUE(ClassifyField()); 190 ASSERT_TRUE( 191 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end()); 192 EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]); 193 ASSERT_TRUE( 194 field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end()); 195 EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]); 196 ASSERT_TRUE( 197 field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end()); 198 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]); 199 ASSERT_TRUE( 200 field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end()); 201 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, 202 field_type_map_[ASCIIToUTF16("year4")]); 203} 204 205TEST_F(CreditCardFieldTest, ParseExpMonthYear2) { 206 FormFieldData field; 207 field.form_control_type = "text"; 208 209 field.label = ASCIIToUTF16("Name on Card"); 210 field.name = ASCIIToUTF16("name_on_card"); 211 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1"))); 212 213 field.label = ASCIIToUTF16("Card Number"); 214 field.name = ASCIIToUTF16("card_number"); 215 list_.push_back(new AutofillField(field, ASCIIToUTF16("number2"))); 216 217 field.label = ASCIIToUTF16("Expiration date Month / Year"); 218 field.name = ASCIIToUTF16("ExpDate"); 219 list_.push_back(new AutofillField(field, ASCIIToUTF16("month3"))); 220 221 field.label = ASCIIToUTF16("Expiration date Month / Year"); 222 field.name = ASCIIToUTF16("ExpDate"); 223 list_.push_back(new AutofillField(field, ASCIIToUTF16("year4"))); 224 225 Parse(); 226 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 227 EXPECT_TRUE(ClassifyField()); 228 ASSERT_TRUE( 229 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end()); 230 EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]); 231 ASSERT_TRUE( 232 field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end()); 233 EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]); 234 ASSERT_TRUE( 235 field_type_map_.find(ASCIIToUTF16("month3")) != field_type_map_.end()); 236 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, field_type_map_[ASCIIToUTF16("month3")]); 237 ASSERT_TRUE( 238 field_type_map_.find(ASCIIToUTF16("year4")) != field_type_map_.end()); 239 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, 240 field_type_map_[ASCIIToUTF16("year4")]); 241} 242 243TEST_F(CreditCardFieldTest, ParseExpField) { 244 FormFieldData field; 245 field.form_control_type = "text"; 246 247 field.label = ASCIIToUTF16("Name on Card"); 248 field.name = ASCIIToUTF16("name_on_card"); 249 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1"))); 250 251 field.label = ASCIIToUTF16("Card Number"); 252 field.name = ASCIIToUTF16("card_number"); 253 list_.push_back(new AutofillField(field, ASCIIToUTF16("number2"))); 254 255 field.label = ASCIIToUTF16("Expiration Date (MM/YYYY)"); 256 field.name = ASCIIToUTF16("cc_exp"); 257 list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3"))); 258 259 Parse(); 260 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 261 EXPECT_TRUE(ClassifyField()); 262 ASSERT_TRUE( 263 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end()); 264 EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]); 265 ASSERT_TRUE( 266 field_type_map_.find(ASCIIToUTF16("number2")) != field_type_map_.end()); 267 EXPECT_EQ(CREDIT_CARD_NUMBER, field_type_map_[ASCIIToUTF16("number2")]); 268 ASSERT_TRUE( 269 field_type_map_.find(ASCIIToUTF16("exp3")) != field_type_map_.end()); 270 EXPECT_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, 271 field_type_map_[ASCIIToUTF16("exp3")]); 272} 273 274TEST_F(CreditCardFieldTest, ParseExpField2DigitYear) { 275 FormFieldData field; 276 field.form_control_type = "text"; 277 278 field.label = ASCIIToUTF16("Name on Card"); 279 field.name = ASCIIToUTF16("name_on_card"); 280 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1"))); 281 282 field.label = ASCIIToUTF16("Card Number"); 283 field.name = ASCIIToUTF16("card_number"); 284 list_.push_back(new AutofillField(field, ASCIIToUTF16("number2"))); 285 286 field.label = ASCIIToUTF16("Expiration Date (MM/YY)"); 287 field.name = ASCIIToUTF16("cc_exp"); 288 list_.push_back(new AutofillField(field, ASCIIToUTF16("exp3"))); 289 290 Parse(); 291 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 292 EXPECT_TRUE(ClassifyField()); 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 305TEST_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 Parse(); 314 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 315 EXPECT_TRUE(ClassifyField()); 316 ASSERT_TRUE( 317 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end()); 318 EXPECT_EQ(CREDIT_CARD_NAME, field_type_map_[ASCIIToUTF16("name1")]); 319} 320 321// Verifies that <input type="month"> controls are able to be parsed correctly. 322TEST_F(CreditCardFieldTest, ParseMonthControl) { 323 FormFieldData field; 324 325 field.form_control_type = "text"; 326 field.label = ASCIIToUTF16("Card number:"); 327 field.name = ASCIIToUTF16("ccnumber"); 328 list_.push_back(new AutofillField(field, ASCIIToUTF16("number1"))); 329 330 field.form_control_type = "month"; 331 field.label = ASCIIToUTF16("Expiration date:"); 332 field.name = ASCIIToUTF16("ccexp"); 333 list_.push_back(new AutofillField(field, ASCIIToUTF16("date2"))); 334 335 Parse(); 336 ASSERT_NE(static_cast<CreditCardField*>(NULL), field_.get()); 337 EXPECT_TRUE(ClassifyField()); 338 ASSERT_TRUE( 339 field_type_map_.find(ASCIIToUTF16("number1")) != field_type_map_.end()); 340 EXPECT_EQ(CREDIT_CARD_NUMBER, 341 field_type_map_[ASCIIToUTF16("number1")]); 342 ASSERT_TRUE( 343 field_type_map_.find(ASCIIToUTF16("date2")) != field_type_map_.end()); 344 EXPECT_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, 345 field_type_map_[ASCIIToUTF16("date2")]); 346} 347 348} // namespace autofill 349