16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 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) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/autocomplete_result.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/scoped_ptr.h" 10c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "base/metrics/field_trial.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match_type.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider.h" 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/omnibox_field_trial.h" 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/test_scheme_classifier.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_prepopulate_data.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/entropy_provider.h" 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/variations/variations_associated_data.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using metrics::OmniboxEventProto; 286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct AutocompleteMatchTestData { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string destination_url; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteMatch::Type type; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const AutocompleteMatchTestData kVerbatimMatches[] = { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://search-what-you-typed/", 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://url-what-you-typed/", AutocompleteMatchType::URL_WHAT_YOU_TYPED }, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const AutocompleteMatchTestData kNonVerbatimMatches[] = { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://search-history/", AutocompleteMatchType::SEARCH_HISTORY }, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://history-title/", AutocompleteMatchType::HISTORY_TITLE }, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Adds |count| AutocompleteMatches to |matches|. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PopulateAutocompleteMatchesFromTestData( 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AutocompleteMatchTestData* data, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t count, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACMatches* matches) { 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(matches != NULL); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteMatch match; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.destination_url = GURL(data[i].destination_url); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.relevance = 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches->empty() ? 1300 : (matches->back().relevance - 100); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.allowed_to_be_default_match = true; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) match.type = data[i].type; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches->push_back(match); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutocompleteResultTest : public testing::Test { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to build a url for the AutocompleteMatch. The URL becomes 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "http://" + ('a' + |url_id|) (e.g. an ID of 2 yields "http://b"). 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int url_id; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID of the provider. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int provider_id; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Relevance score. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int relevance; 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Duplicate matches. 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<AutocompleteMatch> duplicate_matches; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocompleteResultTest() { 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Destroy the existing FieldTrialList before creating a new one to avoid 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // a DCHECK. 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_trial_list_.reset(); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_trial_list_.reset(new base::FieldTrialList( 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new metrics::SHA1EntropyProvider("foo"))); 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) variations::testing::ClearAllVariationParams(); 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLPrepopulateData::InitCountryCode( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string() /* unknown country code */); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) template_url_service_.reset(new TemplateURLService(NULL, 0)); 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) template_url_service_->Load(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Configures |match| from |data|. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void PopulateAutocompleteMatch(const TestData& data, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch* match); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |count| AutocompleteMatches to |matches|. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void PopulateAutocompleteMatches(const TestData* data, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches* matches); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asserts that |result| has |expected_count| matches matching |expected|. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AssertResultMatches(const AutocompleteResult& result, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* expected, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_count); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an AutocompleteResult from |last| and |current|. The two are 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // merged by |CopyOldMatches| and compared by |AssertResultMatches|. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCopyOldMatchesTest(const TestData* last, size_t last_size, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* current, size_t current_size, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* expected, size_t expected_size); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<TemplateURLService> template_url_service_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<base::FieldTrialList> field_trial_list_; 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AutocompleteResultTest); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteResultTest::PopulateAutocompleteMatch( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData& data, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch* match) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match->provider = reinterpret_cast<AutocompleteProvider*>(data.provider_id); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match->fill_into_edit = base::IntToString16(data.url_id); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_id(1, data.url_id + 'a'); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match->destination_url = GURL("http://" + url_id); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match->relevance = data.relevance; 139c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match->allowed_to_be_default_match = true; 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) match->duplicate_matches = data.duplicate_matches; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteResultTest::PopulateAutocompleteMatches( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* data, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches* matches) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatch(data[i], &match); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches->push_back(match); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteResultTest::AssertResultMatches( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteResult& result, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* expected, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_count) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_count, result.size()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < expected_count; ++i) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch expected_match; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatch(expected[i], &expected_match); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutocompleteMatch& match = *(result.begin() + i); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_match.provider, match.provider) << i; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_match.relevance, match.relevance) << i; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_match.destination_url.spec(), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match.destination_url.spec()) << i; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteResultTest::RunCopyOldMatchesTest( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* last, size_t last_size, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* current, size_t current_size, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestData* expected, size_t expected_size) { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteInput input(base::ASCIIToUTF16("a"), base::string16::npos, 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INVALID_SPEC, false, false, false, 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches last_matches; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatches(last, last_size, &last_matches); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult last_result; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_result.AppendMatches(last_matches); 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_result.SortAndCull(input, template_url_service_.get()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches current_matches; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatches(current, current_size, ¤t_matches); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult current_result; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_result.AppendMatches(current_matches); 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_result.SortAndCull(input, template_url_service_.get()); 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) current_result.CopyOldMatches( 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) input, last_result, template_url_service_.get()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssertResultMatches(current_result, expected, expected_size); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertion testing for AutocompleteResult::Swap. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteResultTest, Swap) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult r1; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult r2; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap with empty shouldn't do anything interesting. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1.Swap(&r2); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r1.end(), r1.default_match()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r2.end(), r2.default_match()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap with a single match. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches matches; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch match; 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch match.relevance = 1; 212c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch match.allowed_to_be_default_match = true; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteInput input(base::ASCIIToUTF16("a"), base::string16::npos, 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 2156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INVALID_SPEC, false, false, false, 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) true, TestSchemeClassifier()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches.push_back(match); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1.AppendMatches(matches); 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) r1.SortAndCull(input, template_url_service_.get()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r1.begin(), r1.default_match()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://a/", r1.alternate_nav_url().spec()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1.Swap(&r2); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r1.empty()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r1.end(), r1.default_match()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r1.alternate_nav_url().is_empty()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(r2.empty()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(r2.begin(), r2.default_match()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://a/", r2.alternate_nav_url().spec()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that if the new results have a lower max relevance score than last, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any copied results have their relevance shifted down. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteResultTest, CopyOldMatches) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData last[] = { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1000 }, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 0, 500 }, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData current[] = { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 0, 400 }, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData result[] = { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 0, 400 }, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 0, 399 }, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunCopyOldMatchesTest(last, ARRAYSIZE_UNSAFE(last), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current, ARRAYSIZE_UNSAFE(current), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result, ARRAYSIZE_UNSAFE(result))); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that matches are copied correctly from two distinct providers. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteResultTest, CopyOldMatches2) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData last[] = { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1000 }, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 1, 500 }, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 0, 400 }, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 1, 300 }, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData current[] = { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4, 0, 1100 }, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 1, 550 }, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData result[] = { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4, 0, 1100 }, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 1, 550 }, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 0, 400 }, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 1, 300 }, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunCopyOldMatchesTest(last, ARRAYSIZE_UNSAFE(last), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current, ARRAYSIZE_UNSAFE(current), 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result, ARRAYSIZE_UNSAFE(result))); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that matches with empty destination URLs aren't treated as duplicates 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and culled. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteResultTest, SortAndCullEmptyDestinationURLs) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData data[] = { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 0, 500 }, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1100 }, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 0, 1000 }, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1300 }, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1200 }, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches matches; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[1].destination_url = GURL(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[3].destination_url = GURL(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[4].destination_url = GURL(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult result; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.AppendMatches(matches); 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INVALID_SPEC, false, false, false, 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Of the two results with the same non-empty destination URL, the 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lower-relevance one should be dropped. All of the results with empty URLs 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be kept. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4U, result.size()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.match_at(0)->destination_url.is_empty()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1300, result.match_at(0)->relevance); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.match_at(1)->destination_url.is_empty()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1200, result.match_at(1)->relevance); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.match_at(2)->destination_url.is_empty()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1100, result.match_at(2)->relevance); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://b/", result.match_at(3)->destination_url.spec()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1000, result.match_at(3)->relevance); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteResultTest, SortAndCullDuplicateSearchURLs) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register a template URL that corresponds to 'foo' search engine. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLData url_data; 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_data.short_name = base::ASCIIToUTF16("unittest"); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_data.SetKeyword(base::ASCIIToUTF16("foo")); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_data.SetURL("http://www.foo.com/s?q={searchTerms}"); 3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) template_url_service_.get()->Add(new TemplateURL(url_data)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestData data[] = { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 1300 }, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1, 0, 1200 }, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2, 0, 1100 }, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3, 0, 1000 }, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4, 1, 900 }, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACMatches matches; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[0].destination_url = GURL("http://www.foo.com/s?q=foo"); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[1].destination_url = GURL("http://www.foo.com/s?q=foo2"); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[2].destination_url = GURL("http://www.foo.com/s?q=foo&oq=f"); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[3].destination_url = GURL("http://www.foo.com/s?q=foo&aqs=0"); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) matches[4].destination_url = GURL("http://www.foo.com/"); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteResult result; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.AppendMatches(matches); 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INVALID_SPEC, false, false, false, 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We expect the 3rd and 4th results to be removed. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, result.size()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://www.foo.com/s?q=foo", 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.match_at(0)->destination_url.spec()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1300, result.match_at(0)->relevance); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://www.foo.com/s?q=foo2", 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.match_at(1)->destination_url.spec()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1200, result.match_at(1)->relevance); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://www.foo.com/", 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.match_at(2)->destination_url.spec()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(900, result.match_at(2)->relevance); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutocompleteResultTest, SortAndCullWithMatchDups) { 364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Register a template URL that corresponds to 'foo' search engine. 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TemplateURLData url_data; 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url_data.short_name = base::ASCIIToUTF16("unittest"); 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url_data.SetKeyword(base::ASCIIToUTF16("foo")); 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url_data.SetURL("http://www.foo.com/s?q={searchTerms}"); 3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) template_url_service_.get()->Add(new TemplateURL(url_data)); 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AutocompleteMatch dup_match; 372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dup_match.destination_url = GURL("http://www.foo.com/s?q=foo&oq=dup"); 373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<AutocompleteMatch> dups; 374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dups.push_back(dup_match); 375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestData data[] = { 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 0, 0, 1300, dups }, 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 1, 0, 1200 }, 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 2, 0, 1100 }, 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 3, 0, 1000, dups }, 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 4, 1, 900 }, 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 5, 0, 800 }, 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ACMatches matches; 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[0].destination_url = GURL("http://www.foo.com/s?q=foo"); 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[1].destination_url = GURL("http://www.foo.com/s?q=foo2"); 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[2].destination_url = GURL("http://www.foo.com/s?q=foo&oq=f"); 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[3].destination_url = GURL("http://www.foo.com/s?q=foo&aqs=0"); 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[4].destination_url = GURL("http://www.foo.com/"); 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) matches[5].destination_url = GURL("http://www.foo.com/s?q=foo2&oq=f"); 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AutocompleteResult result; 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.AppendMatches(matches); 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16(), GURL(), 3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INVALID_SPEC, false, false, false, 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 4016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Expect 3 unique results after SortAndCull(). 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(3U, result.size()); 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Check that 3rd and 4th result got added to the first result as dups 407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and also duplicates of the 4th match got copied. 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(4U, result.match_at(0)->duplicate_matches.size()); 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const AutocompleteMatch* first_match = result.match_at(0); 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(matches[2].destination_url, 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_match->duplicate_matches.at(1).destination_url); 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(dup_match.destination_url, 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_match->duplicate_matches.at(2).destination_url); 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(matches[3].destination_url, 415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_match->duplicate_matches.at(3).destination_url); 416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Check that 6th result started a new list of dups for the second result. 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1U, result.match_at(1)->duplicate_matches.size()); 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(matches[5].destination_url, 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.match_at(1)->duplicate_matches.at(0).destination_url); 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(AutocompleteResultTest, SortAndCullWithDemotionsByType) { 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Add some matches. 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ACMatches matches; 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AutocompleteMatchTestData data[] = { 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://history-url/", AutocompleteMatchType::HISTORY_URL }, 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://search-what-you-typed/", 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://history-title/", AutocompleteMatchType::HISTORY_TITLE }, 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "http://search-history/", AutocompleteMatchType::SEARCH_HISTORY }, 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(data, arraysize(data), &matches); 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Demote the search history match relevance score. 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.back().relevance = 500; 437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Add a rule demoting history-url and killing history-title. 439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::map<std::string, std::string> params; 441c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params[std::string(OmniboxFieldTrial::kDemoteByTypeRule) + ":3:*"] = 442424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "1:50,7:100,2:0"; // 3 == HOME_PAGE 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(variations::AssociateVariationParams( 444c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A", params)); 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 446c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::FieldTrialList::CreateFieldTrial( 447c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A"); 448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocompleteResult result; 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result.AppendMatches(matches); 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 4536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 4566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check the new ordering. The history-title results should be omitted. 459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // We cannot check relevance scores because the matches are sorted by 460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // demoted relevance but the actual relevance scores are not modified. 461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ASSERT_EQ(3u, result.size()); 462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("http://search-what-you-typed/", 463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result.match_at(0)->destination_url.spec()); 464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("http://history-url/", 465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result.match_at(1)->destination_url.spec()); 466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("http://search-history/", 467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result.match_at(2)->destination_url.spec()); 468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 469c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(AutocompleteResultTest, SortAndCullWithMatchDupsAndDemotionsByType) { 471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Add some matches. 472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ACMatches matches; 473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const AutocompleteMatchTestData data[] = { 474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { "http://search-what-you-typed/", 475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { "http://dup-url/", AutocompleteMatchType::HISTORY_URL }, 477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { "http://dup-url/", AutocompleteMatchType::NAVSUGGEST }, 478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { "http://search-url/", AutocompleteMatchType::SEARCH_SUGGEST }, 479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { "http://history-url/", AutocompleteMatchType::HISTORY_URL }, 480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PopulateAutocompleteMatchesFromTestData(data, arraysize(data), &matches); 482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Add a rule demoting HISTORY_URL. 484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { 485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::map<std::string, std::string> params; 486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params[std::string(OmniboxFieldTrial::kDemoteByTypeRule) + ":8:*"] = 487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "1:50"; // 8 == INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(variations::AssociateVariationParams( 489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OmniboxFieldTrial::kBundledExperimentFieldTrialName, "C", params)); 490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FieldTrialList::CreateFieldTrial( 492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OmniboxFieldTrial::kBundledExperimentFieldTrialName, "C"); 493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { 495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AutocompleteResult result; 496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.AppendMatches(matches); 497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AutocompleteInput input( 498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16(), base::string16::npos, base::string16(), GURL(), 4996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::INSTANT_NTP_WITH_FAKEBOX_AS_STARTING_FOCUS, false, 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, false, true, 5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The NAVSUGGEST dup-url stay above search-url since the navsuggest 505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // variant should not be demoted. 506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(4u, result.size()); 507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("http://search-what-you-typed/", 508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.match_at(0)->destination_url.spec()); 509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("http://dup-url/", 510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.match_at(1)->destination_url.spec()); 511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(AutocompleteMatchType::NAVSUGGEST, 512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.match_at(1)->type); 513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("http://search-url/", 514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.match_at(2)->destination_url.spec()); 515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("http://history-url/", 516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result.match_at(3)->destination_url.spec()); 517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 520c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochTEST_F(AutocompleteResultTest, SortAndCullReorderForDefaultMatch) { 521c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch TestData data[] = { 522c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 0, 0, 1300 }, 523c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 1, 0, 1200 }, 524c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 2, 0, 1100 }, 525c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 3, 0, 1000 } 526c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch }; 527c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 528c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 529c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // Check that reorder doesn't do anything if the top result 530c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // is already a legal default match (which is the default from 531c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // PopulateAutocompleteMatches()). 532c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch ACMatches matches; 533c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PopulateAutocompleteMatches(data, arraysize(data), &matches); 534c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch AutocompleteResult result; 535c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch result.AppendMatches(matches); 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 5406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 5416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 542c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch AssertResultMatches(result, data, 4); 543c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 544c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 545c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch { 546c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // Check that reorder swaps up a result appropriately. 547c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch ACMatches matches; 548c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PopulateAutocompleteMatches(data, arraysize(data), &matches); 549c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch matches[0].allowed_to_be_default_match = false; 550c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch matches[1].allowed_to_be_default_match = false; 551c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch AutocompleteResult result; 552c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch result.AppendMatches(matches); 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), GURL(), 5556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 5586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 559c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch ASSERT_EQ(4U, result.size()); 560c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); 561c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); 562c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); 563c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); 564c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 565c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 56746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 56846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 56946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AutocompleteResultTest, SortAndCullWithDisableInlining) { 57046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestData data[] = { 57146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 0, 0, 1300 }, 57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 1, 0, 1200 }, 57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 2, 0, 1100 }, 57446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 3, 0, 1000 } 57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 57646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 57746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Check that with the field trial disabled, we keep keep the first match 57946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // first even if it has an inline autocompletion. 58046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); 58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 5876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 5896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 5906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AssertResultMatches(result, data, 4); 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Enable the field trial to disable inlining. 59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::map<std::string, std::string> params; 59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) params[OmniboxFieldTrial::kDisableInliningRule] = "true"; 5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(variations::AssociateVariationParams( 59946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OmniboxFieldTrial::kBundledExperimentFieldTrialName, "D", params)); 60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FieldTrialList::CreateFieldTrial( 60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OmniboxFieldTrial::kBundledExperimentFieldTrialName, "D"); 60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Now the first match should be demoted past the second. 60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 60846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); 60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 6136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 6156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 6166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 61746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(4U, result.size()); 61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://b/", result.match_at(0)->destination_url.spec()); 61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); 62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://c/", result.match_at(2)->destination_url.spec()); 62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); 62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // But if there was no inline autocompletion on the first match, then 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the order should stay the same. This is true even if there are 62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // inline autocompletions elsewhere. 62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[2].inline_autocompletion = base::ASCIIToUTF16("completion"); 63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 6356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AssertResultMatches(result, data, 4); 64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Try a more complicated situation. 64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].allowed_to_be_default_match = false; 64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[1].inline_autocompletion = base::ASCIIToUTF16("completion"); 64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 6526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 6546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(4U, result.size()); 65746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); 65846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); 65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); 66046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); 66146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 66246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 66346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Try another complicated situation. 66546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 66646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 66746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); 66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[1].allowed_to_be_default_match = false; 66946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 67046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 67146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 67246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 6736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 6756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 6766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 67746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(4U, result.size()); 67846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://c/", result.match_at(0)->destination_url.spec()); 67946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); 68046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://b/", result.match_at(2)->destination_url.spec()); 68146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); 68246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 68346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 68446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 68546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Check that disaster doesn't strike if we can't demote the top inline 68646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // autocompletion because every match either has a completion or isn't 68746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // allowed to be the default match. In this case, we should leave 68846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // everything untouched. 68946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 69046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 69146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].inline_autocompletion = base::ASCIIToUTF16("completion"); 69246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[1].allowed_to_be_default_match = false; 69346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[2].allowed_to_be_default_match = false; 69446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[3].inline_autocompletion = base::ASCIIToUTF16("completion"); 69546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 69646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 69746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 69846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 6996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 7016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 7026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 70346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AssertResultMatches(result, data, 4); 70446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 70546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 70646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 70746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Check a similar situation, except in this case the top match is not 70846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // allowed to the default match, so it still needs to be demoted so we 70946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // get a legal default match first. That match will have an inline 71046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // autocompletion because we don't have any better options. 71146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ACMatches matches; 71246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PopulateAutocompleteMatches(data, arraysize(data), &matches); 71346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[0].allowed_to_be_default_match = false; 71446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[1].inline_autocompletion = base::ASCIIToUTF16("completion"); 71546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[2].allowed_to_be_default_match = false; 71646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) matches[3].inline_autocompletion = base::ASCIIToUTF16("completion"); 71746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteResult result; 71846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) result.AppendMatches(matches); 71946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AutocompleteInput input(base::string16(), base::string16::npos, 72046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16(), GURL(), 7216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OmniboxEventProto::HOME_PAGE, false, false, false, 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true, 7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestSchemeClassifier()); 7246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result.SortAndCull(input, template_url_service_.get()); 72546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(4U, result.size()); 72646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://b/", result.match_at(0)->destination_url.spec()); 72746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://a/", result.match_at(1)->destination_url.spec()); 72846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://c/", result.match_at(2)->destination_url.spec()); 72946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("http://d/", result.match_at(3)->destination_url.spec()); 73046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 73146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 73246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AutocompleteResultTest, ShouldHideTopMatch) { 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::CreateFieldTrial("InstantExtended", 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Group1 hide_verbatim:1"); 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACMatches matches; 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 1: Top match is a verbatim match. 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteResult result; 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(result.ShouldHideTopMatch()); 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.clear(); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.Reset(); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 2: If the verbatim first match is followed by another verbatim match, 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // don't hide the top verbatim match. 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) arraysize(kVerbatimMatches), 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &matches); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.ShouldHideTopMatch()); 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.clear(); 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.Reset(); 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 3: Top match is not a verbatim match. Do not hide the top match. 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kNonVerbatimMatches, 1, &matches); 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) arraysize(kVerbatimMatches), 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &matches); 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.ShouldHideTopMatch()); 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AutocompleteResultTest, ShouldHideTopMatchAfterCopy) { 766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FieldTrialList::CreateFieldTrial("InstantExtended", 767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "Group1 hide_verbatim:1"); 768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ACMatches matches; 769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Case 1: Top match is a verbatim match followed by only copied matches. 771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch arraysize(kVerbatimMatches), 773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &matches); 774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (size_t i = 1; i < arraysize(kVerbatimMatches); ++i) 775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch matches[i].from_previous = true; 776effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AutocompleteResult result; 777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch result.AppendMatches(matches); 778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(result.ShouldHideTopMatch()); 779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch result.Reset(); 780effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Case 2: The copied matches are then followed by a non-verbatim match. 782effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PopulateAutocompleteMatchesFromTestData(kNonVerbatimMatches, 1, &matches); 783effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch result.AppendMatches(matches); 784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(result.ShouldHideTopMatch()); 785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch result.Reset(); 786effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 787effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Case 3: The copied matches are instead followed by a verbatim match. 788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch matches.back().from_previous = true; 789effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); 790effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch result.AppendMatches(matches); 791effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(result.ShouldHideTopMatch()); 792effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 793effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AutocompleteResultTest, DoNotHideTopMatch_FieldTrialFlagDisabled) { 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This test config is identical to ShouldHideTopMatch test ("Case 1") except 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // that the "hide_verbatim" flag is disabled in the field trials. 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::CreateFieldTrial("InstantExtended", 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Group1 hide_verbatim:0"); 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACMatches matches; 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteResult result; 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Field trial flag "hide_verbatim" is disabled. Do not hide top match. 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.ShouldHideTopMatch()); 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(AutocompleteResultTest, TopMatchIsStandaloneVerbatimMatch) { 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACMatches matches; 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutocompleteResult result; 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 1: Result set is empty. 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.TopMatchIsStandaloneVerbatimMatch()); 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 2: Top match is not a verbatim match. 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kNonVerbatimMatches, 1, &matches); 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.TopMatchIsStandaloneVerbatimMatch()); 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.Reset(); 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.clear(); 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 3: Top match is a verbatim match. 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(result.TopMatchIsStandaloneVerbatimMatch()); 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.Reset(); 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.clear(); 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 4: Standalone verbatim match found in AutocompleteResult. 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 1, &matches); 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kNonVerbatimMatches, 1, &matches); 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(result.TopMatchIsStandaloneVerbatimMatch()); 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.Reset(); 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matches.clear(); 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Case 5: Multiple verbatim matches found in AutocompleteResult. 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PopulateAutocompleteMatchesFromTestData(kVerbatimMatches, 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) arraysize(kVerbatimMatches), 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &matches); 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.AppendMatches(matches); 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(result.ShouldHideTopMatch()); 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 844