phone_field_unittest.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2011 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/scoped_ptr.h"
6#include "base/scoped_vector.h"
7#include "base/utf_string_conversions.h"
8#include "chrome/browser/autofill/phone_field.h"
9#include "testing/gtest/include/gtest/gtest.h"
10#include "webkit/glue/form_field.h"
11
12namespace {
13
14class PhoneFieldTest : public testing::Test {
15 public:
16  PhoneFieldTest() {}
17
18 protected:
19  ScopedVector<AutofillField> list_;
20  scoped_ptr<PhoneField> field_;
21  FieldTypeMap field_type_map_;
22  std::vector<AutofillField*>::const_iterator iter_;
23
24 private:
25  DISALLOW_COPY_AND_ASSIGN(PhoneFieldTest);
26};
27
28TEST_F(PhoneFieldTest, Empty) {
29  list_.push_back(NULL);
30  iter_ = list_.begin();
31  field_.reset(PhoneField::Parse(&iter_, false));
32  ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get());
33}
34
35TEST_F(PhoneFieldTest, NonParse) {
36  list_.push_back(new AutofillField);
37  list_.push_back(NULL);
38  iter_ = list_.begin();
39  field_.reset(PhoneField::Parse(&iter_, false));
40  ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get());
41}
42
43TEST_F(PhoneFieldTest, ParseOneLinePhone) {
44  list_.push_back(
45      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
46                                               ASCIIToUTF16("phone"),
47                                               string16(),
48                                               ASCIIToUTF16("text"),
49                                               0,
50                                               false),
51                        ASCIIToUTF16("phone1")));
52  list_.push_back(NULL);
53  iter_ = list_.begin();
54  field_.reset(PhoneField::Parse(&iter_, false));
55  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
56  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
57  ASSERT_TRUE(
58      field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end());
59  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
60}
61
62TEST_F(PhoneFieldTest, ParseOneLinePhoneEcml) {
63  list_.push_back(
64      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
65                                               ASCIIToUTF16(kEcmlShipToPhone),
66                                               string16(),
67                                               ASCIIToUTF16("text"),
68                                               0,
69                                               false),
70                        ASCIIToUTF16("phone1")));
71  list_.push_back(NULL);
72  iter_ = list_.begin();
73  field_.reset(PhoneField::Parse(&iter_, true));
74  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
75  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
76  ASSERT_TRUE(
77      field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end());
78  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
79}
80
81TEST_F(PhoneFieldTest, ParseTwoLinePhone) {
82  list_.push_back(
83      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"),
84                                               ASCIIToUTF16("area code"),
85                                               string16(),
86                                               ASCIIToUTF16("text"),
87                                               0,
88                                               false),
89                        ASCIIToUTF16("areacode1")));
90  list_.push_back(
91      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
92                                               ASCIIToUTF16("phone"),
93                                               string16(),
94                                               ASCIIToUTF16("text"),
95                                               0,
96                                               false),
97                        ASCIIToUTF16("phone1")));
98  list_.push_back(NULL);
99  iter_ = list_.begin();
100  field_.reset(PhoneField::Parse(&iter_, false));
101  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
102  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
103  ASSERT_TRUE(
104      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
105  EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
106  ASSERT_TRUE(
107      field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end());
108  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
109}
110
111TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlShipTo) {
112  list_.push_back(
113      new AutofillField(
114          webkit_glue::FormField(ASCIIToUTF16("Area Code"),
115                                 ASCIIToUTF16(kEcmlShipToPostalCode),
116                                 string16(),
117                                 ASCIIToUTF16("text"),
118                                 0,
119                                 false),
120          ASCIIToUTF16("areacode1")));
121  list_.push_back(
122      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
123                                               ASCIIToUTF16(kEcmlShipToPhone),
124                                               string16(),
125                                               ASCIIToUTF16("text"),
126                                               0,
127                                               false),
128                        ASCIIToUTF16("phone1")));
129  list_.push_back(NULL);
130  iter_ = list_.begin();
131  field_.reset(PhoneField::Parse(&iter_, false));
132  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
133  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
134  ASSERT_TRUE(
135      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
136  EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
137  ASSERT_TRUE(
138      field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end());
139  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
140}
141
142TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlBillTo) {
143  list_.push_back(
144      new AutofillField(
145          webkit_glue::FormField(ASCIIToUTF16("Area Code"),
146                                 ASCIIToUTF16(kEcmlBillToPostalCode),
147                                 string16(),
148                                 ASCIIToUTF16("text"),
149                                 0,
150                                 false),
151          ASCIIToUTF16("areacode1")));
152  list_.push_back(
153      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
154                                               ASCIIToUTF16(kEcmlBillToPhone),
155                                               string16(),
156                                               ASCIIToUTF16("text"),
157                                               0,
158                                               false),
159                        ASCIIToUTF16("phone1")));
160  list_.push_back(NULL);
161  iter_ = list_.begin();
162  field_.reset(PhoneField::Parse(&iter_, false));
163  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
164  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
165  ASSERT_TRUE(
166      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
167  EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
168  ASSERT_TRUE(
169      field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end());
170  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
171}
172
173TEST_F(PhoneFieldTest, ThreePartPhoneNumber) {
174  // Phone in format <field> - <field> - <field> could be either
175  // <area code> - <prefix> - <suffix>, or
176  // <country code> - <area code> - <phone>. The only distinguishing feature is
177  // size: <prefix> is no bigger than 3 characters, and <suffix> is no bigger
178  // than 4.
179  list_.push_back(
180      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone:"),
181                                               ASCIIToUTF16("dayphone1"),
182                                               string16(),
183                                               ASCIIToUTF16("text"),
184                                               0,
185                                               false),
186                        ASCIIToUTF16("areacode1")));
187  list_.push_back(
188      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("-"),
189                                               ASCIIToUTF16("dayphone2"),
190                                               string16(),
191                                               ASCIIToUTF16("text"),
192                                               3,
193                                               false),
194                        ASCIIToUTF16("prefix1")));
195  list_.push_back(
196      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("-"),
197                                               ASCIIToUTF16("dayphone3"),
198                                               string16(),
199                                               ASCIIToUTF16("text"),
200                                               4,
201                                               false),
202                        ASCIIToUTF16("suffix1")));
203  list_.push_back(
204      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("ext.:"),
205                                               ASCIIToUTF16("dayphone4"),
206                                               string16(),
207                                               ASCIIToUTF16("text"),
208                                               0,
209                                               false),
210                        ASCIIToUTF16("ext1")));
211  list_.push_back(NULL);
212  iter_ = list_.begin();
213  field_.reset(PhoneField::Parse(&iter_, false));
214  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
215  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
216  ASSERT_TRUE(
217      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
218  EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
219  ASSERT_TRUE(
220      field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end());
221  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]);
222  ASSERT_TRUE(
223      field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end());
224  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]);
225}
226
227// This scenario of explicitly labeled "prefix" and "suffix" phone numbers
228// encountered in http://crbug.com/40694 with page
229// https://www.wrapables.com/jsp/Signup.jsp.
230TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix) {
231  list_.push_back(
232      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone:"),
233                                               ASCIIToUTF16("area"),
234                                               string16(),
235                                               ASCIIToUTF16("text"),
236                                               0,
237                                               false),
238                        ASCIIToUTF16("areacode1")));
239  list_.push_back(
240      new AutofillField(webkit_glue::FormField(string16(),
241                                               ASCIIToUTF16("prefix"),
242                                               string16(),
243                                               ASCIIToUTF16("text"),
244                                               0,
245                                               false),
246                        ASCIIToUTF16("prefix1")));
247  list_.push_back(
248      new AutofillField(webkit_glue::FormField(string16(),
249                                               ASCIIToUTF16("suffix"),
250                                               string16(),
251                                               ASCIIToUTF16("text"),
252                                               0,
253                                               false),
254                        ASCIIToUTF16("suffix1")));
255  list_.push_back(NULL);
256  iter_ = list_.begin();
257  field_.reset(PhoneField::Parse(&iter_, false));
258  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
259  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
260  ASSERT_TRUE(
261      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
262  EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
263  ASSERT_TRUE(
264      field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end());
265  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]);
266  ASSERT_TRUE(
267      field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end());
268  EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]);
269}
270
271TEST_F(PhoneFieldTest, ParseOneLineFax) {
272  list_.push_back(
273      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax"),
274                                               ASCIIToUTF16("fax"),
275                                               string16(),
276                                               ASCIIToUTF16("text"),
277                                               0,
278                                               false),
279                        ASCIIToUTF16("fax1")));
280  list_.push_back(NULL);
281  iter_ = list_.begin();
282  field_.reset(PhoneField::Parse(&iter_, false));
283  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
284  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
285  ASSERT_TRUE(
286      field_type_map_.find(ASCIIToUTF16("fax1")) != field_type_map_.end());
287  EXPECT_EQ(PHONE_FAX_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("fax1")]);
288}
289
290TEST_F(PhoneFieldTest, ParseTwoLineFax) {
291  list_.push_back(
292      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"),
293                                               ASCIIToUTF16("area code"),
294                                               string16(),
295                                               ASCIIToUTF16("text"),
296                                               0,
297                                               false),
298                        ASCIIToUTF16("areacode1")));
299  list_.push_back(
300      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax"),
301                                               ASCIIToUTF16("fax"),
302                                               string16(),
303                                               ASCIIToUTF16("text"),
304                                               0,
305                                               false),
306                        ASCIIToUTF16("fax1")));
307  list_.push_back(NULL);
308  iter_ = list_.begin();
309  field_.reset(PhoneField::Parse(&iter_, false));
310  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
311  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
312  ASSERT_TRUE(
313      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
314  // It should be FAX, based on the other phone in the group.
315  EXPECT_EQ(PHONE_FAX_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
316  ASSERT_TRUE(
317      field_type_map_.find(ASCIIToUTF16("fax1")) != field_type_map_.end());
318  EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("fax1")]);
319}
320
321TEST_F(PhoneFieldTest, ThreePartFaxNumberPrefixSuffix) {
322  list_.push_back(
323      new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax:"),
324                                               ASCIIToUTF16("area"),
325                                               string16(),
326                                               ASCIIToUTF16("text"),
327                                               0,
328                                               false),
329                        ASCIIToUTF16("areacode1")));
330  list_.push_back(
331      new AutofillField(webkit_glue::FormField(string16(),
332                                               ASCIIToUTF16("prefix"),
333                                               string16(),
334                                               ASCIIToUTF16("text"),
335                                               0,
336                                               false),
337                        ASCIIToUTF16("prefix1")));
338  list_.push_back(
339      new AutofillField(webkit_glue::FormField(string16(),
340                                               ASCIIToUTF16("suffix"),
341                                               string16(),
342                                               ASCIIToUTF16("text"),
343                                               0,
344                                               false),
345                        ASCIIToUTF16("suffix1")));
346  list_.push_back(NULL);
347  iter_ = list_.begin();
348  field_.reset(PhoneField::Parse(&iter_, false));
349  ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
350  ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
351  ASSERT_TRUE(
352      field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
353  EXPECT_EQ(PHONE_FAX_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
354  ASSERT_TRUE(
355      field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end());
356  EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]);
357  ASSERT_TRUE(
358      field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end());
359  EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]);
360}
361
362}  // namespace
363