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/phone_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 PhoneFieldTest : public testing::Test { 19 public: 20 PhoneFieldTest() {} 21 22 protected: 23 ScopedVector<AutofillField> list_; 24 scoped_ptr<PhoneField> field_; 25 ServerFieldTypeMap field_type_map_; 26 27 // Downcast for tests. 28 static PhoneField* Parse(AutofillScanner* scanner) { 29 return static_cast<PhoneField*>(PhoneField::Parse(scanner)); 30 } 31 32 private: 33 DISALLOW_COPY_AND_ASSIGN(PhoneFieldTest); 34}; 35 36TEST_F(PhoneFieldTest, Empty) { 37 AutofillScanner scanner(list_.get()); 38 field_.reset(Parse(&scanner)); 39 ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get()); 40} 41 42TEST_F(PhoneFieldTest, NonParse) { 43 list_.push_back(new AutofillField); 44 AutofillScanner scanner(list_.get()); 45 field_.reset(Parse(&scanner)); 46 ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get()); 47} 48 49TEST_F(PhoneFieldTest, ParseOneLinePhone) { 50 FormFieldData field; 51 field.form_control_type = "text"; 52 53 field.label = ASCIIToUTF16("Phone"); 54 field.name = ASCIIToUTF16("phone"); 55 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); 56 57 AutofillScanner scanner(list_.get()); 58 field_.reset(Parse(&scanner)); 59 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 60 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 61 ASSERT_TRUE( 62 field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); 63 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); 64} 65 66TEST_F(PhoneFieldTest, ParseTwoLinePhone) { 67 FormFieldData field; 68 field.form_control_type = "text"; 69 70 field.label = ASCIIToUTF16("Area Code"); 71 field.name = ASCIIToUTF16("area code"); 72 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); 73 74 field.label = ASCIIToUTF16("Phone"); 75 field.name = ASCIIToUTF16("phone"); 76 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); 77 78 AutofillScanner scanner(list_.get()); 79 field_.reset(Parse(&scanner)); 80 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 81 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 82 ASSERT_TRUE( 83 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); 84 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); 85 ASSERT_TRUE( 86 field_type_map_.find(ASCIIToUTF16("phone2")) != field_type_map_.end()); 87 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone2")]); 88} 89 90TEST_F(PhoneFieldTest, ThreePartPhoneNumber) { 91 // Phone in format <field> - <field> - <field> could be either 92 // <area code> - <prefix> - <suffix>, or 93 // <country code> - <area code> - <phone>. The only distinguishing feature is 94 // size: <prefix> is no bigger than 3 characters, and <suffix> is no bigger 95 // than 4. 96 FormFieldData field; 97 field.form_control_type = "text"; 98 99 field.label = ASCIIToUTF16("Phone:"); 100 field.name = ASCIIToUTF16("dayphone1"); 101 field.max_length = 0; 102 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); 103 104 field.label = ASCIIToUTF16("-"); 105 field.name = ASCIIToUTF16("dayphone2"); 106 field.max_length = 3; 107 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); 108 109 field.label = ASCIIToUTF16("-"); 110 field.name = ASCIIToUTF16("dayphone3"); 111 field.max_length = 4; 112 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); 113 114 field.label = ASCIIToUTF16("ext.:"); 115 field.name = ASCIIToUTF16("dayphone4"); 116 field.max_length = 0; 117 list_.push_back(new AutofillField(field, ASCIIToUTF16("ext4"))); 118 119 AutofillScanner scanner(list_.get()); 120 field_.reset(Parse(&scanner)); 121 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 122 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 123 ASSERT_TRUE( 124 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); 125 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); 126 ASSERT_TRUE( 127 field_type_map_.find(ASCIIToUTF16("prefix2")) != field_type_map_.end()); 128 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix2")]); 129 ASSERT_TRUE( 130 field_type_map_.find(ASCIIToUTF16("suffix3")) != field_type_map_.end()); 131 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix3")]); 132 EXPECT_TRUE( 133 field_type_map_.find(ASCIIToUTF16("ext4")) == field_type_map_.end()); 134} 135 136// This scenario of explicitly labeled "prefix" and "suffix" phone numbers 137// encountered in http://crbug.com/40694 with page 138// https://www.wrapables.com/jsp/Signup.jsp. 139TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix) { 140 FormFieldData field; 141 field.form_control_type = "text"; 142 143 field.label = ASCIIToUTF16("Phone:"); 144 field.name = ASCIIToUTF16("area"); 145 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); 146 147 field.label = base::string16(); 148 field.name = ASCIIToUTF16("prefix"); 149 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); 150 151 field.label = base::string16(); 152 field.name = ASCIIToUTF16("suffix"); 153 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); 154 155 AutofillScanner scanner(list_.get()); 156 field_.reset(Parse(&scanner)); 157 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 158 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 159 ASSERT_TRUE( 160 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); 161 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); 162 ASSERT_TRUE( 163 field_type_map_.find(ASCIIToUTF16("prefix2")) != field_type_map_.end()); 164 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix2")]); 165 ASSERT_TRUE( 166 field_type_map_.find(ASCIIToUTF16("suffix3")) != field_type_map_.end()); 167 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix3")]); 168} 169 170TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix2) { 171 FormFieldData field; 172 field.form_control_type = "text"; 173 174 field.label = ASCIIToUTF16("("); 175 field.name = ASCIIToUTF16("phone1"); 176 field.max_length = 3; 177 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); 178 179 field.label = ASCIIToUTF16(")"); 180 field.name = ASCIIToUTF16("phone2"); 181 field.max_length = 3; 182 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); 183 184 field.label = base::string16(); 185 field.name = ASCIIToUTF16("phone3"); 186 field.max_length = 4; 187 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone3"))); 188 189 AutofillScanner scanner(list_.get()); 190 field_.reset(Parse(&scanner)); 191 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 192 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 193 ASSERT_TRUE( 194 field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); 195 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("phone1")]); 196 ASSERT_TRUE( 197 field_type_map_.find(ASCIIToUTF16("phone2")) != field_type_map_.end()); 198 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone2")]); 199 ASSERT_TRUE( 200 field_type_map_.find(ASCIIToUTF16("phone3")) != field_type_map_.end()); 201 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone3")]); 202} 203 204TEST_F(PhoneFieldTest, CountryAndCityAndPhoneNumber) { 205 // Phone in format <country code>:3 - <city and number>:10 206 // The |maxlength| is considered, otherwise it's too broad. 207 FormFieldData field; 208 field.form_control_type = "text"; 209 210 field.label = ASCIIToUTF16("Phone Number"); 211 field.name = ASCIIToUTF16("CountryCode"); 212 field.max_length = 3; 213 list_.push_back(new AutofillField(field, ASCIIToUTF16("country"))); 214 215 field.label = ASCIIToUTF16("Phone Number"); 216 field.name = ASCIIToUTF16("PhoneNumber"); 217 field.max_length = 10; 218 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone"))); 219 220 AutofillScanner scanner(list_.get()); 221 field_.reset(Parse(&scanner)); 222 ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); 223 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); 224 ASSERT_TRUE( 225 field_type_map_.find(ASCIIToUTF16("country")) != field_type_map_.end()); 226 EXPECT_EQ(PHONE_HOME_COUNTRY_CODE, field_type_map_[ASCIIToUTF16("country")]); 227 ASSERT_TRUE( 228 field_type_map_.find(ASCIIToUTF16("phone")) != field_type_map_.end()); 229 EXPECT_EQ(PHONE_HOME_CITY_AND_NUMBER, field_type_map_[ASCIIToUTF16("phone")]); 230} 231 232} // namespace autofill 233