credit_card_field_unittest.cc revision 3240926e260ce088908e02ac07a6cf7b0c0cbf44
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
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
34TEST_F(CreditCardFieldTest, Empty) {
35  AutofillScanner scanner(list_.get());
36  field_.reset(Parse(&scanner));
37  ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
38}
39
40TEST_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
47TEST_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
64TEST_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
77TEST_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
109TEST_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
163TEST_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
202TEST_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
241TEST_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
273TEST_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
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  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