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 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. 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) me.xyz"), summary7); 127 EXPECT_EQ(ASCIIToUTF16( 128 "Marion Mitchell Morrison, 123 Zoo St., marion (at) me.xyz"), summary7a); 129 } 130 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) hades.com," 281 " 11111111111, fax:#33333333333"), 282 profiles[2]->Label()); 283 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe (at) 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 (at) 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 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 (at) 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 (at) 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. 399 TEST(AutofillProfileTest, CreateInferredLabelsFallsBackToFullName) { 400 ScopedVector<AutofillProfile> profiles; 401 profiles.push_back(new AutofillProfile); 402 autofill_test::SetProfileInfo(profiles[0], 403 "John", "", "Doe", "doe (at) example.com", "", 404 "88 Nowhere Ave.", "", "", "", "", "", "", ""); 405 profiles.push_back(new AutofillProfile); 406 autofill_test::SetProfileInfo(profiles[1], 407 "Johnny", "K", "Doe", "doe (at) 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. 433 TEST(AutofillProfileTest, CreateInferredLabelsNoDuplicatedFields) { 434 ScopedVector<AutofillProfile> profiles; 435 profiles.push_back(new AutofillProfile); 436 autofill_test::SetProfileInfo(profiles[0], 437 "John", "", "Doe", "doe (at) example.com", "", 438 "88 Nowhere Ave.", "", "", "", "", "", "", ""); 439 profiles.push_back(new AutofillProfile); 440 autofill_test::SetProfileInfo(profiles[1], 441 "John", "", "Doe", "dojo (at) 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 (at) example.com"), labels[0]); 455 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., dojo (at) example.com"), labels[1]); 456 } 457 458 // Make sure that empty fields are not treated as distinguishing fields. 459 TEST(AutofillProfileTest, CreateInferredLabelsSkipsEmptyFields) { 460 ScopedVector<AutofillProfile> profiles; 461 profiles.push_back(new AutofillProfile); 462 autofill_test::SetProfileInfo(profiles[0], 463 "John", "", "Doe", "doe (at) example.com", 464 "Gogole", "", "", "", "", "", "", "", ""); 465 profiles.push_back(new AutofillProfile); 466 autofill_test::SetProfileInfo(profiles[1], 467 "John", "", "Doe", "doe (at) example.com", 468 "Ggoole", "", "", "", "", "", "", "", ""); 469 profiles.push_back(new AutofillProfile); 470 autofill_test::SetProfileInfo(profiles[2], 471 "John", "", "Doe", "john.doe (at) 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 (at) example.com, Gogole"), labels[0]); 479 EXPECT_EQ(ASCIIToUTF16("John Doe, doe (at) example.com, Ggoole"), labels[1]); 480 EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe (at) 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 (at) example.com, Gogole"), labels[0]); 490 EXPECT_EQ(ASCIIToUTF16("John Doe, 88 Nowhere Ave., doe (at) example.com, Ggoole"), 491 labels[1]) << labels[1]; 492 EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe (at) example.com"), labels[2]); 493 } 494 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 (at) gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 503 NULL, NULL); 504 autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson", 505 "declaration_guy (at) 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 (at) gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 520 NULL, NULL); 521 autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Adams", 522 "declaration_guy (at) gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 523 NULL, NULL); 524 EXPECT_FALSE(a->IsSubsetOf(*b)); 525 } 526 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 (at) gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 537 "12134759123", "19384284720"); 538 autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson", 539 "declaration_guy (at) 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 (at) yahoo.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 549 "12134759123", "19384284720"); 550 autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson",\ 551 "declaration_guy (at) 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 (at) 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 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 (at) 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 (at) 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 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 (at) 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 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 (at) 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 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 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 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 690 TEST(AutofillProfileTest, MultiValueEmails) { 691 AutofillProfile p; 692 const string16 kJohnDoe(ASCIIToUTF16("john (at) doe.com")); 693 const string16 kJohnPDoe(ASCIIToUTF16("john_p (at) 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 (at) 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 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 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