// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/utf_string_conversions.h" #include "chrome/browser/autofill/autofill_field.h" #include "chrome/browser/autofill/phone_field.h" #include "testing/gtest/include/gtest/gtest.h" #include "webkit/glue/form_field.h" namespace { class PhoneFieldTest : public testing::Test { public: PhoneFieldTest() {} protected: ScopedVector<AutofillField> list_; scoped_ptr<PhoneField> field_; FieldTypeMap field_type_map_; std::vector<AutofillField*>::const_iterator iter_; private: DISALLOW_COPY_AND_ASSIGN(PhoneFieldTest); }; TEST_F(PhoneFieldTest, Empty) { list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get()); } TEST_F(PhoneFieldTest, NonParse) { list_.push_back(new AutofillField); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_EQ(static_cast<PhoneField*>(NULL), field_.get()); } TEST_F(PhoneFieldTest, ParseOneLinePhone) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"), ASCIIToUTF16("phone"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("phone1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); } TEST_F(PhoneFieldTest, ParseOneLinePhoneEcml) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"), ASCIIToUTF16(kEcmlShipToPhone), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("phone1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, true)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); } TEST_F(PhoneFieldTest, ParseTwoLinePhone) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"), ASCIIToUTF16("area code"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"), ASCIIToUTF16("phone"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("phone1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); } TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlShipTo) { list_.push_back( new AutofillField( webkit_glue::FormField(ASCIIToUTF16("Area Code"), ASCIIToUTF16(kEcmlShipToPostalCode), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"), ASCIIToUTF16(kEcmlShipToPhone), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("phone1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); } TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlBillTo) { list_.push_back( new AutofillField( webkit_glue::FormField(ASCIIToUTF16("Area Code"), ASCIIToUTF16(kEcmlBillToPostalCode), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone"), ASCIIToUTF16(kEcmlBillToPhone), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("phone1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("phone1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]); } TEST_F(PhoneFieldTest, ThreePartPhoneNumber) { // Phone in format <field> - <field> - <field> could be either // <area code> - <prefix> - <suffix>, or // <country code> - <area code> - <phone>. The only distinguishing feature is // size: <prefix> is no bigger than 3 characters, and <suffix> is no bigger // than 4. list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone:"), ASCIIToUTF16("dayphone1"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("-"), ASCIIToUTF16("dayphone2"), string16(), ASCIIToUTF16("text"), 3, false), ASCIIToUTF16("prefix1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("-"), ASCIIToUTF16("dayphone3"), string16(), ASCIIToUTF16("text"), 4, false), ASCIIToUTF16("suffix1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("ext.:"), ASCIIToUTF16("dayphone4"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("ext1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]); } // This scenario of explicitly labeled "prefix" and "suffix" phone numbers // encountered in http://crbug.com/40694 with page // https://www.wrapables.com/jsp/Signup.jsp. TEST_F(PhoneFieldTest, ThreePartPhoneNumberPrefixSuffix) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Phone:"), ASCIIToUTF16("area"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(string16(), ASCIIToUTF16("prefix"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("prefix1"))); list_.push_back( new AutofillField(webkit_glue::FormField(string16(), ASCIIToUTF16("suffix"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("suffix1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]); } TEST_F(PhoneFieldTest, ParseOneLineFax) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax"), ASCIIToUTF16("fax"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("fax1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("fax1")) != field_type_map_.end()); EXPECT_EQ(PHONE_FAX_WHOLE_NUMBER, field_type_map_[ASCIIToUTF16("fax1")]); } TEST_F(PhoneFieldTest, ParseTwoLineFax) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"), ASCIIToUTF16("area code"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax"), ASCIIToUTF16("fax"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("fax1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); // It should be FAX, based on the other phone in the group. EXPECT_EQ(PHONE_FAX_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("fax1")) != field_type_map_.end()); EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("fax1")]); } TEST_F(PhoneFieldTest, ThreePartFaxNumberPrefixSuffix) { list_.push_back( new AutofillField(webkit_glue::FormField(ASCIIToUTF16("Fax:"), ASCIIToUTF16("area"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("areacode1"))); list_.push_back( new AutofillField(webkit_glue::FormField(string16(), ASCIIToUTF16("prefix"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("prefix1"))); list_.push_back( new AutofillField(webkit_glue::FormField(string16(), ASCIIToUTF16("suffix"), string16(), ASCIIToUTF16("text"), 0, false), ASCIIToUTF16("suffix1"))); list_.push_back(NULL); iter_ = list_.begin(); field_.reset(PhoneField::Parse(&iter_, false)); ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get()); ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_)); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end()); EXPECT_EQ(PHONE_FAX_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]); ASSERT_TRUE( field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end()); EXPECT_EQ(PHONE_FAX_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]); } } // namespace