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