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, &current_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