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_vector.h"
6#include "base/strings/string16.h"
7#include "base/strings/utf_string_conversions.h"
8#include "components/autofill/core/browser/autofill_field.h"
9#include "components/autofill/core/browser/form_field.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12using base::ASCIIToUTF16;
13
14namespace autofill {
15
16TEST(FormFieldTest, Match) {
17  AutofillField field;
18
19  // Empty strings match.
20  EXPECT_TRUE(FormField::Match(&field, base::string16(),
21                               FormField::MATCH_LABEL));
22
23  // Empty pattern matches non-empty string.
24  field.label = ASCIIToUTF16("a");
25  EXPECT_TRUE(FormField::Match(&field, base::string16(),
26                               FormField::MATCH_LABEL));
27
28  // Strictly empty pattern matches empty string.
29  field.label = base::string16();
30  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^$"),
31              FormField::MATCH_LABEL));
32
33  // Strictly empty pattern does not match non-empty string.
34  field.label = ASCIIToUTF16("a");
35  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^$"),
36               FormField::MATCH_LABEL));
37
38  // Non-empty pattern doesn't match empty string.
39  field.label = base::string16();
40  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("a"),
41               FormField::MATCH_LABEL));
42
43  // Beginning of line.
44  field.label = ASCIIToUTF16("head_tail");
45  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head"),
46              FormField::MATCH_LABEL));
47  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail"),
48               FormField::MATCH_LABEL));
49
50  // End of line.
51  field.label = ASCIIToUTF16("head_tail");
52  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head$"),
53               FormField::MATCH_LABEL));
54  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail$"),
55              FormField::MATCH_LABEL));
56
57  // Exact.
58  field.label = ASCIIToUTF16("head_tail");
59  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^head$"),
60               FormField::MATCH_LABEL));
61  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail$"),
62               FormField::MATCH_LABEL));
63  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head_tail$"),
64              FormField::MATCH_LABEL));
65
66  // Escaped dots.
67  field.label = ASCIIToUTF16("m.i.");
68  // Note: This pattern is misleading as the "." characters are wild cards.
69  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."),
70              FormField::MATCH_LABEL));
71  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."),
72              FormField::MATCH_LABEL));
73  field.label = ASCIIToUTF16("mXiX");
74  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."),
75              FormField::MATCH_LABEL));
76  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."),
77               FormField::MATCH_LABEL));
78
79  // Repetition.
80  field.label = ASCIIToUTF16("headtail");
81  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
82              FormField::MATCH_LABEL));
83  field.label = ASCIIToUTF16("headXtail");
84  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
85              FormField::MATCH_LABEL));
86  field.label = ASCIIToUTF16("headXXXtail");
87  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"),
88              FormField::MATCH_LABEL));
89  field.label = ASCIIToUTF16("headtail");
90  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
91               FormField::MATCH_LABEL));
92  field.label = ASCIIToUTF16("headXtail");
93  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
94              FormField::MATCH_LABEL));
95  field.label = ASCIIToUTF16("headXXXtail");
96  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"),
97              FormField::MATCH_LABEL));
98
99  // Alternation.
100  field.label = ASCIIToUTF16("head_tail");
101  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head|other"),
102              FormField::MATCH_LABEL));
103  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail|other"),
104              FormField::MATCH_LABEL));
105  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("bad|good"),
106               FormField::MATCH_LABEL));
107
108  // Case sensitivity.
109  field.label = ASCIIToUTF16("xxxHeAd_tAiLxxx");
110  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head_tail"),
111              FormField::MATCH_LABEL));
112
113  // Word boundaries.
114  field.label = ASCIIToUTF16("contains word:");
115  EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("\\bword\\b"),
116                               FormField::MATCH_LABEL));
117  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcon\\b"),
118                                FormField::MATCH_LABEL));
119  // Make sure the circumflex in 'crepe' is not treated as a word boundary.
120  field.label = base::UTF8ToUTF16("cr" "\xC3\xAA" "pe");
121  EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcr\\b"),
122                                FormField::MATCH_LABEL));
123}
124
125// Test that we ignore checkable elements.
126TEST(FormFieldTest, ParseFormFields) {
127  ScopedVector<AutofillField> fields;
128  FormFieldData field_data;
129  field_data.form_control_type = "text";
130
131  field_data.label = ASCIIToUTF16("Address line1");
132  fields.push_back(new AutofillField(field_data, field_data.label));
133
134  field_data.is_checkable = true;
135  field_data.label = ASCIIToUTF16("Is PO Box");
136  fields.push_back(new AutofillField(field_data, field_data.label));
137
138  // reset is_checkable to false.
139  field_data.is_checkable = false;
140  field_data.label = ASCIIToUTF16("Address line2");
141  fields.push_back(new AutofillField(field_data, field_data.label));
142
143  ServerFieldTypeMap field_type_map;
144  FormField::ParseFormFields(fields.get(), &field_type_map);
145  // Checkable element shouldn't interfere with inference of Address line2.
146  EXPECT_EQ(2U, field_type_map.size());
147
148  EXPECT_EQ(ADDRESS_HOME_LINE1,
149            field_type_map.find(ASCIIToUTF16("Address line1"))->second);
150  EXPECT_EQ(ADDRESS_HOME_LINE2,
151            field_type_map.find(ASCIIToUTF16("Address line2"))->second);
152}
153
154}  // namespace autofill
155