1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_field.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_field.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormFieldTest, Match) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillField field;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty strings match.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, base::string16(),
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               FormField::MATCH_LABEL));
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty pattern matches non-empty string.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("a");
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, base::string16(),
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               FormField::MATCH_LABEL));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strictly empty pattern matches empty string.
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^$"),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strictly empty pattern does not match non-empty string.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("a");
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^$"),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non-empty pattern doesn't match empty string.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("a"),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Beginning of line.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("head_tail");
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head"),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail"),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End of line.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("head_tail");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head$"),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail$"),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exact.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("head_tail");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^head$"),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail$"),
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head_tail$"),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Escaped dots.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("m.i.");
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This pattern is misleading as the "." characters are wild cards.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("mXiX");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repetition.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headtail");
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headXtail");
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headXXXtail");
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headtail");
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headXtail");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("headXXXtail");
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Alternation.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("head_tail");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head|other"),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail|other"),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("bad|good"),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               FormField::MATCH_LABEL));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Case sensitivity.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("xxxHeAd_tAiLxxx");
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head_tail"),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              FormField::MATCH_LABEL));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Word boundaries.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("contains word:");
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("\\bword\\b"),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               FormField::MATCH_LABEL));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcon\\b"),
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                FormField::MATCH_LABEL));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the circumflex in 'crepe' is not treated as a word boundary.
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field.label = base::UTF8ToUTF16("cr" "\xC3\xAA" "pe");
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcr\\b"),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                FormField::MATCH_LABEL));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we ignore checkable elements.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(FormFieldTest, ParseFormFields) {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<AutofillField> fields;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field_data;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.form_control_type = "text";
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.label = ASCIIToUTF16("Address line1");
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fields.push_back(new AutofillField(field_data, field_data.label));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.is_checkable = true;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.label = ASCIIToUTF16("Is PO Box");
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fields.push_back(new AutofillField(field_data, field_data.label));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reset is_checkable to false.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.is_checkable = false;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_data.label = ASCIIToUTF16("Address line2");
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fields.push_back(new AutofillField(field_data, field_data.label));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeMap field_type_map;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormField::ParseFormFields(fields.get(), &field_type_map);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checkable element shouldn't interfere with inference of Address line2.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, field_type_map.size());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            field_type_map.find(ASCIIToUTF16("Address line1"))->second);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            field_type_map.find(ASCIIToUTF16("Address line2"))->second);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
155