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:
CreditCardFieldTest()20 CreditCardFieldTest() {}
~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_|.
Parse()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().
ClassifyField()38 bool ClassifyField() {
39 return field_->ClassifyField(&field_type_map_);
40 }
41
42 private:
43 DISALLOW_COPY_AND_ASSIGN(CreditCardFieldTest);
44 };
45
TEST_F(CreditCardFieldTest,Empty)46 TEST_F(CreditCardFieldTest, Empty) {
47 Parse();
48 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
49 }
50
TEST_F(CreditCardFieldTest,NonParse)51 TEST_F(CreditCardFieldTest, NonParse) {
52 list_.push_back(new AutofillField);
53 Parse();
54 ASSERT_EQ(static_cast<CreditCardField*>(NULL), field_.get());
55 }
56
TEST_F(CreditCardFieldTest,ParseCreditCardNoNumber)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
TEST_F(CreditCardFieldTest,ParseCreditCardNoDate)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
TEST_F(CreditCardFieldTest,ParseMiniumCreditCard)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
TEST_F(CreditCardFieldTest,ParseFullCreditCard)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
TEST_F(CreditCardFieldTest,ParseExpMonthYear)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
TEST_F(CreditCardFieldTest,ParseExpMonthYear2)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
TEST_F(CreditCardFieldTest,ParseExpField)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
TEST_F(CreditCardFieldTest,ParseExpField2DigitYear)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
TEST_F(CreditCardFieldTest,ParseCreditCardHolderNameWithCCFullName)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.
TEST_F(CreditCardFieldTest,ParseMonthControl)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