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