Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / components / autofill / core / browser / contact_info_unittest.cc
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 "components/autofill/core/browser/contact_info.h"
6
7 #include "base/basictypes.h"
8 #include "base/format_macros.h"
9 #include "base/strings/string_util.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "components/autofill/core/browser/autofill_type.h"
13 #include "components/autofill/core/browser/field_types.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 using base::ASCIIToUTF16;
17
18 namespace autofill {
19
20 struct FullNameTestCase {
21   std::string full_name_input;
22   std::string given_name_output;
23   std::string middle_name_output;
24   std::string family_name_output;
25 } full_name_test_cases[] = {
26   { "", "", "", "" },
27   { "John Smith", "John", "", "Smith" },
28   { "Julien van der Poel", "Julien", "", "van der Poel" },
29   { "John J Johnson", "John", "J", "Johnson" },
30   { "John Smith, Jr.", "John", "", "Smith" },
31   { "Mr John Smith", "John", "", "Smith" },
32   { "Mr. John Smith", "John", "", "Smith" },
33   { "Mr. John Smith, M.D.", "John", "", "Smith" },
34   { "Mr. John Smith, MD", "John", "", "Smith" },
35   { "Mr. John Smith MD", "John", "", "Smith" },
36   { "William Hubert J.R.", "William", "Hubert", "J.R." },
37   { "John Ma", "John", "", "Ma" },
38   { "John Smith, MA", "John", "", "Smith" },
39   { "John Jacob Jingleheimer Smith", "John Jacob", "Jingleheimer", "Smith" },
40   { "Virgil", "Virgil", "", "" },
41   { "Murray Gell-Mann", "Murray", "", "Gell-Mann" },
42   { "Mikhail Yevgrafovich Saltykov-Shchedrin", "Mikhail", "Yevgrafovich",
43     "Saltykov-Shchedrin" },
44   { "Arthur Ignatius Conan Doyle", "Arthur Ignatius", "Conan", "Doyle" },
45 };
46
47 TEST(NameInfoTest, SetFullName) {
48   for (size_t i = 0; i < arraysize(full_name_test_cases); ++i) {
49     const FullNameTestCase& test_case = full_name_test_cases[i];
50     SCOPED_TRACE(test_case.full_name_input);
51
52     NameInfo name;
53     name.SetInfo(AutofillType(NAME_FULL),
54                  ASCIIToUTF16(test_case.full_name_input),
55                  "en-US");
56     EXPECT_EQ(ASCIIToUTF16(test_case.given_name_output),
57               name.GetInfo(AutofillType(NAME_FIRST), "en-US"));
58     EXPECT_EQ(ASCIIToUTF16(test_case.middle_name_output),
59               name.GetInfo(AutofillType(NAME_MIDDLE), "en-US"));
60     EXPECT_EQ(ASCIIToUTF16(test_case.family_name_output),
61               name.GetInfo(AutofillType(NAME_LAST), "en-US"));
62     EXPECT_EQ(ASCIIToUTF16(test_case.full_name_input),
63               name.GetInfo(AutofillType(NAME_FULL), "en-US"));
64   }
65 }
66
67 TEST(NameInfoTest, GetFullName) {
68   NameInfo name;
69   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
70   name.SetRawInfo(NAME_MIDDLE, base::string16());
71   name.SetRawInfo(NAME_LAST, base::string16());
72   EXPECT_EQ(ASCIIToUTF16("First"), name.GetRawInfo(NAME_FIRST));
73   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_MIDDLE));
74   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_LAST));
75   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
76   EXPECT_EQ(ASCIIToUTF16("First"),
77             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
78
79   name.SetRawInfo(NAME_FIRST, base::string16());
80   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
81   name.SetRawInfo(NAME_LAST, base::string16());
82   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FIRST));
83   EXPECT_EQ(ASCIIToUTF16("Middle"), name.GetRawInfo(NAME_MIDDLE));
84   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_LAST));
85   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
86   EXPECT_EQ(ASCIIToUTF16("Middle"),
87             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
88
89   name.SetRawInfo(NAME_FIRST, base::string16());
90   name.SetRawInfo(NAME_MIDDLE, base::string16());
91   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
92   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FIRST));
93   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_MIDDLE));
94   EXPECT_EQ(ASCIIToUTF16("Last"), name.GetRawInfo(NAME_LAST));
95   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
96   EXPECT_EQ(ASCIIToUTF16("Last"),
97             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
98
99   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
100   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
101   name.SetRawInfo(NAME_LAST, base::string16());
102   EXPECT_EQ(ASCIIToUTF16("First"), name.GetRawInfo(NAME_FIRST));
103   EXPECT_EQ(ASCIIToUTF16("Middle"), name.GetRawInfo(NAME_MIDDLE));
104   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_LAST));
105   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
106   EXPECT_EQ(ASCIIToUTF16("First Middle"),
107             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
108
109   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
110   name.SetRawInfo(NAME_MIDDLE, base::string16());
111   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
112   EXPECT_EQ(ASCIIToUTF16("First"), name.GetRawInfo(NAME_FIRST));
113   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_MIDDLE));
114   EXPECT_EQ(ASCIIToUTF16("Last"), name.GetRawInfo(NAME_LAST));
115   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
116   EXPECT_EQ(ASCIIToUTF16("First Last"),
117             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
118
119   name.SetRawInfo(NAME_FIRST, base::string16());
120   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
121   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
122   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FIRST));
123   EXPECT_EQ(ASCIIToUTF16("Middle"), name.GetRawInfo(NAME_MIDDLE));
124   EXPECT_EQ(ASCIIToUTF16("Last"), name.GetRawInfo(NAME_LAST));
125   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
126   EXPECT_EQ(ASCIIToUTF16("Middle Last"),
127             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
128
129   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
130   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
131   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
132   EXPECT_EQ(ASCIIToUTF16("First"), name.GetRawInfo(NAME_FIRST));
133   EXPECT_EQ(ASCIIToUTF16("Middle"), name.GetRawInfo(NAME_MIDDLE));
134   EXPECT_EQ(ASCIIToUTF16("Last"), name.GetRawInfo(NAME_LAST));
135   EXPECT_EQ(base::string16(), name.GetRawInfo(NAME_FULL));
136   EXPECT_EQ(ASCIIToUTF16("First Middle Last"),
137             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
138
139   name.SetRawInfo(NAME_FULL, ASCIIToUTF16("First Middle Last, MD"));
140   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
141   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
142   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
143   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last, MD"));
144   EXPECT_EQ(ASCIIToUTF16("First Middle Last, MD"),
145             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
146
147   // Setting a name to the value it already has: no change.
148   name.SetInfo(AutofillType(NAME_FIRST), ASCIIToUTF16("First"), "en-US");
149   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
150   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
151   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
152   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last, MD"));
153   EXPECT_EQ(ASCIIToUTF16("First Middle Last, MD"),
154             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
155
156   // Setting raw info: no change. (Even though this leads to a slightly
157   // inconsitent state.)
158   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Second"));
159   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("Second"));
160   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
161   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
162   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last, MD"));
163   EXPECT_EQ(ASCIIToUTF16("First Middle Last, MD"),
164             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
165
166   // Changing something (e.g., the first name) clears the stored full name.
167   name.SetInfo(AutofillType(NAME_FIRST), ASCIIToUTF16("Third"), "en-US");
168   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("Third"));
169   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
170   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
171   EXPECT_EQ(ASCIIToUTF16("Third Middle Last"),
172             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
173 }
174
175 TEST(NameInfoTest, ParsedNamesAreEqual) {
176   struct TestCase {
177     std::string starting_names[3];
178     std::string additional_names[3];
179     bool expected_result;
180   };
181
182   struct TestCase test_cases[] = {
183       // Identical name comparison.
184       {{"Marion", "Mitchell", "Morrison"},
185        {"Marion", "Mitchell", "Morrison"},
186        true},
187
188       // Case-insensative comparisons.
189       {{"Marion", "Mitchell", "Morrison"},
190        {"Marion", "Mitchell", "MORRISON"},
191        true},
192       {{"Marion", "Mitchell", "Morrison"},
193        {"MARION", "Mitchell", "MORRISON"},
194        true},
195       {{"Marion", "Mitchell", "Morrison"},
196        {"MARION", "MITCHELL", "MORRISON"},
197        true},
198       {{"Marion", "", "Mitchell Morrison"},
199        {"MARION", "", "MITCHELL MORRISON"},
200        true},
201       {{"Marion Mitchell", "", "Morrison"},
202        {"MARION MITCHELL", "", "MORRISON"},
203        true},
204
205       // Identical full names but different canonical forms.
206       {{"Marion", "Mitchell", "Morrison"},
207        {"Marion", "", "Mitchell Morrison"},
208        false},
209       {{"Marion", "Mitchell", "Morrison"},
210        {"Marion Mitchell", "", "MORRISON"},
211        false},
212
213       // Different names.
214       {{"Marion", "Mitchell", "Morrison"}, {"Marion", "M.", "Morrison"}, false},
215       {{"Marion", "Mitchell", "Morrison"}, {"MARION", "M.", "MORRISON"}, false},
216       {{"Marion", "Mitchell", "Morrison"},
217        {"David", "Mitchell", "Morrison"},
218        false},
219   };
220
221   for (size_t i = 0; i < arraysize(test_cases); ++i) {
222     SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
223
224     // Construct the starting_profile.
225     NameInfo starting_profile;
226     starting_profile.SetRawInfo(NAME_FIRST,
227                                 ASCIIToUTF16(test_cases[i].starting_names[0]));
228     starting_profile.SetRawInfo(NAME_MIDDLE,
229                                 ASCIIToUTF16(test_cases[i].starting_names[1]));
230     starting_profile.SetRawInfo(NAME_LAST,
231                                 ASCIIToUTF16(test_cases[i].starting_names[2]));
232
233     // Construct the additional_profile.
234     NameInfo additional_profile;
235     additional_profile.SetRawInfo(
236         NAME_FIRST, ASCIIToUTF16(test_cases[i].additional_names[0]));
237     additional_profile.SetRawInfo(
238         NAME_MIDDLE, ASCIIToUTF16(test_cases[i].additional_names[1]));
239     additional_profile.SetRawInfo(
240         NAME_LAST, ASCIIToUTF16(test_cases[i].additional_names[2]));
241
242     // Verify the test expectations.
243     EXPECT_EQ(test_cases[i].expected_result,
244               starting_profile.ParsedNamesAreEqual(additional_profile));
245   }
246 }
247
248 }  // namespace autofill