• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 using base::ASCIIToUTF16;
15 
16 namespace autofill {
17 
18 class PhoneFieldTest : public testing::Test {
19  public:
PhoneFieldTest()20   PhoneFieldTest() {}
21 
22  protected:
23   ScopedVector<AutofillField> list_;
24   scoped_ptr<PhoneField> field_;
25   ServerFieldTypeMap field_type_map_;
26 
27   // Downcast for tests.
Parse(AutofillScanner * scanner)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 
TEST_F(PhoneFieldTest,Empty)36 TEST_F(PhoneFieldTest, Empty) {
37   AutofillScanner scanner(list_.get());
38   field_.reset(Parse(&scanner));
39   ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get());
40 }
41 
TEST_F(PhoneFieldTest,NonParse)42 TEST_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 
TEST_F(PhoneFieldTest,ParseOneLinePhone)49 TEST_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 
TEST_F(PhoneFieldTest,ParseTwoLinePhone)66 TEST_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 
TEST_F(PhoneFieldTest,ThreePartPhoneNumber)90 TEST_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.
TEST_F(PhoneFieldTest,ThreePartPhoneNumberPrefixSuffix)139 TEST_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 
TEST_F(PhoneFieldTest,ThreePartPhoneNumberPrefixSuffix2)170 TEST_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 
TEST_F(PhoneFieldTest,CountryAndCityAndPhoneNumber)204 TEST_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