OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/memory/scoped_vector.h" | 6 #include "base/memory/scoped_vector.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "components/autofill/core/browser/autofill_field.h" | 8 #include "components/autofill/core/browser/autofill_field.h" |
9 #include "components/autofill/core/browser/autofill_scanner.h" | 9 #include "components/autofill/core/browser/autofill_scanner.h" |
10 #include "components/autofill/core/browser/phone_field.h" | 10 #include "components/autofill/core/browser/phone_field.h" |
11 #include "components/autofill/core/common/form_field_data.h" | 11 #include "components/autofill/core/common/form_field_data.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 | 13 |
14 using base::ASCIIToUTF16; | 14 using base::ASCIIToUTF16; |
15 | 15 |
16 namespace autofill { | 16 namespace autofill { |
17 | 17 |
18 namespace { | |
19 | |
20 const char* const kFieldTypes[] = { | |
21 "text", | |
22 "tel", | |
Lei Zhang
2015/03/26 02:09:15
FYI, I intend to add "number" in a follow up CL.
| |
23 }; | |
24 | |
25 } // namespace | |
26 | |
18 class PhoneFieldTest : public testing::Test { | 27 class PhoneFieldTest : public testing::Test { |
19 public: | 28 public: |
20 PhoneFieldTest() {} | 29 PhoneFieldTest() {} |
21 | 30 |
22 protected: | 31 protected: |
23 ScopedVector<AutofillField> list_; | |
24 scoped_ptr<PhoneField> field_; | |
25 ServerFieldTypeMap field_type_map_; | |
26 | |
27 // Downcast for tests. | 32 // Downcast for tests. |
28 static scoped_ptr<PhoneField> Parse(AutofillScanner* scanner) { | 33 static scoped_ptr<PhoneField> Parse(AutofillScanner* scanner) { |
29 scoped_ptr<FormField> field = PhoneField::Parse(scanner); | 34 scoped_ptr<FormField> field = PhoneField::Parse(scanner); |
30 return make_scoped_ptr(static_cast<PhoneField*>(field.release())); | 35 return make_scoped_ptr(static_cast<PhoneField*>(field.release())); |
31 } | 36 } |
32 | 37 |
38 void Clear() { | |
39 list_.clear(); | |
40 field_.reset(); | |
41 field_type_map_.clear(); | |
42 } | |
43 | |
44 void CheckField(const std::string& name, | |
45 ServerFieldType expected_type) const { | |
46 auto it = field_type_map_.find(ASCIIToUTF16(name)); | |
47 ASSERT_TRUE(it != field_type_map_.end()) << name; | |
48 EXPECT_EQ(expected_type, it->second) << name; | |
49 } | |
50 | |
51 ScopedVector<AutofillField> list_; | |
52 scoped_ptr<PhoneField> field_; | |
53 ServerFieldTypeMap field_type_map_; | |
54 | |
33 private: | 55 private: |
34 DISALLOW_COPY_AND_ASSIGN(PhoneFieldTest); | 56 DISALLOW_COPY_AND_ASSIGN(PhoneFieldTest); |
35 }; | 57 }; |
36 | 58 |
37 TEST_F(PhoneFieldTest, Empty) { | 59 TEST_F(PhoneFieldTest, Empty) { |
38 AutofillScanner scanner(list_.get()); | 60 AutofillScanner scanner(list_.get()); |
39 field_ = Parse(&scanner); | 61 field_ = Parse(&scanner); |
40 ASSERT_EQ(nullptr, field_.get()); | 62 ASSERT_EQ(nullptr, field_.get()); |
41 } | 63 } |
42 | 64 |
43 TEST_F(PhoneFieldTest, NonParse) { | 65 TEST_F(PhoneFieldTest, NonParse) { |
44 list_.push_back(new AutofillField); | 66 list_.push_back(new AutofillField); |
45 AutofillScanner scanner(list_.get()); | 67 AutofillScanner scanner(list_.get()); |
46 field_ = Parse(&scanner); | 68 field_ = Parse(&scanner); |
47 ASSERT_EQ(nullptr, field_.get()); | 69 ASSERT_EQ(nullptr, field_.get()); |
48 } | 70 } |
49 | 71 |
50 TEST_F(PhoneFieldTest, ParseOneLinePhone) { | 72 TEST_F(PhoneFieldTest, ParseOneLinePhone) { |
51 FormFieldData field; | 73 FormFieldData field; |
52 field.form_control_type = "text"; | |
53 | 74 |
54 field.label = ASCIIToUTF16("Phone"); | 75 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
55 field.name = ASCIIToUTF16("phone"); | 76 Clear(); |
56 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); | |
57 | 77 |
58 AutofillScanner scanner(list_.get()); | 78 field.form_control_type = kFieldTypes[i]; |
59 field_ = Parse(&scanner); | 79 field.label = ASCIIToUTF16("Phone"); |
60 ASSERT_NE(nullptr, field_.get()); | 80 field.name = ASCIIToUTF16("phone"); |
61 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 81 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); |
62 ASSERT_TRUE( | 82 |
63 field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); | 83 AutofillScanner scanner(list_.get()); |
64 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); | 84 field_ = Parse(&scanner); |
85 ASSERT_NE(nullptr, field_.get()); | |
86 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | |
87 CheckField("phone1", PHONE_HOME_WHOLE_NUMBER); | |
88 } | |
65 } | 89 } |
66 | 90 |
67 TEST_F(PhoneFieldTest, ParseTwoLinePhone) { | 91 TEST_F(PhoneFieldTest, ParseTwoLinePhone) { |
68 FormFieldData field; | 92 FormFieldData field; |
69 field.form_control_type = "text"; | |
70 | 93 |
71 field.label = ASCIIToUTF16("Area Code"); | 94 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
72 field.name = ASCIIToUTF16("area code"); | 95 Clear(); |
73 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
74 | 96 |
75 field.label = ASCIIToUTF16("Phone"); | 97 field.form_control_type = kFieldTypes[i]; |
76 field.name = ASCIIToUTF16("phone"); | 98 field.label = ASCIIToUTF16("Area Code"); |
77 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); | 99 field.name = ASCIIToUTF16("area code"); |
100 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
78 | 101 |
79 AutofillScanner scanner(list_.get()); | 102 field.label = ASCIIToUTF16("Phone"); |
80 field_ = Parse(&scanner); | 103 field.name = ASCIIToUTF16("phone"); |
81 ASSERT_NE(nullptr, field_.get()); | 104 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); |
82 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 105 |
83 ASSERT_TRUE( | 106 AutofillScanner scanner(list_.get()); |
84 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); | 107 field_ = Parse(&scanner); |
85 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); | 108 ASSERT_NE(nullptr, field_.get()); |
86 ASSERT_TRUE( | 109 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); |
87 field_type_map_.find(ASCIIToUTF16("phone2")) != field_type_map_.end()); | 110 CheckField("areacode1", PHONE_HOME_CITY_CODE); |
88 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone2")]); | 111 CheckField("phone2", PHONE_HOME_NUMBER); |
112 } | |
89 } | 113 } |
90 | 114 |
91 TEST_F(PhoneFieldTest, ThreePartPhoneNumber) { | 115 TEST_F(PhoneFieldTest, ThreePartPhoneNumber) { |
92 // Phone in format <field> - <field> - <field> could be either | 116 // Phone in format <field> - <field> - <field> could be either |
93 // <area code> - <prefix> - <suffix>, or | 117 // <area code> - <prefix> - <suffix>, or |
94 // <country code> - <area code> - <phone>. The only distinguishing feature is | 118 // <country code> - <area code> - <phone>. The only distinguishing feature is |
95 // size: <prefix> is no bigger than 3 characters, and <suffix> is no bigger | 119 // size: <prefix> is no bigger than 3 characters, and <suffix> is no bigger |
96 // than 4. | 120 // than 4. |
97 FormFieldData field; | 121 FormFieldData field; |
98 field.form_control_type = "text"; | |
99 | 122 |
100 field.label = ASCIIToUTF16("Phone:"); | 123 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
101 field.name = ASCIIToUTF16("dayphone1"); | 124 Clear(); |
102 field.max_length = 0; | |
103 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
104 | 125 |
105 field.label = ASCIIToUTF16("-"); | 126 field.form_control_type = kFieldTypes[i]; |
106 field.name = ASCIIToUTF16("dayphone2"); | 127 field.label = ASCIIToUTF16("Phone:"); |
107 field.max_length = 3; | 128 field.name = ASCIIToUTF16("dayphone1"); |
108 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); | 129 field.max_length = 0; |
130 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
109 | 131 |
110 field.label = ASCIIToUTF16("-"); | 132 field.label = ASCIIToUTF16("-"); |
111 field.name = ASCIIToUTF16("dayphone3"); | 133 field.name = ASCIIToUTF16("dayphone2"); |
112 field.max_length = 4; | 134 field.max_length = 3; |
113 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); | 135 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); |
114 | 136 |
115 field.label = ASCIIToUTF16("ext.:"); | 137 field.label = ASCIIToUTF16("-"); |
116 field.name = ASCIIToUTF16("dayphone4"); | 138 field.name = ASCIIToUTF16("dayphone3"); |
117 field.max_length = 0; | 139 field.max_length = 4; |
118 list_.push_back(new AutofillField(field, ASCIIToUTF16("ext4"))); | 140 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); |
119 | 141 |
120 AutofillScanner scanner(list_.get()); | 142 field.label = ASCIIToUTF16("ext.:"); |
121 field_ = Parse(&scanner); | 143 field.name = ASCIIToUTF16("dayphone4"); |
122 ASSERT_NE(nullptr, field_.get()); | 144 field.max_length = 0; |
123 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 145 list_.push_back(new AutofillField(field, ASCIIToUTF16("ext4"))); |
124 ASSERT_TRUE( | 146 |
125 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); | 147 AutofillScanner scanner(list_.get()); |
126 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); | 148 field_ = Parse(&scanner); |
127 ASSERT_TRUE( | 149 ASSERT_NE(nullptr, field_.get()); |
128 field_type_map_.find(ASCIIToUTF16("prefix2")) != field_type_map_.end()); | 150 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); |
129 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix2")]); | 151 CheckField("areacode1", PHONE_HOME_CITY_CODE); |
130 ASSERT_TRUE( | 152 CheckField("prefix2", PHONE_HOME_NUMBER); |
131 field_type_map_.find(ASCIIToUTF16("suffix3")) != field_type_map_.end()); | 153 CheckField("suffix3", PHONE_HOME_NUMBER); |
132 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix3")]); | 154 EXPECT_FALSE(ContainsKey(field_type_map_, ASCIIToUTF16("ext4"))); |
133 EXPECT_TRUE( | 155 } |
134 field_type_map_.find(ASCIIToUTF16("ext4")) == field_type_map_.end()); | |
135 } | 156 } |
136 | 157 |
137 // This scenario of explicitly labeled "prefix" and "suffix" phone numbers | 158 // This scenario of explicitly labeled "prefix" and "suffix" phone numbers |
138 // encountered in http://crbug.com/40694 with page | 159 // encountered in http://crbug.com/40694 with page |
139 // https://www.wrapables.com/jsp/Signup.jsp. | 160 // https://www.wrapables.com/jsp/Signup.jsp. |
140 TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix) { | 161 TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix) { |
141 FormFieldData field; | 162 FormFieldData field; |
142 field.form_control_type = "text"; | |
143 | 163 |
144 field.label = ASCIIToUTF16("Phone:"); | 164 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
145 field.name = ASCIIToUTF16("area"); | 165 Clear(); |
146 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
147 | 166 |
148 field.label = base::string16(); | 167 field.form_control_type = kFieldTypes[i]; |
149 field.name = ASCIIToUTF16("prefix"); | 168 field.label = ASCIIToUTF16("Phone:"); |
150 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); | 169 field.name = ASCIIToUTF16("area"); |
170 list_.push_back(new AutofillField(field, ASCIIToUTF16("areacode1"))); | |
151 | 171 |
152 field.label = base::string16(); | 172 field.label = base::string16(); |
153 field.name = ASCIIToUTF16("suffix"); | 173 field.name = ASCIIToUTF16("prefix"); |
154 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); | 174 list_.push_back(new AutofillField(field, ASCIIToUTF16("prefix2"))); |
155 | 175 |
156 AutofillScanner scanner(list_.get()); | 176 field.label = base::string16(); |
157 field_ = Parse(&scanner); | 177 field.name = ASCIIToUTF16("suffix"); |
158 ASSERT_NE(nullptr, field_.get()); | 178 list_.push_back(new AutofillField(field, ASCIIToUTF16("suffix3"))); |
159 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 179 |
160 ASSERT_TRUE( | 180 AutofillScanner scanner(list_.get()); |
161 field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); | 181 field_ = Parse(&scanner); |
162 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); | 182 ASSERT_NE(nullptr, field_.get()); |
163 ASSERT_TRUE( | 183 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); |
164 field_type_map_.find(ASCIIToUTF16("prefix2")) != field_type_map_.end()); | 184 CheckField("areacode1", PHONE_HOME_CITY_CODE); |
165 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix2")]); | 185 CheckField("prefix2", PHONE_HOME_NUMBER); |
166 ASSERT_TRUE( | 186 CheckField("suffix3", PHONE_HOME_NUMBER); |
167 field_type_map_.find(ASCIIToUTF16("suffix3")) != field_type_map_.end()); | 187 } |
168 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix3")]); | |
169 } | 188 } |
170 | 189 |
171 TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix2) { | 190 TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix2) { |
172 FormFieldData field; | 191 FormFieldData field; |
173 field.form_control_type = "text"; | |
174 | 192 |
175 field.label = ASCIIToUTF16("("); | 193 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
176 field.name = ASCIIToUTF16("phone1"); | 194 Clear(); |
177 field.max_length = 3; | |
178 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); | |
179 | 195 |
180 field.label = ASCIIToUTF16(")"); | 196 field.form_control_type = kFieldTypes[i]; |
181 field.name = ASCIIToUTF16("phone2"); | 197 field.label = ASCIIToUTF16("("); |
182 field.max_length = 3; | 198 field.name = ASCIIToUTF16("phone1"); |
183 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); | 199 field.max_length = 3; |
200 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone1"))); | |
184 | 201 |
185 field.label = base::string16(); | 202 field.label = ASCIIToUTF16(")"); |
186 field.name = ASCIIToUTF16("phone3"); | 203 field.name = ASCIIToUTF16("phone2"); |
187 field.max_length = 4; | 204 field.max_length = 3; |
188 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone3"))); | 205 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone2"))); |
189 | 206 |
190 AutofillScanner scanner(list_.get()); | 207 field.label = base::string16(); |
191 field_ = Parse(&scanner); | 208 field.name = ASCIIToUTF16("phone3"); |
192 ASSERT_NE(nullptr, field_.get()); | 209 field.max_length = 4; |
193 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 210 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone3"))); |
194 ASSERT_TRUE( | 211 |
195 field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); | 212 AutofillScanner scanner(list_.get()); |
196 EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("phone1")]); | 213 field_ = Parse(&scanner); |
197 ASSERT_TRUE( | 214 ASSERT_NE(nullptr, field_.get()); |
198 field_type_map_.find(ASCIIToUTF16("phone2")) != field_type_map_.end()); | 215 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); |
199 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone2")]); | 216 CheckField("phone1", PHONE_HOME_CITY_CODE); |
200 ASSERT_TRUE( | 217 CheckField("phone2", PHONE_HOME_NUMBER); |
201 field_type_map_.find(ASCIIToUTF16("phone3")) != field_type_map_.end()); | 218 CheckField("phone3", PHONE_HOME_NUMBER); |
202 EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone3")]); | 219 } |
203 } | 220 } |
204 | 221 |
205 TEST_F(PhoneFieldTest, CountryAndCityAndPhoneNumber) { | 222 TEST_F(PhoneFieldTest, CountryAndCityAndPhoneNumber) { |
206 // Phone in format <country code>:3 - <city and number>:10 | 223 // Phone in format <country code>:3 - <city and number>:10 |
207 // The |maxlength| is considered, otherwise it's too broad. | 224 // The |maxlength| is considered, otherwise it's too broad. |
208 FormFieldData field; | 225 FormFieldData field; |
209 field.form_control_type = "text"; | |
210 | 226 |
211 field.label = ASCIIToUTF16("Phone Number"); | 227 for (size_t i = 0; i < arraysize(kFieldTypes); ++i) { |
212 field.name = ASCIIToUTF16("CountryCode"); | 228 Clear(); |
213 field.max_length = 3; | |
214 list_.push_back(new AutofillField(field, ASCIIToUTF16("country"))); | |
215 | 229 |
216 field.label = ASCIIToUTF16("Phone Number"); | 230 field.form_control_type = kFieldTypes[i]; |
217 field.name = ASCIIToUTF16("PhoneNumber"); | 231 field.label = ASCIIToUTF16("Phone Number"); |
218 field.max_length = 10; | 232 field.name = ASCIIToUTF16("CountryCode"); |
219 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone"))); | 233 field.max_length = 3; |
234 list_.push_back(new AutofillField(field, ASCIIToUTF16("country"))); | |
220 | 235 |
221 AutofillScanner scanner(list_.get()); | 236 field.label = ASCIIToUTF16("Phone Number"); |
222 field_ = Parse(&scanner); | 237 field.name = ASCIIToUTF16("PhoneNumber"); |
223 ASSERT_NE(nullptr, field_.get()); | 238 field.max_length = 10; |
224 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); | 239 list_.push_back(new AutofillField(field, ASCIIToUTF16("phone"))); |
225 ASSERT_TRUE( | 240 |
226 field_type_map_.find(ASCIIToUTF16("country")) != field_type_map_.end()); | 241 AutofillScanner scanner(list_.get()); |
227 EXPECT_EQ(PHONE_HOME_COUNTRY_CODE, field_type_map_[ASCIIToUTF16("country")]); | 242 field_ = Parse(&scanner); |
228 ASSERT_TRUE( | 243 ASSERT_NE(nullptr, field_.get()); |
229 field_type_map_.find(ASCIIToUTF16("phone")) != field_type_map_.end()); | 244 ASSERT_TRUE(field_->ClassifyField(&field_type_map_)); |
230 EXPECT_EQ(PHONE_HOME_CITY_AND_NUMBER, field_type_map_[ASCIIToUTF16("phone")]); | 245 CheckField("country", PHONE_HOME_COUNTRY_CODE); |
246 CheckField("phone", PHONE_HOME_CITY_AND_NUMBER); | |
247 } | |
231 } | 248 } |
232 | 249 |
233 } // namespace autofill | 250 } // namespace autofill |
OLD | NEW |