Home | History | Annotate | Download | only in browser
      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/string16.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "components/autofill/core/browser/address_field.h"
     10 #include "components/autofill/core/browser/autofill_field.h"
     11 #include "components/autofill/core/browser/autofill_scanner.h"
     12 #include "components/autofill/core/common/form_field_data.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 using base::ASCIIToUTF16;
     16 
     17 namespace autofill {
     18 
     19 class AddressFieldTest : public testing::Test {
     20  public:
     21   AddressFieldTest() {}
     22 
     23  protected:
     24   ScopedVector<AutofillField> list_;
     25   scoped_ptr<AddressField> field_;
     26   ServerFieldTypeMap field_type_map_;
     27 
     28   // Downcast for tests.
     29   static AddressField* Parse(AutofillScanner* scanner) {
     30     return static_cast<AddressField*>(AddressField::Parse(scanner));
     31   }
     32 
     33  private:
     34   DISALLOW_COPY_AND_ASSIGN(AddressFieldTest);
     35 };
     36 
     37 TEST_F(AddressFieldTest, Empty) {
     38   AutofillScanner scanner(list_.get());
     39   field_.reset(Parse(&scanner));
     40   ASSERT_EQ(static_cast<AddressField*>(NULL), field_.get());
     41 }
     42 
     43 TEST_F(AddressFieldTest, NonParse) {
     44   list_.push_back(new AutofillField);
     45   AutofillScanner scanner(list_.get());
     46   field_.reset(Parse(&scanner));
     47   ASSERT_EQ(static_cast<AddressField*>(NULL), field_.get());
     48 }
     49 
     50 TEST_F(AddressFieldTest, ParseOneLineAddress) {
     51   FormFieldData field;
     52   field.form_control_type = "text";
     53 
     54   field.label = ASCIIToUTF16("Address");
     55   field.name = ASCIIToUTF16("address");
     56   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr1")));
     57 
     58   AutofillScanner scanner(list_.get());
     59   field_.reset(Parse(&scanner));
     60   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
     61   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
     62   ASSERT_TRUE(
     63       field_type_map_.find(ASCIIToUTF16("addr1")) != field_type_map_.end());
     64   EXPECT_EQ(ADDRESS_HOME_LINE1, field_type_map_[ASCIIToUTF16("addr1")]);
     65 }
     66 
     67 TEST_F(AddressFieldTest, ParseTwoLineAddress) {
     68   FormFieldData field;
     69   field.form_control_type = "text";
     70 
     71   field.label = ASCIIToUTF16("Address");
     72   field.name = ASCIIToUTF16("address");
     73   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr1")));
     74 
     75   field.label = base::string16();
     76   field.name = base::string16();
     77   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr2")));
     78 
     79   AutofillScanner scanner(list_.get());
     80   field_.reset(Parse(&scanner));
     81   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
     82   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
     83   ASSERT_TRUE(
     84       field_type_map_.find(ASCIIToUTF16("addr1")) != field_type_map_.end());
     85   EXPECT_EQ(ADDRESS_HOME_LINE1, field_type_map_[ASCIIToUTF16("addr1")]);
     86   ASSERT_TRUE(
     87       field_type_map_.find(ASCIIToUTF16("addr2")) != field_type_map_.end());
     88   EXPECT_EQ(ADDRESS_HOME_LINE2, field_type_map_[ASCIIToUTF16("addr2")]);
     89 }
     90 
     91 TEST_F(AddressFieldTest, ParseThreeLineAddress) {
     92   FormFieldData field;
     93   field.form_control_type = "text";
     94 
     95   field.label = ASCIIToUTF16("Address Line1");
     96   field.name = ASCIIToUTF16("Address1");
     97   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr1")));
     98 
     99   field.label = ASCIIToUTF16("Address Line2");
    100   field.name = ASCIIToUTF16("Address2");
    101   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr2")));
    102 
    103   field.label = ASCIIToUTF16("Address Line3");
    104   field.name = ASCIIToUTF16("Address3");
    105   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr3")));
    106 
    107   AutofillScanner scanner(list_.get());
    108   field_.reset(Parse(&scanner));
    109   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    110   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    111   ASSERT_TRUE(
    112       field_type_map_.find(ASCIIToUTF16("addr1")) != field_type_map_.end());
    113   EXPECT_EQ(ADDRESS_HOME_LINE1, field_type_map_[ASCIIToUTF16("addr1")]);
    114   ASSERT_TRUE(
    115       field_type_map_.find(ASCIIToUTF16("addr2")) != field_type_map_.end());
    116   EXPECT_EQ(ADDRESS_HOME_LINE2, field_type_map_[ASCIIToUTF16("addr2")]);
    117   ASSERT_TRUE(
    118       field_type_map_.find(ASCIIToUTF16("addr3")) == field_type_map_.end());
    119 }
    120 
    121 TEST_F(AddressFieldTest, ParseStreetAddressFromTextArea) {
    122   FormFieldData field;
    123   field.form_control_type = "textarea";
    124 
    125   field.label = ASCIIToUTF16("Address");
    126   field.name = ASCIIToUTF16("address");
    127   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr")));
    128 
    129   AutofillScanner scanner(list_.get());
    130   field_.reset(Parse(&scanner));
    131   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    132   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    133   ASSERT_TRUE(
    134       field_type_map_.find(ASCIIToUTF16("addr")) != field_type_map_.end());
    135   EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS, field_type_map_[ASCIIToUTF16("addr")]);
    136 }
    137 
    138 TEST_F(AddressFieldTest, ParseCity) {
    139   FormFieldData field;
    140   field.form_control_type = "text";
    141 
    142   field.label = ASCIIToUTF16("City");
    143   field.name = ASCIIToUTF16("city");
    144   list_.push_back(new AutofillField(field, ASCIIToUTF16("city1")));
    145 
    146   AutofillScanner scanner(list_.get());
    147   field_.reset(Parse(&scanner));
    148   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    149   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    150   ASSERT_TRUE(
    151       field_type_map_.find(ASCIIToUTF16("city1")) != field_type_map_.end());
    152   EXPECT_EQ(ADDRESS_HOME_CITY, field_type_map_[ASCIIToUTF16("city1")]);
    153 }
    154 
    155 TEST_F(AddressFieldTest, ParseState) {
    156   FormFieldData field;
    157   field.form_control_type = "text";
    158 
    159   field.label = ASCIIToUTF16("State");
    160   field.name = ASCIIToUTF16("state");
    161   list_.push_back(new AutofillField(field, ASCIIToUTF16("state1")));
    162 
    163   AutofillScanner scanner(list_.get());
    164   field_.reset(Parse(&scanner));
    165   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    166   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    167   ASSERT_TRUE(
    168       field_type_map_.find(ASCIIToUTF16("state1")) != field_type_map_.end());
    169   EXPECT_EQ(ADDRESS_HOME_STATE, field_type_map_[ASCIIToUTF16("state1")]);
    170 }
    171 
    172 TEST_F(AddressFieldTest, ParseZip) {
    173   FormFieldData field;
    174   field.form_control_type = "text";
    175 
    176   field.label = ASCIIToUTF16("Zip");
    177   field.name = ASCIIToUTF16("zip");
    178   list_.push_back(new AutofillField(field, ASCIIToUTF16("zip1")));
    179 
    180   AutofillScanner scanner(list_.get());
    181   field_.reset(Parse(&scanner));
    182   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    183   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    184   ASSERT_TRUE(
    185       field_type_map_.find(ASCIIToUTF16("zip1")) != field_type_map_.end());
    186   EXPECT_EQ(ADDRESS_HOME_ZIP, field_type_map_[ASCIIToUTF16("zip1")]);
    187 }
    188 
    189 TEST_F(AddressFieldTest, ParseStateAndZipOneLabel) {
    190   FormFieldData field;
    191   field.form_control_type = "text";
    192 
    193   field.label = ASCIIToUTF16("State/Province, Zip/Postal Code");
    194   field.name = ASCIIToUTF16("state");
    195   list_.push_back(new AutofillField(field, ASCIIToUTF16("state")));
    196 
    197   field.label = ASCIIToUTF16("State/Province, Zip/Postal Code");
    198   field.name = ASCIIToUTF16("zip");
    199   list_.push_back(new AutofillField(field, ASCIIToUTF16("zip")));
    200 
    201   AutofillScanner scanner(list_.get());
    202   field_.reset(Parse(&scanner));
    203   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    204   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    205   ASSERT_TRUE(
    206       field_type_map_.find(ASCIIToUTF16("state")) != field_type_map_.end());
    207   EXPECT_EQ(ADDRESS_HOME_STATE, field_type_map_[ASCIIToUTF16("state")]);
    208   ASSERT_TRUE(
    209       field_type_map_.find(ASCIIToUTF16("zip")) != field_type_map_.end());
    210   EXPECT_EQ(ADDRESS_HOME_ZIP, field_type_map_[ASCIIToUTF16("zip")]);
    211 }
    212 
    213 TEST_F(AddressFieldTest, ParseCountry) {
    214   FormFieldData field;
    215   field.form_control_type = "text";
    216 
    217   field.label = ASCIIToUTF16("Country");
    218   field.name = ASCIIToUTF16("country");
    219   list_.push_back(new AutofillField(field, ASCIIToUTF16("country1")));
    220 
    221   AutofillScanner scanner(list_.get());
    222   field_.reset(Parse(&scanner));
    223   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    224   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    225   ASSERT_TRUE(
    226       field_type_map_.find(ASCIIToUTF16("country1")) != field_type_map_.end());
    227   EXPECT_EQ(ADDRESS_HOME_COUNTRY, field_type_map_[ASCIIToUTF16("country1")]);
    228 }
    229 
    230 TEST_F(AddressFieldTest, ParseTwoLineAddressMissingLabel) {
    231   FormFieldData field;
    232   field.form_control_type = "text";
    233 
    234   field.label = ASCIIToUTF16("Address");
    235   field.name = ASCIIToUTF16("address");
    236   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr1")));
    237 
    238   field.label = base::string16();
    239   field.name = ASCIIToUTF16("bogus");
    240   list_.push_back(new AutofillField(field, ASCIIToUTF16("addr2")));
    241 
    242   AutofillScanner scanner(list_.get());
    243   field_.reset(Parse(&scanner));
    244   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    245   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    246   ASSERT_TRUE(
    247       field_type_map_.find(ASCIIToUTF16("addr1")) != field_type_map_.end());
    248   EXPECT_EQ(ADDRESS_HOME_LINE1, field_type_map_[ASCIIToUTF16("addr1")]);
    249   ASSERT_TRUE(
    250       field_type_map_.find(ASCIIToUTF16("addr2")) != field_type_map_.end());
    251   EXPECT_EQ(ADDRESS_HOME_LINE2, field_type_map_[ASCIIToUTF16("addr2")]);
    252 }
    253 
    254 TEST_F(AddressFieldTest, ParseCompany) {
    255   FormFieldData field;
    256   field.form_control_type = "text";
    257 
    258   field.label = ASCIIToUTF16("Company");
    259   field.name = ASCIIToUTF16("company");
    260   list_.push_back(new AutofillField(field, ASCIIToUTF16("company1")));
    261 
    262   AutofillScanner scanner(list_.get());
    263   field_.reset(Parse(&scanner));
    264   ASSERT_NE(static_cast<AddressField*>(NULL), field_.get());
    265   ASSERT_TRUE(field_->ClassifyField(&field_type_map_));
    266   ASSERT_TRUE(
    267       field_type_map_.find(ASCIIToUTF16("company1")) != field_type_map_.end());
    268   EXPECT_EQ(COMPANY_NAME, field_type_map_[ASCIIToUTF16("company1")]);
    269 }
    270 
    271 }  // namespace autofill
    272