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