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.
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"
16 class NameFieldTest : public testing::Test {
21 ScopedVector<const AutofillField> list_;
22 scoped_ptr<NameField> field_;
23 ServerFieldTypeMap field_type_map_;
25 // Downcast for tests.
26 static NameField* Parse(AutofillScanner* scanner) {
27 return static_cast<NameField*>(NameField::Parse(scanner));
31 DISALLOW_COPY_AND_ASSIGN(NameFieldTest);
34 TEST_F(NameFieldTest, FirstMiddleLast) {
36 field.form_control_type = "text";
38 field.label = ASCIIToUTF16("First Name");
39 field.name = ASCIIToUTF16("First");
40 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
42 field.label = ASCIIToUTF16("Middle Name");
43 field.name = ASCIIToUTF16("Middle");
44 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
46 field.label = ASCIIToUTF16("Last Name");
47 field.name = ASCIIToUTF16("Last");
48 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
50 AutofillScanner scanner(list_.get());
51 field_.reset(Parse(&scanner));
52 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
53 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
55 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
56 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
58 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
59 EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
61 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
62 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
65 TEST_F(NameFieldTest, FirstMiddleLast2) {
67 field.form_control_type = "text";
69 field.label = base::string16();
70 field.name = ASCIIToUTF16("firstName");
71 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
73 field.label = base::string16();
74 field.name = ASCIIToUTF16("middleName");
75 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
77 field.label = base::string16();
78 field.name = ASCIIToUTF16("lastName");
79 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
81 AutofillScanner scanner(list_.get());
82 field_.reset(Parse(&scanner));
83 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
84 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
86 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
87 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
89 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
90 EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
92 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
93 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
96 TEST_F(NameFieldTest, FirstLast) {
98 field.form_control_type = "text";
100 field.label = base::string16();
101 field.name = ASCIIToUTF16("first_name");
102 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
104 field.label = base::string16();
105 field.name = ASCIIToUTF16("last_name");
106 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
108 AutofillScanner scanner(list_.get());
109 field_.reset(Parse(&scanner));
110 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
111 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
113 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
114 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
116 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
117 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
120 TEST_F(NameFieldTest, FirstLast2) {
122 field.form_control_type = "text";
124 field.label = ASCIIToUTF16("Name");
125 field.name = ASCIIToUTF16("first_name");
126 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
128 field.label = ASCIIToUTF16("Name");
129 field.name = ASCIIToUTF16("last_name");
130 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
132 AutofillScanner scanner(list_.get());
133 field_.reset(Parse(&scanner));
134 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
135 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
137 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
138 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
140 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
141 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
144 TEST_F(NameFieldTest, FirstLastMiddleWithSpaces) {
146 field.form_control_type = "text";
148 field.label = ASCIIToUTF16("First Name");
149 field.name = ASCIIToUTF16("first_name");
150 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
152 field.label = ASCIIToUTF16("Middle Name");
153 field.name = ASCIIToUTF16("middle_name");
154 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
156 field.label = ASCIIToUTF16("Last Name");
157 field.name = ASCIIToUTF16("last_name");
158 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
160 AutofillScanner scanner(list_.get());
161 field_.reset(Parse(&scanner));
162 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
163 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
165 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
166 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
168 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
169 EXPECT_EQ(NAME_MIDDLE, field_type_map_[ASCIIToUTF16("name2")]);
171 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
172 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
175 TEST_F(NameFieldTest, FirstLastEmpty) {
177 field.form_control_type = "text";
179 field.label = ASCIIToUTF16("Name");
180 field.name = ASCIIToUTF16("first_name");
181 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
183 field.label = base::string16();
184 field.name = ASCIIToUTF16("last_name");
185 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
187 AutofillScanner scanner(list_.get());
188 field_.reset(Parse(&scanner));
189 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
190 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
192 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
193 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
195 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
196 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name2")]);
199 TEST_F(NameFieldTest, FirstMiddleLastEmpty) {
201 field.form_control_type = "text";
203 field.label = ASCIIToUTF16("Name");
204 field.name = ASCIIToUTF16("first_name");
205 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
207 field.label = base::string16();
208 field.name = ASCIIToUTF16("middle_name");
209 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
211 field.label = base::string16();
212 field.name = ASCIIToUTF16("last_name");
213 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
215 AutofillScanner scanner(list_.get());
216 field_.reset(Parse(&scanner));
217 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
218 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
220 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
221 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
223 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
224 EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
226 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
227 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
230 TEST_F(NameFieldTest, MiddleInitial) {
232 field.form_control_type = "text";
234 field.label = ASCIIToUTF16("First Name");
235 field.name = ASCIIToUTF16("first_name");
236 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
238 field.label = ASCIIToUTF16("MI");
239 field.name = ASCIIToUTF16("middle_name");
240 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
242 field.label = ASCIIToUTF16("Last Name");
243 field.name = ASCIIToUTF16("last_name");
244 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
246 AutofillScanner scanner(list_.get());
247 field_.reset(Parse(&scanner));
248 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
249 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
251 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
252 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
254 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
255 EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
257 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
258 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
261 TEST_F(NameFieldTest, MiddleInitialNoLastName) {
263 field.form_control_type = "text";
265 field.label = ASCIIToUTF16("First Name");
266 field.name = ASCIIToUTF16("first_name");
267 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
269 field.label = ASCIIToUTF16("MI");
270 field.name = ASCIIToUTF16("middle_name");
271 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
273 AutofillScanner scanner(list_.get());
274 field_.reset(Parse(&scanner));
275 ASSERT_EQ(static_cast<NameField*>(NULL), field_.get());
278 // This case is from the dell.com checkout page. The middle initial "mi" string
279 // came at the end following other descriptive text. http://crbug.com/45123.
280 TEST_F(NameFieldTest, MiddleInitialAtEnd) {
282 field.form_control_type = "text";
284 field.label = base::string16();
285 field.name = ASCIIToUTF16("XXXnameXXXfirst");
286 list_.push_back(new AutofillField(field, ASCIIToUTF16("name1")));
288 field.label = base::string16();
289 field.name = ASCIIToUTF16("XXXnameXXXmi");
290 list_.push_back(new AutofillField(field, ASCIIToUTF16("name2")));
292 field.label = base::string16();
293 field.name = ASCIIToUTF16("XXXnameXXXlast");
294 list_.push_back(new AutofillField(field, ASCIIToUTF16("name3")));
296 AutofillScanner scanner(list_.get());
297 field_.reset(Parse(&scanner));
298 ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
299 ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
301 field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
302 EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
304 field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
305 EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
307 field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
308 EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
311 } // namespace autofill