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