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