• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/basictypes.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/memory/scoped_vector.h"
8 #include "base/stl_util-inl.h"
9 #include "base/string16.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/autofill/autofill_common_test.h"
12 #include "chrome/browser/autofill/autofill_profile.h"
13 #include "chrome/common/guid.h"
14 #include "grit/generated_resources.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace {
18 
UpdateProfileLabel(AutofillProfile * profile)19 bool UpdateProfileLabel(AutofillProfile *profile) {
20   std::vector<AutofillProfile*> profiles;
21   profiles.push_back(profile);
22   return AutofillProfile::AdjustInferredLabels(&profiles);
23 }
24 
25 }  // namespace
26 
27 // Tests different possibilities for summary string generation.
28 // Based on existence of first name, last name, and address line 1.
TEST(AutofillProfileTest,PreviewSummaryString)29 TEST(AutofillProfileTest, PreviewSummaryString) {
30   // Case 0/null: ""
31   AutofillProfile profile0;
32   // Empty profile - nothing to update.
33   EXPECT_FALSE(UpdateProfileLabel(&profile0));
34   string16 summary0 = profile0.Label();
35   EXPECT_EQ(string16(), summary0);
36 
37   // Case 0a/empty name and address, so the first two fields of the rest of the
38   // data is used: "Hollywood, CA"
39   AutofillProfile profile00;
40   autofill_test::SetProfileInfo(&profile00, "", "Mitchell", "",
41       "johnwayne@me.xyz", "Fox", "", "unit 5", "Hollywood", "CA", "91601", "US",
42       "12345678910", "01987654321");
43   EXPECT_TRUE(UpdateProfileLabel(&profile00));
44   string16 summary00 = profile00.Label();
45   EXPECT_EQ(ASCIIToUTF16("Hollywood, CA"), summary00);
46 
47   // Case 1: "<address>"
48   AutofillProfile profile1;
49   autofill_test::SetProfileInfo(&profile1, "", "Mitchell", "",
50       "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
51       "91601", "US", "12345678910", "01987654321");
52   EXPECT_TRUE(UpdateProfileLabel(&profile1));
53   string16 summary1 = profile1.Label();
54   EXPECT_EQ(ASCIIToUTF16("123 Zoo St., Hollywood"), summary1);
55 
56   // Case 2: "<lastname>"
57   AutofillProfile profile2;
58   autofill_test::SetProfileInfo(&profile2, "", "Mitchell",
59       "Morrison", "johnwayne@me.xyz", "Fox", "", "unit 5", "Hollywood", "CA",
60       "91601", "US", "12345678910", "01987654321");
61   EXPECT_TRUE(UpdateProfileLabel(&profile2));
62   string16 summary2 = profile2.Label();
63   // Summary does include full name which is empty if the first name is empty.
64   EXPECT_EQ(ASCIIToUTF16("Hollywood, CA"), summary2);
65 
66   // Case 3: "<lastname>, <address>"
67   AutofillProfile profile3;
68   autofill_test::SetProfileInfo(&profile3, "", "Mitchell",
69       "Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5",
70       "Hollywood", "CA", "91601", "US", "12345678910", "01987654321");
71   EXPECT_TRUE(UpdateProfileLabel(&profile3));
72   string16 summary3 = profile3.Label();
73   EXPECT_EQ(ASCIIToUTF16("123 Zoo St., Hollywood"), summary3);
74 
75   // Case 4: "<firstname>"
76   AutofillProfile profile4;
77   autofill_test::SetProfileInfo(&profile4, "Marion", "Mitchell", "",
78       "johnwayne@me.xyz", "Fox", "", "unit 5", "Hollywood", "CA", "91601", "US",
79       "12345678910", "01987654321");
80   EXPECT_TRUE(UpdateProfileLabel(&profile4));
81   string16 summary4 = profile4.Label();
82   EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, Hollywood"), summary4);
83 
84   // Case 5: "<firstname>, <address>"
85   AutofillProfile profile5;
86   autofill_test::SetProfileInfo(&profile5, "Marion", "Mitchell", "",
87       "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
88       "91601", "US", "12345678910", "01987654321");
89   EXPECT_TRUE(UpdateProfileLabel(&profile5));
90   string16 summary5 = profile5.Label();
91   EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, 123 Zoo St."), summary5);
92 
93   // Case 6: "<firstname> <lastname>"
94   AutofillProfile profile6;
95   autofill_test::SetProfileInfo(&profile6, "Marion", "Mitchell",
96       "Morrison", "johnwayne@me.xyz", "Fox", "", "unit 5", "Hollywood", "CA",
97       "91601", "US", "12345678910", "01987654321");
98   EXPECT_TRUE(UpdateProfileLabel(&profile6));
99   string16 summary6 = profile6.Label();
100   EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, Hollywood"),
101             summary6);
102 
103   // Case 7: "<firstname> <lastname>, <address>"
104   AutofillProfile profile7;
105   autofill_test::SetProfileInfo(&profile7, "Marion", "Mitchell",
106       "Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5",
107       "Hollywood", "CA", "91601", "US", "12345678910", "01987654321");
108   EXPECT_TRUE(UpdateProfileLabel(&profile7));
109   string16 summary7 = profile7.Label();
110   EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, 123 Zoo St."),
111             summary7);
112 
113   // Case 7a: "<firstname> <lastname>, <address>" - same as #7, except for
114   // e-mail.
115   AutofillProfile profile7a;
116   autofill_test::SetProfileInfo(&profile7a, "Marion", "Mitchell",
117     "Morrison", "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
118     "Hollywood", "CA", "91601", "US", "12345678910", "01987654321");
119   std::vector<AutofillProfile*> profiles;
120   profiles.push_back(&profile7);
121   profiles.push_back(&profile7a);
122   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
123   summary7 = profile7.Label();
124   string16 summary7a = profile7a.Label();
125   EXPECT_EQ(ASCIIToUTF16(
126       "Marion Mitchell Morrison, 123 Zoo St., johnwayne@me.xyz"), summary7);
127   EXPECT_EQ(ASCIIToUTF16(
128       "Marion Mitchell Morrison, 123 Zoo St., marion@me.xyz"), summary7a);
129 }
130 
TEST(AutofillProfileTest,AdjustInferredLabels)131 TEST(AutofillProfileTest, AdjustInferredLabels) {
132   std::vector<AutofillProfile*> profiles;
133   profiles.push_back(new AutofillProfile);
134   autofill_test::SetProfileInfo(
135       profiles[0],
136       "John",
137       "",
138       "Doe",
139       "johndoe@hades.com",
140       "Underworld",
141       "666 Erebus St.",
142       "",
143       "Elysium", "CA",
144       "91111",
145       "US",
146       "11111111111",
147       "22222222222");
148   profiles.push_back(new AutofillProfile);
149   autofill_test::SetProfileInfo(
150       profiles[1],
151       "Jane",
152       "",
153       "Doe",
154       "janedoe@tertium.com",
155       "Pluto Inc.",
156       "123 Letha Shore.",
157       "",
158       "Dis", "CA",
159       "91222",
160       "US",
161       "12345678910",
162       "01987654321");
163   // As labels are empty they are adjusted the first time.
164   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
165   // No need to adjust them anymore.
166   EXPECT_FALSE(AutofillProfile::AdjustInferredLabels(&profiles));
167   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."),
168             profiles[0]->Label());
169   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."),
170             profiles[1]->Label());
171 
172   profiles.push_back(new AutofillProfile);
173   autofill_test::SetProfileInfo(
174       profiles[2],
175       "John",
176       "",
177       "Doe",
178       "johndoe@tertium.com",
179       "Underworld",
180       "666 Erebus St.",
181       "",
182       "Elysium", "CA",
183       "91111",
184       "US",
185       "11111111111",
186       "22222222222");
187   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
188 
189   // Profile 0 and 2 inferred label now includes an e-mail.
190   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com"),
191             profiles[0]->Label());
192   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."),
193             profiles[1]->Label());
194   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@tertium.com"),
195             profiles[2]->Label());
196 
197   delete profiles[2];
198   profiles.pop_back();
199 
200   profiles.push_back(new AutofillProfile);
201   autofill_test::SetProfileInfo(
202       profiles[2],
203       "John",
204       "",
205       "Doe",
206       "johndoe@hades.com",
207       "Underworld",
208       "666 Erebus St.",
209       "",
210       "Elysium", "CA",
211       "91111",
212       "US",
213       "11111111111",
214       "33333333333");  // Fax is different
215 
216   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
217 
218   // Profile 0 and 2 inferred label now includes a fax number.
219   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., fax:#22222222222"),
220             profiles[0]->Label());
221   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."),
222             profiles[1]->Label());
223   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., fax:#33333333333"),
224             profiles[2]->Label());
225 
226   profiles.push_back(new AutofillProfile);
227   autofill_test::SetProfileInfo(
228       profiles[3],
229       "John",
230       "",
231       "Doe",
232       "johndoe@hades.com",
233       "Underworld",
234       "666 Erebus St.",
235       "",
236       "Elysium", "CA",
237       "91111",
238       "US",
239       "44444444444",  // Phone is different for some.
240       "33333333333");  // Fax is different for some.
241 
242   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
243 
244   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., 11111111111,"
245                          " fax:#22222222222"),
246             profiles[0]->Label());
247   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."),
248             profiles[1]->Label());
249   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., 11111111111,"
250                          " fax:#33333333333"),
251             profiles[2]->Label());
252   // This one differs from other ones by unique phone, so no need for extra
253   // information.
254   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., 44444444444"),
255             profiles[3]->Label());
256 
257   profiles.push_back(new AutofillProfile);
258   autofill_test::SetProfileInfo(
259       profiles[4],
260       "John",
261       "",
262       "Doe",
263       "johndoe@styx.com",  // E-Mail is different for some.
264       "Underworld",
265       "666 Erebus St.",
266       "",
267       "Elysium", "CA",
268       "91111",
269       "US",
270       "44444444444",  // Phone is different for some.
271       "33333333333");  // Fax is different for some.
272 
273   EXPECT_TRUE(AutofillProfile::AdjustInferredLabels(&profiles));
274 
275   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com,"
276                          " 11111111111, fax:#22222222222"),
277             profiles[0]->Label());
278   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."),
279             profiles[1]->Label());
280   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com,"
281                          " 11111111111, fax:#33333333333"),
282             profiles[2]->Label());
283   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com,"
284                          " 44444444444, fax:#33333333333"),
285             profiles[3]->Label());
286   // This one differs from other ones by unique e-mail, so no need for extra
287   // information.
288   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@styx.com"),
289             profiles[4]->Label());
290 
291   EXPECT_FALSE(AutofillProfile::AdjustInferredLabels(&profiles));
292 
293   // Clean up.
294   STLDeleteContainerPointers(profiles.begin(), profiles.end());
295 }
296 
TEST(AutofillProfileTest,CreateInferredLabels)297 TEST(AutofillProfileTest, CreateInferredLabels) {
298   std::vector<AutofillProfile*> profiles;
299   profiles.push_back(new AutofillProfile);
300   autofill_test::SetProfileInfo(profiles[0],
301                                 "John",
302                                 "",
303                                 "Doe",
304                                 "johndoe@hades.com",
305                                 "Underworld",
306                                 "666 Erebus St.",
307                                 "",
308                                 "Elysium", "CA",
309                                 "91111",
310                                 "US",
311                                 "11111111111",
312                                 "22222222222");
313   profiles.push_back(new AutofillProfile);
314   autofill_test::SetProfileInfo(profiles[1],
315                                 "Jane",
316                                 "",
317                                 "Doe",
318                                 "janedoe@tertium.com",
319                                 "Pluto Inc.",
320                                 "123 Letha Shore.",
321                                 "",
322                                 "Dis", "CA",
323                                 "91222",
324                                 "US",
325                                 "12345678910",
326                                 "01987654321");
327   std::vector<string16> labels;
328   // Two fields at least - no filter.
329   AutofillProfile::CreateInferredLabels(&profiles, NULL, UNKNOWN_TYPE, 2,
330                                         &labels);
331   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."), labels[0]);
332   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]);
333 
334   // Three fields at least - no filter.
335   AutofillProfile::CreateInferredLabels(&profiles, NULL, UNKNOWN_TYPE, 3,
336                                         &labels);
337   EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., Elysium"),
338             labels[0]);
339   EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore., Dis"),
340             labels[1]);
341 
342   std::vector<AutofillFieldType> suggested_fields;
343   suggested_fields.push_back(ADDRESS_HOME_CITY);
344   suggested_fields.push_back(ADDRESS_HOME_STATE);
345   suggested_fields.push_back(ADDRESS_HOME_ZIP);
346 
347   // Two fields at least, from suggested fields - no filter.
348   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields,
349                                         UNKNOWN_TYPE, 2, &labels);
350   EXPECT_EQ(ASCIIToUTF16("Elysium, CA"), labels[0]);
351   EXPECT_EQ(ASCIIToUTF16("Dis, CA"), labels[1]);
352 
353   // Three fields at least, from suggested fields - no filter.
354   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields,
355                                         UNKNOWN_TYPE, 3, &labels);
356   EXPECT_EQ(ASCIIToUTF16("Elysium, CA, 91111"), labels[0]);
357   EXPECT_EQ(ASCIIToUTF16("Dis, CA, 91222"), labels[1]);
358 
359   // Three fields at least, from suggested fields - but filter reduces available
360   // fields to two.
361   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields,
362                                         ADDRESS_HOME_STATE, 3, &labels);
363   EXPECT_EQ(ASCIIToUTF16("Elysium, 91111"), labels[0]);
364   EXPECT_EQ(ASCIIToUTF16("Dis, 91222"), labels[1]);
365 
366   suggested_fields.clear();
367   // In our implementation we always display NAME_FULL for all NAME* fields...
368   suggested_fields.push_back(NAME_MIDDLE);
369   // One field at least, from suggested fields - no filter.
370   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields,
371                                         UNKNOWN_TYPE, 1, &labels);
372   EXPECT_EQ(ASCIIToUTF16("John Doe"), labels[0]);
373   EXPECT_EQ(ASCIIToUTF16("Jane Doe"), labels[1]);
374 
375   // One field at least, from suggested fields - filter the same as suggested
376   // field.
377   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields,
378                                         NAME_MIDDLE, 1, &labels);
379   EXPECT_EQ(string16(), labels[0]);
380   EXPECT_EQ(string16(), labels[1]);
381 
382   // One field at least, from suggested fields - filter same as the first non-
383   // unknown suggested field.
384   suggested_fields.clear();
385   suggested_fields.push_back(UNKNOWN_TYPE);
386   suggested_fields.push_back(NAME_FULL);
387   suggested_fields.push_back(ADDRESS_HOME_LINE1);
388   AutofillProfile::CreateInferredLabels(&profiles, &suggested_fields, NAME_FULL,
389                                         1, &labels);
390   EXPECT_EQ(string16(ASCIIToUTF16("666 Erebus St.")), labels[0]);
391   EXPECT_EQ(string16(ASCIIToUTF16("123 Letha Shore.")), labels[1]);
392 
393   // Clean up.
394   STLDeleteContainerPointers(profiles.begin(), profiles.end());
395 }
396 
397 // Test that we fall back to using the full name if there are no other
398 // distinguishing fields, but only if it makes sense given the suggested fields.
TEST(AutofillProfileTest,CreateInferredLabelsFallsBackToFullName)399 TEST(AutofillProfileTest, CreateInferredLabelsFallsBackToFullName) {
400   ScopedVector<AutofillProfile> profiles;
401   profiles.push_back(new AutofillProfile);
402   autofill_test::SetProfileInfo(profiles[0],
403                                 "John", "", "Doe", "doe@example.com", "",
404                                 "88 Nowhere Ave.", "", "", "", "", "", "", "");
405   profiles.push_back(new AutofillProfile);
406   autofill_test::SetProfileInfo(profiles[1],
407                                 "Johnny", "K", "Doe", "doe@example.com", "",
408                                 "88 Nowhere Ave.", "", "", "", "", "", "", "");
409 
410   // If the only name field in the suggested fields is the excluded field, we
411   // should not fall back to the full name as a distinguishing field.
412   std::vector<AutofillFieldType> suggested_fields;
413   suggested_fields.push_back(NAME_LAST);
414   suggested_fields.push_back(ADDRESS_HOME_LINE1);
415   suggested_fields.push_back(EMAIL_ADDRESS);
416   std::vector<string16> labels;
417   AutofillProfile::CreateInferredLabels(&profiles.get(), &suggested_fields,
418                                         NAME_LAST, 1, &labels);
419   ASSERT_EQ(2U, labels.size());
420   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[0]);
421   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[1]);
422 
423   // Otherwise, we should.
424   suggested_fields.push_back(NAME_FIRST);
425   AutofillProfile::CreateInferredLabels(&profiles.get(),  &suggested_fields,
426                                         NAME_LAST, 1, &labels);
427   ASSERT_EQ(2U, labels.size());
428   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., John Doe"), labels[0]);
429   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., Johnny K Doe"), labels[1]);
430 }
431 
432 // Test that we do not show duplicate fields in the labels.
TEST(AutofillProfileTest,CreateInferredLabelsNoDuplicatedFields)433 TEST(AutofillProfileTest, CreateInferredLabelsNoDuplicatedFields) {
434   ScopedVector<AutofillProfile> profiles;
435   profiles.push_back(new AutofillProfile);
436   autofill_test::SetProfileInfo(profiles[0],
437                                 "John", "", "Doe", "doe@example.com", "",
438                                 "88 Nowhere Ave.", "", "", "", "", "", "", "");
439   profiles.push_back(new AutofillProfile);
440   autofill_test::SetProfileInfo(profiles[1],
441                                 "John", "", "Doe", "dojo@example.com", "",
442                                 "88 Nowhere Ave.", "", "", "", "", "", "", "");
443 
444   // If the only name field in the suggested fields is the excluded field, we
445   // should not fall back to the full name as a distinguishing field.
446   std::vector<AutofillFieldType> suggested_fields;
447   suggested_fields.push_back(ADDRESS_HOME_LINE1);
448   suggested_fields.push_back(ADDRESS_BILLING_LINE1);
449   suggested_fields.push_back(EMAIL_ADDRESS);
450   std::vector<string16> labels;
451   AutofillProfile::CreateInferredLabels(&profiles.get(), &suggested_fields,
452                                         UNKNOWN_TYPE, 2, &labels);
453   ASSERT_EQ(2U, labels.size());
454   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., doe@example.com"), labels[0]);
455   EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., dojo@example.com"), labels[1]);
456 }
457 
458 // Make sure that empty fields are not treated as distinguishing fields.
TEST(AutofillProfileTest,CreateInferredLabelsSkipsEmptyFields)459 TEST(AutofillProfileTest, CreateInferredLabelsSkipsEmptyFields) {
460   ScopedVector<AutofillProfile> profiles;
461   profiles.push_back(new AutofillProfile);
462   autofill_test::SetProfileInfo(profiles[0],
463                                 "John", "", "Doe", "doe@example.com",
464                                 "Gogole", "", "", "", "", "", "", "", "");
465   profiles.push_back(new AutofillProfile);
466   autofill_test::SetProfileInfo(profiles[1],
467                                 "John", "", "Doe", "doe@example.com",
468                                 "Ggoole", "", "", "", "", "", "", "", "");
469   profiles.push_back(new AutofillProfile);
470   autofill_test::SetProfileInfo(profiles[2],
471                                 "John", "", "Doe", "john.doe@example.com",
472                                 "Goolge", "", "", "", "", "", "", "", "");
473 
474   std::vector<string16> labels;
475   AutofillProfile::CreateInferredLabels(&profiles.get(), NULL, UNKNOWN_TYPE, 3,
476                                         &labels);
477   ASSERT_EQ(3U, labels.size());
478   EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]);
479   EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Ggoole"), labels[1]);
480   EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com, Goolge"), labels[2]);
481 
482   // A field must have a non-empty value for each profile to be considered a
483   // distinguishing field.
484   profiles[1]->SetInfo(ADDRESS_HOME_LINE1,
485                        ASCIIToUTF16("88 Nowhere Ave."));
486   AutofillProfile::CreateInferredLabels(&profiles.get(), NULL, UNKNOWN_TYPE, 1,
487                                         &labels);
488   ASSERT_EQ(3U, labels.size());
489   EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]);
490   EXPECT_EQ(ASCIIToUTF16("John Doe, 88 Nowhere Ave., doe@example.com, Ggoole"),
491             labels[1]) << labels[1];
492   EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com"), labels[2]);
493 }
494 
TEST(AutofillProfileTest,IsSubsetOf)495 TEST(AutofillProfileTest, IsSubsetOf) {
496   scoped_ptr<AutofillProfile> a, b;
497 
498   // |a| is a subset of |b|.
499   a.reset(new AutofillProfile);
500   b.reset(new AutofillProfile);
501   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson",
502       "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503       NULL, NULL);
504   autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson",
505       "declaration_guy@gmail.com", "United States Government", "Monticello",
506       NULL, "Charlottesville", "Virginia", "22902", NULL, NULL, NULL);
507   EXPECT_TRUE(a->IsSubsetOf(*b));
508 
509   // |b| is not a subset of |a|.
510   EXPECT_FALSE(b->IsSubsetOf(*a));
511 
512   // |a| is a subset of |a|.
513   EXPECT_TRUE(a->IsSubsetOf(*a));
514 
515   // One field in |b| is different.
516   a.reset(new AutofillProfile);
517   b.reset(new AutofillProfile);
518   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson",
519       "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
520       NULL, NULL);
521   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Adams",
522       "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
523       NULL, NULL);
524   EXPECT_FALSE(a->IsSubsetOf(*b));
525 }
526 
TEST(AutofillProfileTest,IntersectionOfTypesHasEqualValues)527 TEST(AutofillProfileTest, IntersectionOfTypesHasEqualValues) {
528   scoped_ptr<AutofillProfile> a, b;
529 
530   // Intersection of types contains the fields NAME_FIRST, NAME_LAST,
531   // EMAIL_ADDRESS.  The values of these field types are equal between the two
532   // profiles.
533   a.reset(new AutofillProfile);
534   b.reset(new AutofillProfile);
535   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson",
536       "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
537       "12134759123", "19384284720");
538   autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson",
539       "declaration_guy@gmail.com", "United States Government", "Monticello",
540       NULL, "Charlottesville", "Virginia", "22902", NULL, NULL, NULL);
541   EXPECT_TRUE(a->IntersectionOfTypesHasEqualValues(*b));
542 
543   // Intersection of types contains the fields NAME_FIRST, NAME_LAST,
544   // EMAIL_ADDRESS. The value of EMAIL_ADDRESS differs between the two profiles.
545   a.reset(new AutofillProfile);
546   b.reset(new AutofillProfile);
547   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson",
548       "poser@yahoo.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
549       "12134759123", "19384284720");
550   autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson",\
551       "declaration_guy@gmail.com", "United States Government", "Monticello",
552       NULL, "Charlottesville", "Virginia", "22902", NULL, NULL, NULL);
553   EXPECT_FALSE(a->IntersectionOfTypesHasEqualValues(*b));
554 
555   // Intersection of types is empty.
556   a.reset(new AutofillProfile);
557   b.reset(new AutofillProfile);
558   autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson",
559       "poser@yahoo.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
560       "12134759123", "19384284720");
561   autofill_test::SetProfileInfo(b.get(), NULL, NULL, NULL, NULL,
562       "United States Government", "Monticello", NULL, "Charlottesville",
563       "Virginia", "22902", NULL, NULL, NULL);
564   EXPECT_FALSE(a->IntersectionOfTypesHasEqualValues(*b));
565 }
566 
TEST(AutofillProfileTest,MergeWith)567 TEST(AutofillProfileTest, MergeWith) {
568   scoped_ptr<AutofillProfile> a, b;
569 
570   // Merge |b| into |a|.
571   a.reset(new AutofillProfile);
572   b.reset(new AutofillProfile);
573   autofill_test::SetProfileInfo(a.get(), "Jimmy", NULL, NULL, NULL,
574       NULL, NULL, NULL, NULL, NULL, NULL, NULL, "12134759123", "19384284720");
575   autofill_test::SetProfileInfo(b.get(), "James", NULL, "Madison",
576       "constitutionalist@gmail.com", "United States Government", "Monticello",
577       NULL, "Charlottesville", "Virginia", "22902", NULL, NULL, NULL);
578   AutofillProfile expected_b(*b);
579   a->MergeWith(*b);
580 
581   AutofillProfile expected_a;
582   autofill_test::SetProfileInfo(&expected_a, "Jimmy", NULL, "Madison",
583       "constitutionalist@gmail.com", "United States Government", "Monticello",
584       NULL, "Charlottesville", "Virginia", "22902", NULL, "12134759123",
585       "19384284720");
586   EXPECT_EQ(0, expected_a.Compare(*a));
587   EXPECT_EQ(0, expected_b.Compare(*b));
588 }
589 
TEST(AutofillProfileTest,AssignmentOperator)590 TEST(AutofillProfileTest, AssignmentOperator){
591   AutofillProfile a, b;
592 
593   // Result of assignment should be logically equal to the original profile.
594   autofill_test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison",
595                                 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
596                                 "Hollywood", "CA", "91601", "US", "12345678910",
597                                 "01987654321");
598   b = a;
599   EXPECT_TRUE(a == b);
600 
601   // Assignment to self should not change the profile value.
602   a = a;
603   EXPECT_TRUE(a == b);
604 }
605 
TEST(AutofillProfileTest,Copy)606 TEST(AutofillProfileTest, Copy) {
607   AutofillProfile a;
608 
609   // Clone should be logically equal to the original.
610   autofill_test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison",
611                                 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5",
612                                 "Hollywood", "CA", "91601", "US", "12345678910",
613                                 "01987654321");
614   AutofillProfile b(a);
615   EXPECT_TRUE(a == b);
616 }
617 
TEST(AutofillProfileTest,Compare)618 TEST(AutofillProfileTest, Compare) {
619   AutofillProfile a, b;
620 
621   // Empty profiles are the same.
622   EXPECT_EQ(0, a.Compare(b));
623 
624   // GUIDs don't count.
625   a.set_guid(guid::GenerateGUID());
626   b.set_guid(guid::GenerateGUID());
627   EXPECT_EQ(0, a.Compare(b));
628 
629   // Different values produce non-zero results.
630   autofill_test::SetProfileInfo(&a, "Jimmy", NULL, NULL, NULL,
631       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
632   autofill_test::SetProfileInfo(&b, "Ringo", NULL, NULL, NULL,
633       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
634   EXPECT_GT(0, a.Compare(b));
635   EXPECT_LT(0, b.Compare(a));
636 }
637 
TEST(AutofillProfileTest,CountryCode)638 TEST(AutofillProfileTest, CountryCode) {
639   AutofillProfile profile;
640   EXPECT_EQ(std::string(), profile.CountryCode());
641 
642   profile.SetCountryCode("US");
643   EXPECT_EQ("US", profile.CountryCode());
644 }
645 
TEST(AutofillProfileTest,MultiValueNames)646 TEST(AutofillProfileTest, MultiValueNames) {
647   AutofillProfile p;
648   const string16 kJohnDoe(ASCIIToUTF16("John Doe"));
649   const string16 kJohnPDoe(ASCIIToUTF16("John P. Doe"));
650   std::vector<string16> set_values;
651   set_values.push_back(kJohnDoe);
652   set_values.push_back(kJohnPDoe);
653   p.SetMultiInfo(NAME_FULL, set_values);
654 
655   // Expect regular |GetInfo| returns the first element.
656   EXPECT_EQ(kJohnDoe, p.GetInfo(NAME_FULL));
657 
658   // Ensure that we get out what we put in.
659   std::vector<string16> get_values;
660   p.GetMultiInfo(NAME_FULL, &get_values);
661   ASSERT_EQ(2UL, get_values.size());
662   EXPECT_EQ(kJohnDoe, get_values[0]);
663   EXPECT_EQ(kJohnPDoe, get_values[1]);
664 
665   // Update the values.
666   AutofillProfile p2 = p;
667   EXPECT_EQ(0, p.Compare(p2));
668   EXPECT_EQ(0, p.CompareMulti(p2));
669   const string16 kNoOne(ASCIIToUTF16("No One"));
670   set_values[1] = kNoOne;
671   p.SetMultiInfo(NAME_FULL, set_values);
672   p.GetMultiInfo(NAME_FULL, &get_values);
673   ASSERT_EQ(2UL, get_values.size());
674   EXPECT_EQ(kJohnDoe, get_values[0]);
675   EXPECT_EQ(kNoOne, get_values[1]);
676   EXPECT_EQ(0, p.Compare(p2));
677   EXPECT_NE(0, p.CompareMulti(p2));
678 
679   // Delete values.
680   set_values.clear();
681   p.SetMultiInfo(NAME_FULL, set_values);
682   p.GetMultiInfo(NAME_FULL, &get_values);
683   ASSERT_EQ(1UL, get_values.size());
684   EXPECT_EQ(string16(), get_values[0]);
685 
686   // Expect regular |GetInfo| returns empty value.
687   EXPECT_EQ(string16(), p.GetInfo(NAME_FULL));
688 }
689 
TEST(AutofillProfileTest,MultiValueEmails)690 TEST(AutofillProfileTest, MultiValueEmails) {
691   AutofillProfile p;
692   const string16 kJohnDoe(ASCIIToUTF16("john@doe.com"));
693   const string16 kJohnPDoe(ASCIIToUTF16("john_p@doe.com"));
694   std::vector<string16> set_values;
695   set_values.push_back(kJohnDoe);
696   set_values.push_back(kJohnPDoe);
697   p.SetMultiInfo(EMAIL_ADDRESS, set_values);
698 
699   // Expect regular |GetInfo| returns the first element.
700   EXPECT_EQ(kJohnDoe, p.GetInfo(EMAIL_ADDRESS));
701 
702   // Ensure that we get out what we put in.
703   std::vector<string16> get_values;
704   p.GetMultiInfo(EMAIL_ADDRESS, &get_values);
705   ASSERT_EQ(2UL, get_values.size());
706   EXPECT_EQ(kJohnDoe, get_values[0]);
707   EXPECT_EQ(kJohnPDoe, get_values[1]);
708 
709   // Update the values.
710   AutofillProfile p2 = p;
711   EXPECT_EQ(0, p.Compare(p2));
712   EXPECT_EQ(0, p.CompareMulti(p2));
713   const string16 kNoOne(ASCIIToUTF16("no@one.com"));
714   set_values[1] = kNoOne;
715   p.SetMultiInfo(EMAIL_ADDRESS, set_values);
716   p.GetMultiInfo(EMAIL_ADDRESS, &get_values);
717   ASSERT_EQ(2UL, get_values.size());
718   EXPECT_EQ(kJohnDoe, get_values[0]);
719   EXPECT_EQ(kNoOne, get_values[1]);
720   EXPECT_EQ(0, p.Compare(p2));
721   EXPECT_NE(0, p.CompareMulti(p2));
722 
723   // Delete values.
724   set_values.clear();
725   p.SetMultiInfo(EMAIL_ADDRESS, set_values);
726   p.GetMultiInfo(EMAIL_ADDRESS, &get_values);
727   ASSERT_EQ(1UL, get_values.size());
728   EXPECT_EQ(string16(), get_values[0]);
729 
730   // Expect regular |GetInfo| returns empty value.
731   EXPECT_EQ(string16(), p.GetInfo(EMAIL_ADDRESS));
732 }
733 
TEST(AutofillProfileTest,MultiValuePhone)734 TEST(AutofillProfileTest, MultiValuePhone) {
735   AutofillProfile p;
736   const string16 kJohnDoe(ASCIIToUTF16("4151112222"));
737   const string16 kJohnPDoe(ASCIIToUTF16("4151113333"));
738   std::vector<string16> set_values;
739   set_values.push_back(kJohnDoe);
740   set_values.push_back(kJohnPDoe);
741   p.SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
742 
743   // Expect regular |GetInfo| returns the first element.
744   EXPECT_EQ(kJohnDoe, p.GetInfo(PHONE_HOME_WHOLE_NUMBER));
745 
746   // Ensure that we get out what we put in.
747   std::vector<string16> get_values;
748   p.GetMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values);
749   ASSERT_EQ(2UL, get_values.size());
750   EXPECT_EQ(kJohnDoe, get_values[0]);
751   EXPECT_EQ(kJohnPDoe, get_values[1]);
752 
753   // Update the values.
754   AutofillProfile p2 = p;
755   EXPECT_EQ(0, p.Compare(p2));
756   EXPECT_EQ(0, p.CompareMulti(p2));
757   const string16 kNoOne(ASCIIToUTF16("4151110000"));
758   set_values[1] = kNoOne;
759   p.SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
760   p.GetMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values);
761   ASSERT_EQ(2UL, get_values.size());
762   EXPECT_EQ(kJohnDoe, get_values[0]);
763   EXPECT_EQ(kNoOne, get_values[1]);
764   EXPECT_EQ(0, p.Compare(p2));
765   EXPECT_NE(0, p.CompareMulti(p2));
766 
767   // Delete values.
768   set_values.clear();
769   p.SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
770   p.GetMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values);
771   ASSERT_EQ(1UL, get_values.size());
772   EXPECT_EQ(string16(), get_values[0]);
773 
774   // Expect regular |GetInfo| returns empty value.
775   EXPECT_EQ(string16(), p.GetInfo(PHONE_HOME_WHOLE_NUMBER));
776 }
777 
TEST(AutofillProfileTest,MultiValueFax)778 TEST(AutofillProfileTest, MultiValueFax) {
779   AutofillProfile p;
780   const string16 kJohnDoe(ASCIIToUTF16("4151112222"));
781   const string16 kJohnPDoe(ASCIIToUTF16("4151113333"));
782   std::vector<string16> set_values;
783   set_values.push_back(kJohnDoe);
784   set_values.push_back(kJohnPDoe);
785   p.SetMultiInfo(PHONE_FAX_WHOLE_NUMBER, set_values);
786 
787   // Expect regular |GetInfo| returns the first element.
788   EXPECT_EQ(kJohnDoe, p.GetInfo(PHONE_FAX_WHOLE_NUMBER));
789 
790   // Ensure that we get out what we put in.
791   std::vector<string16> get_values;
792   p.GetMultiInfo(PHONE_FAX_WHOLE_NUMBER, &get_values);
793   ASSERT_EQ(2UL, get_values.size());
794   EXPECT_EQ(kJohnDoe, get_values[0]);
795   EXPECT_EQ(kJohnPDoe, get_values[1]);
796 
797   // Update the values.
798   AutofillProfile p2 = p;
799   EXPECT_EQ(0, p.Compare(p2));
800   EXPECT_EQ(0, p.CompareMulti(p2));
801   const string16 kNoOne(ASCIIToUTF16("4151110000"));
802   set_values[1] = kNoOne;
803   p.SetMultiInfo(PHONE_FAX_WHOLE_NUMBER, set_values);
804   p.GetMultiInfo(PHONE_FAX_WHOLE_NUMBER, &get_values);
805   ASSERT_EQ(2UL, get_values.size());
806   EXPECT_EQ(kJohnDoe, get_values[0]);
807   EXPECT_EQ(kNoOne, get_values[1]);
808   EXPECT_EQ(0, p.Compare(p2));
809   EXPECT_NE(0, p.CompareMulti(p2));
810 
811   // Delete values.
812   set_values.clear();
813   p.SetMultiInfo(PHONE_FAX_WHOLE_NUMBER, set_values);
814   p.GetMultiInfo(PHONE_FAX_WHOLE_NUMBER, &get_values);
815   ASSERT_EQ(1UL, get_values.size());
816   EXPECT_EQ(string16(), get_values[0]);
817 
818   // Expect regular |GetInfo| returns empty value.
819   EXPECT_EQ(string16(), p.GetInfo(PHONE_FAX_WHOLE_NUMBER));
820 }
821