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/name_field.h"
11#include "components/autofill/core/common/form_field_data.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14using base::ASCIIToUTF16;
15
16namespace autofill {
17
18class NameFieldTest : public testing::Test {
19 public:
20  NameFieldTest() {}
21
22 protected:
23  ScopedVector<AutofillField> list_;
24  scoped_ptr<NameField> field_;
25  ServerFieldTypeMap field_type_map_;
26
27  // Downcast for tests.
28  static NameField* Parse(AutofillScanner* scanner) {
29    return static_cast<NameField*>(NameField::Parse(scanner));
30  }
31
32 private:
33  DISALLOW_COPY_AND_ASSIGN(NameFieldTest);
34};
35
36TEST_F(NameFieldTest, FirstMiddleLast) {
37  FormFieldData field;
38  field.form_control_type = "text";
39
40  field.label = ASCIIToUTF16("First Name");
41  field.name = ASCIIToUTF16("First");
42  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
43
44  field.label = ASCIIToUTF16("Middle Name");
45  field.name = ASCIIToUTF16("Middle");
46  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
47
48  field.label = ASCIIToUTF16("Last Name");
49  field.name = ASCIIToUTF16("Last");
50  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
51
52  AutofillScanner scanner(list_.get());
53  field_.reset(Parse(&scanner));
54  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
55  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
56  ASSERT_TRUE(
57      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
58  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
59  ASSERT_TRUE(
60      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
61  EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
62  ASSERT_TRUE(
63      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
64  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
65}
66
67TEST_F(NameFieldTest, FirstMiddleLast2) {
68  FormFieldData field;
69  field.form_control_type = "text";
70
71  field.label = base::string16();
72  field.name = ASCIIToUTF16("firstName");
73  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
74
75  field.label = base::string16();
76  field.name = ASCIIToUTF16("middleName");
77  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
78
79  field.label = base::string16();
80  field.name = ASCIIToUTF16("lastName");
81  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
82
83  AutofillScanner scanner(list_.get());
84  field_.reset(Parse(&scanner));
85  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
86  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
87  ASSERT_TRUE(
88      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
89  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
90  ASSERT_TRUE(
91      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
92  EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
93  ASSERT_TRUE(
94      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
95  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
96}
97
98TEST_F(NameFieldTest, FirstLast) {
99  FormFieldData field;
100  field.form_control_type = "text";
101
102  field.label = base::string16();
103  field.name = ASCIIToUTF16("first_name");
104  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
105
106  field.label = base::string16();
107  field.name = ASCIIToUTF16("last_name");
108  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
109
110  AutofillScanner scanner(list_.get());
111  field_.reset(Parse(&scanner));
112  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
113  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
114  ASSERT_TRUE(
115      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
116  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
117  ASSERT_TRUE(
118      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
119  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
120}
121
122TEST_F(NameFieldTest, FirstLast2) {
123  FormFieldData field;
124  field.form_control_type = "text";
125
126  field.label = ASCIIToUTF16("Name");
127  field.name = ASCIIToUTF16("first_name");
128  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
129
130  field.label = ASCIIToUTF16("Name");
131  field.name = ASCIIToUTF16("last_name");
132  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
133
134  AutofillScanner scanner(list_.get());
135  field_.reset(Parse(&scanner));
136  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
137  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
138  ASSERT_TRUE(
139      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
140  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
141  ASSERT_TRUE(
142      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
143  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
144}
145
146TEST_F(NameFieldTest, FirstLastMiddleWithSpaces) {
147  FormFieldData field;
148  field.form_control_type = "text";
149
150  field.label = ASCIIToUTF16("First  Name");
151  field.name = ASCIIToUTF16("first_name");
152  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
153
154  field.label = ASCIIToUTF16("Middle  Name");
155  field.name = ASCIIToUTF16("middle_name");
156  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
157
158  field.label = ASCIIToUTF16("Last  Name");
159  field.name = ASCIIToUTF16("last_name");
160  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
161
162  AutofillScanner scanner(list_.get());
163  field_.reset(Parse(&scanner));
164  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
165  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
166  ASSERT_TRUE(
167      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
168  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
169  ASSERT_TRUE(
170      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
171  EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
172  ASSERT_TRUE(
173      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
174  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
175}
176
177TEST_F(NameFieldTest, FirstLastEmpty) {
178  FormFieldData field;
179  field.form_control_type = "text";
180
181  field.label = ASCIIToUTF16("Name");
182  field.name = ASCIIToUTF16("first_name");
183  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
184
185    field.label = base::string16();
186  field.name = ASCIIToUTF16("last_name");
187  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
188
189  AutofillScanner scanner(list_.get());
190  field_.reset(Parse(&scanner));
191  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
192  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
193  ASSERT_TRUE(
194      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
195  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
196  ASSERT_TRUE(
197      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
198  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
199}
200
201TEST_F(NameFieldTest, FirstMiddleLastEmpty) {
202  FormFieldData field;
203  field.form_control_type = "text";
204
205  field.label = ASCIIToUTF16("Name");
206  field.name = ASCIIToUTF16("first_name");
207  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
208
209  field.label = base::string16();
210  field.name = ASCIIToUTF16("middle_name");
211  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
212
213  field.label = base::string16();
214  field.name = ASCIIToUTF16("last_name");
215  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
216
217  AutofillScanner scanner(list_.get());
218  field_.reset(Parse(&scanner));
219  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
220  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
221  ASSERT_TRUE(
222      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
223  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
224  ASSERT_TRUE(
225      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
226  EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
227  ASSERT_TRUE(
228      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
229  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
230}
231
232TEST_F(NameFieldTest, MiddleInitial) {
233  FormFieldData field;
234  field.form_control_type = "text";
235
236  field.label = ASCIIToUTF16("First Name");
237  field.name = ASCIIToUTF16("first_name");
238  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
239
240  field.label = ASCIIToUTF16("MI");
241  field.name = ASCIIToUTF16("middle_name");
242  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
243
244  field.label = ASCIIToUTF16("Last Name");
245  field.name = ASCIIToUTF16("last_name");
246  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
247
248  AutofillScanner scanner(list_.get());
249  field_.reset(Parse(&scanner));
250  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
251  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
252  ASSERT_TRUE(
253      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
254  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
255  ASSERT_TRUE(
256      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
257  EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
258  ASSERT_TRUE(
259      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
260  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
261}
262
263TEST_F(NameFieldTest, MiddleInitialNoLastName) {
264  FormFieldData field;
265  field.form_control_type = "text";
266
267  field.label = ASCIIToUTF16("First Name");
268  field.name = ASCIIToUTF16("first_name");
269  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
270
271  field.label = ASCIIToUTF16("MI");
272  field.name = ASCIIToUTF16("middle_name");
273  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
274
275  AutofillScanner scanner(list_.get());
276  field_.reset(Parse(&scanner));
277  ASSERT_EQ(static_cast<NameField*>(NULL), field_.get());
278}
279
280// This case is from the dell.com checkout page.  The middle initial "mi" string
281// came at the end following other descriptive text.  http://crbug.com/45123.
282TEST_F(NameFieldTest, MiddleInitialAtEnd) {
283  FormFieldData field;
284  field.form_control_type = "text";
285
286  field.label = base::string16();
287  field.name = ASCIIToUTF16("XXXnameXXXfirst");
288  list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
289
290  field.label = base::string16();
291  field.name = ASCIIToUTF16("XXXnameXXXmi");
292  list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
293
294  field.label = base::string16();
295  field.name = ASCIIToUTF16("XXXnameXXXlast");
296  list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
297
298  AutofillScanner scanner(list_.get());
299  field_.reset(Parse(&scanner));
300  ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
301  ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
302  ASSERT_TRUE(
303      field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
304  EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
305  ASSERT_TRUE(
306      field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
307  EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
308  ASSERT_TRUE(
309      field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
310  EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
311}
312
313}  // namespace autofill
314