• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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