Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: components/autofill/core/browser/phone_field_unittest.cc

Issue 1010743007: Autofill: Apply the same field match mask to all phone field subtypes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/autofill/core/browser/phone_field.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« no previous file with comments | « components/autofill/core/browser/phone_field.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698