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
14 using base::ASCIIToUTF16;
15
16 namespace autofill {
17
18 class PhoneFieldTest : public testing::Test {
19 public:
PhoneFieldTest()20 PhoneFieldTest() {}
21
22 protected:
23 ScopedVector<AutofillField> list_;
24 scoped_ptr<PhoneField> field_;
25 ServerFieldTypeMap field_type_map_;
26
27 // Downcast for tests.
Parse(AutofillScanner * scanner)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
TEST_F(PhoneFieldTest,Empty)36 TEST_F(PhoneFieldTest, Empty) {
37 AutofillScanner scanner(list_.get());
38 field_.reset(Parse(&scanner));
39 ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get());
40 }
41
TEST_F(PhoneFieldTest,NonParse)42 TEST_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
TEST_F(PhoneFieldTest,ParseOneLinePhone)49 TEST_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
TEST_F(PhoneFieldTest,ParseTwoLinePhone)66 TEST_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
TEST_F(PhoneFieldTest,ThreePartPhoneNumber)90 TEST_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.
TEST_F(PhoneFieldTest,ThreePartPhoneNumberPrefixSuffix)139 TEST_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
TEST_F(PhoneFieldTest,ThreePartPhoneNumberPrefixSuffix2)170 TEST_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
TEST_F(PhoneFieldTest,CountryAndCityAndPhoneNumber)204 TEST_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