search_provider_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/search_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/field_trial.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider_listener.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autocomplete/history_url_provider.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/omnibox/omnibox_field_trial.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/metrics/entropy_provider.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following environment is configured for these tests:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The TemplateURL default_t_url_ is set as the default provider.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The TemplateURL keyword_t_url_ is added to the TemplateURLService. This
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   TemplateURL has a valid suggest and search URL.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The URL created by using the search term term1_ with default_t_url_ is
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   added to history.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The URL created by using the search term keyword_term_ with keyword_t_url_
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   is added to history.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . test_factory_ is set as the URLFetcherFactory.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchProviderTest : public testing::Test,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public AutocompleteProviderListener {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchProviderTest()
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : default_t_url_(NULL),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        term1_(UTF8ToUTF16("term1")),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keyword_t_url_(NULL),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keyword_term_(UTF8ToUTF16("keyword")),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_thread_(BrowserThread::UI, &message_loop_),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quit_when_done_(false) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.Start();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetUpTestCase();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void TearDownTestCase();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See description above class for what this registers.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct ResultInfo {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResultInfo() : result_type(AutocompleteMatch::NUM_TYPES) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResultInfo(GURL gurl,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               AutocompleteMatch::Type result_type,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               string16 fill_into_edit)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : gurl(gurl),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result_type(result_type),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fill_into_edit(fill_into_edit) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL gurl;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AutocompleteMatch::Type result_type;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16 fill_into_edit;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestData {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16 input;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const size_t num_results;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResultInfo output[3];
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunTest(TestData* cases, int num_cases, bool prefer_keyword);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Needed for AutocompleteFieldTrial::ActivateStaticTrials();
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static base::FieldTrialList* field_trial_list_;
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Default value used for testing.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const std::string kNotApplicable;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a search for |term|, using the engine |t_url| to the history, and
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns the URL for that search.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL AddSearchToHistory(TemplateURL* t_url, string16 term, int visit_count);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for a match in |provider_| with |contents| equal to |contents|.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |match| to it if found.  Returns whether |match| was set.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindMatchWithContents(const string16& contents,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             AutocompleteMatch* match);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for a match in |provider_| with destination |url|.  Sets |match| to
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it if found.  Returns whether |match| was set.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindMatchWithDestination(const GURL& url, AutocompleteMatch* match);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutocompleteProviderListener:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're waiting for the provider to finish, this exits the message loop.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProviderUpdate(bool updated_matches) OVERRIDE;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits until the provider instantiates a URLFetcher and returns it.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLFetcher* WaitUntilURLFetcherIsReady(int fetcher_id);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs a nested message loop until provider_ is done. The message loop is
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exited by way of OnProviderUpdate.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTillProviderDone();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invokes Start on provider_, then runs all pending tasks.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryForInput(const string16& text,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     bool prevent_inline_autocomplete,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     bool prefer_keyword);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls QueryForInput(), finishes any suggest query, then if |wyt_match| is
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-NULL, sets it to the "what you typed" entry for |text|.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryForInputAndSetWYTMatch(const string16& text,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   AutocompleteMatch* wyt_match);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the URLFetcher for the suggest query corresponding to the default
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search provider that it's done.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishDefaultSuggestQuery();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See description above class for details of these fields.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURL* default_t_url_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 term1_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term1_url_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURL* keyword_t_url_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 keyword_term_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL keyword_url_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForUI message_loop_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetcherFactory implementation registered.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcherFactory test_factory_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile we use.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The provider.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SearchProvider> provider_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If true, OnProviderUpdate exits out of the current message loop.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool quit_when_done_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchProviderTest);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FieldTrialList* SearchProviderTest::field_trial_list_ = NULL;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::string SearchProviderTest::kNotApplicable = "Not Applicable";
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchProviderTest::SetUpTestCase() {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up Suggest experiments.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field_trial_list_ = new base::FieldTrialList(
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new metrics::SHA1EntropyProvider("foo"));
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "AutocompleteDynamicTrial_0", "DefaultGroup");
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  trial->group();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchProviderTest::TearDownTestCase() {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the global instance of FieldTrialList is gone.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete field_trial_list_;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::SetUp() {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that fetchers are automatically ungregistered upon destruction.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_factory_.set_remove_fetcher_on_delete(true);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need both the history service and template url model loaded.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.CreateHistoryService(true, false);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* turl_model =
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Load();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the default TemplateURL.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLData data;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.short_name = ASCIIToUTF16("t");
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://defaultturl/{searchTerms}");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.suggestions_url = "http://defaultturl2/{searchTerms}";
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data.instant_url = "http://does/not/exist";
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_t_url_ = new TemplateURL(&profile_, data);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(default_t_url_);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->SetDefaultSearchProvider(default_t_url_);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID default_provider_id = default_t_url_->id();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, default_provider_id);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add url1, with search term term1_.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  term1_url_ = AddSearchToHistory(default_t_url_, term1_, 1);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another TemplateURL.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.short_name = ASCIIToUTF16("k");
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetKeyword(ASCIIToUTF16("k"));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://keyword/{searchTerms}");
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.suggestions_url = "http://suggest_keyword/{searchTerms}";
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_t_url_ = new TemplateURL(&profile_, data);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(keyword_t_url_);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, keyword_t_url_->id());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a page and search term for keyword_t_url_.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_url_ = AddSearchToHistory(keyword_t_url_, keyword_term_, 1);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keywords are updated by the InMemoryHistoryBackend only after the message
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has been processed on the history thread. Block until history processes all
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests to ensure the InMemoryDatabase is the state we expect it.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = new SearchProvider(this, &profile_);
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  provider_->kMinimumTimeBetweenSuggestQueriesMs = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::OnProviderUpdate(bool updated_matches) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quit_when_done_ && provider_->done()) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quit_when_done_ = false;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.Quit();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::TestURLFetcher* SearchProviderTest::WaitUntilURLFetcherIsReady(
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int fetcher_id) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLFetcher* url_fetcher = test_factory_.GetFetcherByID(fetcher_id);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; !url_fetcher; url_fetcher = test_factory_.GetFetcherByID(fetcher_id))
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return url_fetcher;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::RunTillProviderDone() {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (provider_->done())
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quit_when_done_ = true;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Android doesn't have Run(), only Start().
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.Start();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RunLoop run_loop;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop.Run();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::QueryForInput(const string16& text,
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool prevent_inline_autocomplete,
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool prefer_keyword) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a query.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteInput input(text, string16::npos, string16(), GURL(),
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          prevent_inline_autocomplete,
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          prefer_keyword, true, AutocompleteInput::ALL_MATCHES);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->Start(input, false);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RunUntilIdle so that the task scheduled by SearchProvider to create the
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetchers runs.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::QueryForInputAndSetWYTMatch(
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& text,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch* wyt_match) {
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(text, false, false);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(chrome::IsInstantEnabled(&profile_), provider_->done());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!wyt_match)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GE(provider_->matches().size(), 1u);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(GURL(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_t_url_->url_ref().ReplaceSearchTerms(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TemplateURLRef::SearchTermsArgs(text))),
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wyt_match));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::TearDown() {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown the provider before the profile.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = NULL;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchProviderTest::RunTest(TestData* cases,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int num_cases,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool prefer_keyword) {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ACMatches matches;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < num_cases; ++i) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutocompleteInput input(cases[i].input, string16::npos, string16(), GURL(),
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            false, prefer_keyword, true,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            AutocompleteInput::ALL_MATCHES);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->Start(input, false);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    matches = provider_->matches();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 diagnostic_details = ASCIIToUTF16("Input was: ") + cases[i].input +
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASCIIToUTF16("; prefer_keyword was: ") +
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (prefer_keyword ? ASCIIToUTF16("true") : ASCIIToUTF16("false"));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(cases[i].num_results, matches.size()) << diagnostic_details;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (matches.size() == cases[i].num_results) {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (size_t j = 0; j < cases[i].num_results; ++j) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(cases[i].output[j].gurl, matches[j].destination_url) <<
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            diagnostic_details;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(cases[i].output[j].result_type, matches[j].type) <<
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            diagnostic_details;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(cases[i].output[j].fill_into_edit,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  matches[j].fill_into_edit) <<
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            diagnostic_details;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL SearchProviderTest::AddSearchToHistory(TemplateURL* t_url,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            string16 term,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int visit_count) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history =
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryServiceFactory::GetForProfile(&profile_,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Profile::EXPLICIT_ACCESS);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL search(t_url->url_ref().ReplaceSearchTerms(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static base::Time last_added_time;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_added_time = std::max(base::Time::Now(),
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_added_time + base::TimeDelta::FromMicroseconds(1));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history->AddPageWithDetails(search, string16(), visit_count, visit_count,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_added_time, false, history::SOURCE_BROWSED);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history->SetKeywordSearchTermsForURL(search, t_url->id(), term);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return search;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchProviderTest::FindMatchWithContents(const string16& contents,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               AutocompleteMatch* match) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator i = provider_->matches().begin();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != provider_->matches().end(); ++i) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->contents == contents) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *match = *i;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchProviderTest::FindMatchWithDestination(const GURL& url,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  AutocompleteMatch* match) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator i = provider_->matches().begin();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != provider_->matches().end(); ++i) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->destination_url == url) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *match = *i;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::FinishDefaultSuggestQuery() {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLFetcher* default_fetcher = WaitUntilURLFetcherIsReady(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(default_fetcher);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the default suggest query is done.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->set_response_code(200);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests -----------------------------------------------------------------------
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure we query history for the default provider and a URLFetcher is
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created for the default provider suggest results.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, QueryDefaultProvider) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = term1_.substr(0, term1_.length() - 1);
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(term, false, false);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the URL matches what we expected.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_url(default_t_url_->suggestions_url_ref().ReplaceSearchTerms(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher->GetOriginalURL() == expected_url);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SearchProvider is done. Make sure it has a result for the history
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // term term1.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term1_match;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term1_url_, &term1_match));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Term1 should not have a description, it's set later.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(term1_match.description.empty());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(default_t_url_->url_ref().ReplaceSearchTerms(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TemplateURLRef::SearchTermsArgs(term))), &wyt_match));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wyt_match.description.empty());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The match for term1 should be more relevant than the what you typed result.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term1_match.relevance, wyt_match.relevance);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = term1_.substr(0, term1_.length() - 1);
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(term, true, false);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(provider_->matches().empty());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            provider_->matches()[0].type);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Issues a query that matches the registered keyword and makes sure history
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is queried as well as URLFetchers getting created.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, QueryKeywordProvider) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = keyword_term_.substr(0, keyword_term_.length() - 1);
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(keyword_t_url_->keyword() + UTF8ToUTF16(" ") + term,
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false,
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID(
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(default_fetcher);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the default suggest query is done.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->set_response_code(200);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher = NULL;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the keyword providers suggest service was queried.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* keyword_fetcher = test_factory_.GetFetcherByID(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kKeywordProviderURLFetcherID);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(keyword_fetcher);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the URL matches what we expected.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_url(keyword_t_url_->suggestions_url_ref().ReplaceSearchTerms(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(keyword_fetcher->GetOriginalURL() == expected_url);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the keyword suggest query is done.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher->set_response_code(200);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher = NULL;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SearchProvider is done. Make sure it has a result for the history
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // term keyword.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch match;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(keyword_url_, &match));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The match should have an associated keyword.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(match.keyword.empty());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The fill into edit should contain the keyword.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.fill_into_edit);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // None of the following input strings should be sent to the suggest server,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because they may contain private data.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* inputs[] = {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "username:password",
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://username:password",
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://username:password",
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "username:password@hostname",
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://username:password@hostname/",
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "file://filename",
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "data://data",
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "unknownscheme:anything",
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://hostname/?query=q",
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://hostname/path#ref",
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://hostname/path",
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(inputs); ++i) {
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(inputs[i]), false, false);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the default providers suggest service was not queried.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_factory_.GetFetcherByID(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID) == NULL);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run till the history results complete.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure FinalizeInstantQuery works.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, FinalizeInstantQuery) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* service = profile_.GetPrefs();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->SetBoolean(prefs::kInstantEnabled, true);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo"),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      NULL));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the provider Instant is done.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  InstantSuggestion(ASCIIToUTF16("bar"),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTANT_COMPLETE_NOW,
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    INSTANT_SUGGESTION_SEARCH,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    string16()));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The provider should now be done.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(provider_->done());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should be two matches, one for what you typed, the other for
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'foobar'.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, provider_->matches().size());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL instant_url(default_t_url_->url_ref().ReplaceSearchTerms(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("foobar"))));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch instant_match;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match));
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the 'foobar' match should not have a description, it'll be set later.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instant_match.description.empty());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the what you typed match has no description.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(default_t_url_->url_ref().ReplaceSearchTerms(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("foo")))),
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &wyt_match));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wyt_match.description.empty());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Instant search should be more relevant.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(instant_match.relevance, wyt_match.relevance);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure FinalizeInstantQuery works with URL suggestions.
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, FinalizeInstantURL) {
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* service = profile_.GetPrefs();
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->SetBoolean(prefs::kInstantEnabled, true);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("ex"),
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      NULL));
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the provider Instant is done.
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider_->FinalizeInstantQuery(ASCIIToUTF16("ex"),
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  InstantSuggestion(
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ASCIIToUTF16("http://example.com/"),
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      INSTANT_COMPLETE_NOW,
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      INSTANT_SUGGESTION_URL,
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      string16()));
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The provider should now be done.
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(provider_->done());
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There should be two matches, one for what you typed, the other for
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "http://example.com/".
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, provider_->matches().size());
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL instant_url("http://example.com");
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteMatch instant_match;
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match));
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Instant match should not have a description, it'll be set later.
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instant_match.description.empty());
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the what you typed match has no description.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteMatch wyt_match;
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL(default_t_url_->url_ref().ReplaceSearchTerms(
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("ex")))),
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &wyt_match));
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wyt_match.description.empty());
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Instant URL should be more relevant.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(instant_match.relevance, wyt_match.relevance);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// An Instant URL suggestion should behave the same way whether the input text
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is classified as UNKNOWN or as an URL. Otherwise if the user types
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "example.co" url-what-you-typed will displace the Instant suggestion for
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "example.com".
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, FinalizeInstantURLWithURLText) {
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* service = profile_.GetPrefs();
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->SetBoolean(prefs::kInstantEnabled, true);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASCIIToUTF16("example.co"), NULL));
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the provider Instant is done.
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider_->FinalizeInstantQuery(ASCIIToUTF16("example.co"),
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  InstantSuggestion(
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ASCIIToUTF16("http://example.com/"),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      INSTANT_COMPLETE_NOW,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      INSTANT_SUGGESTION_URL,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      string16()));
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The provider should now be done.
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(provider_->done());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There should be two matches, one for what you typed, the other for
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "http://example.com/".
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, provider_->matches().size());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL instant_url("http://example.com");
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteMatch instant_match;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match));
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Instant match should not have a description, it'll be set later.
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instant_match.description.empty());
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Instant URL should be more relevant than a URL_WHAT_YOU_TYPED match.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(instant_match.relevance,
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            HistoryURLProvider::kScoreForWhatYouTypedResult);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that if FinalizeInstantQuery is invoked before suggest results
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return, the suggest text from FinalizeInstantQuery is remembered.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, RememberInstantQuery) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* service = profile_.GetPrefs();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->SetBoolean(prefs::kInstantEnabled, true);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("foo"), false, false);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finalize the Instant query immediately.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"),
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  InstantSuggestion(ASCIIToUTF16("bar"),
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTANT_COMPLETE_NOW,
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    INSTANT_SUGGESTION_SEARCH,
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    string16()));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should be two matches, one for what you typed, the other for
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'foobar'.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, provider_->matches().size());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL instant_url(default_t_url_->url_ref().ReplaceSearchTerms(
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(ASCIIToUTF16("foobar"))));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch instant_match;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until history and the suggest query complete.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provider should be done.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(provider_->done());
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should be two matches, one for what you typed, the other for
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'foobar'.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, provider_->matches().size());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(instant_url, &instant_match));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the 'foobar' match should not have a description, it'll be set later.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instant_match.description.empty());
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that if trailing whitespace is added to the text supplied to
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AutocompleteInput the default suggest text is cleared.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DifferingText) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* service = profile_.GetPrefs();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->SetBoolean(prefs::kInstantEnabled, true);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo"),
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      NULL));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finalize the Instant query immediately.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"),
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  InstantSuggestion(ASCIIToUTF16("bar"),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    INSTANT_COMPLETE_NOW,
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    INSTANT_SUGGESTION_SEARCH,
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    string16()));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query with the same input text, but trailing whitespace.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch instant_match;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("foo "),
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &instant_match));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should only one match, for what you typed.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, provider_->matches().size());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instant_match.destination_url.is_empty());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteClassifierFactory::GetInstance()->SetTestingFactoryAndUse(
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &AutocompleteClassifierFactory::BuildInstanceFor);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = AddSearchToHistory(default_t_url_,
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ASCIIToUTF16("docs.google.com"), 1);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the term as a url.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryServiceFactory::GetForProfile(&profile_, Profile::EXPLICIT_ACCESS)->
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddPageWithDetails(GURL("http://docs.google.com"), string16(), 1, 1,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::Time::Now(), false, history::SOURCE_BROWSED);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("docs"),
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should be two matches, one for what you typed, the other for
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'docs.google.com'. The search term should have a lower priority than the
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // what you typed match.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(url, &term_match));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match.relevance);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A multiword search with one visit should not autocomplete until multiple
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// words are typed.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontAutocompleteUntilMultipleWordsTyped) {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("one search"),
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   1));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("on"),
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match.relevance);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("one se"),
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A multiword search with more than one visit should autocomplete immediately.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, AutocompleteMultipleVisitsImmediately) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"),
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   2));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("tw"),
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocompletion should work at a word boundary after a space.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, AutocompleteAfterSpace) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"),
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   2));
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("two "),
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Newer multiword searches should score more highly than older ones.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, ScoreNewerSearchesHigher) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_a(AddSearchToHistory(default_t_url_,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("three searches aaa"), 1));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_b(AddSearchToHistory(default_t_url_,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("three searches bbb"), 1));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("three se"),
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_a;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_b;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_b.relevance, term_match_a.relevance);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An autocompleted multiword search should not be replaced by a different
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autocompletion while the user is still typing a valid prefix.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontReplacePreviousAutocompletion) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_a(AddSearchToHistory(default_t_url_,
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("four searches aaa"), 2));
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_b(AddSearchToHistory(default_t_url_,
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("four searches bbb"), 1));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fo"),
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_a;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_b;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match_b.relevance);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("four se"),
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match_b.relevance);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Non-completable multiword searches should not crowd out single-word searches.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontCrowdOutSingleWords) {
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("five"), 1));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches bbb"), 1);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ccc"), 1);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ddd"), 1);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches eee"), 1);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fi"),
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(AutocompleteProvider::kMaxMatches + 1, provider_->matches().size());
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inline autocomplete matches regardless of case differences from the input.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, InlineMixedCaseMatches) {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("FOO"), 1));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("f"),
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, term_match.inline_autocomplete_offset);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("FOO"), term_match.fill_into_edit);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies AutocompleteControllers return results (including keyword
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// results) in the right order and set descriptions for them correctly.
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordOrderingAndDescriptions) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an entry that corresponds to a keyword search with 'term2'.
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(keyword_t_url_, ASCIIToUTF16("term2"), 1);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteController controller(&profile_, NULL,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutocompleteProvider::TYPE_SEARCH);
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller.Start(AutocompleteInput(
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASCIIToUTF16("k t"), string16::npos, string16(), GURL(), false, false,
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true, AutocompleteInput::ALL_MATCHES));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AutocompleteResult& result = controller.result();
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There should be three matches, one for the keyword history, one for
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // keyword provider's what-you-typed, and one for the default provider's
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // what you typed, in that order.
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3u, result.size());
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::SEARCH_HISTORY, result.match_at(0).type);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::SEARCH_OTHER_ENGINE, result.match_at(1).type);
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, result.match_at(2).type);
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(result.match_at(0).relevance, result.match_at(1).relevance);
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(result.match_at(1).relevance, result.match_at(2).relevance);
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The two keyword results should come with the keyword we expect.
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("k"), result.match_at(0).keyword);
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("k"), result.match_at(1).keyword);
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default provider has a different keyword.  (We don't explicitly
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // set it during this test, so all we do is assert that it's different.)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(result.match_at(0).keyword, result.match_at(2).keyword);
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The top result will always have a description.  The third result,
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // coming from a different provider than the first two, should also.
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the second result has one doesn't matter much.  (If it was
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // missing, people would infer that it's the same search provider as
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the one above it.)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result.match_at(0).description.empty());
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result.match_at(2).description.empty());
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(result.match_at(0).description, result.match_at(2).description);
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordVerbatim) {
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestData cases[] = {
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test a simple keyword input.
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k foo"), 2,
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20foo"),
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo") ) } },
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure extra whitespace after the keyword doesn't change the
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // keyword verbatim query.
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k   foo"), 2,
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20%20%20foo"),
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k   foo")) } },
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Leading whitespace should be stripped before SearchProvider gets the
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input; hence there are no tests here about how it handles those inputs.
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // But whitespace elsewhere in the query string should matter to both
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // matches.
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k  foo  bar"), 2,
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo%20%20bar"),
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo  bar")),
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20%20foo%20%20bar"),
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k  foo  bar")) } },
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note in the above test case we don't test trailing whitespace because
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SearchProvider still doesn't handle this well.  See related bugs:
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // 102690, 99239, 164635.
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Keywords can be prefixed by certain things that should get ignored
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // when constructing the keyword match.
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("www.k foo"), 2,
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/www.k%20foo"),
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("www.k foo")) } },
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("http://k foo"), 2,
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/http%3A//k%20foo"),
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("http://k foo")) } },
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("http://www.k foo"), 2,
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_OTHER_ENGINE,
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/http%3A//www.k%20foo"),
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("http://www.k foo")) } },
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // A keyword with no remaining input shouldn't get a keyword
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // verbatim match.
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k"), 1,
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://defaultturl/k"),
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k")) } },
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k "), 1,
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://defaultturl/k%20"),
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k ")) } }
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The fact that verbatim queries to keyword are handled by KeywordProvider
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not SearchProvider is tested in
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // chrome/browser/extensions/api/omnibox/omnibox_apitest.cc.
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test not in keyword mode.
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTest(cases, arraysize(cases), false);
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test in keyword mode.  (Both modes should give the same result.)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTest(cases, arraysize(cases), true);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies Navsuggest results don't set a TemplateURL, which Instant relies on.
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Also verifies that just the *first* navigational result is listed as a match
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if suggested relevance scores were not sent.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, NavSuggestNoSuggestedRelevanceScores) {
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("a.c"), false, false);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetResponseString(
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[\"a.c\",[\"a.com\", \"a.com/b\"],[\"a\", \"b\"],[],"
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]");
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the only match is 'a.com' and it doesn't have a template_url.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch nav_match;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(GURL("http://a.com"), &nav_match));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(nav_match.keyword.empty());
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindMatchWithDestination(GURL("http://a.com/b"), &nav_match));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the most relevant suggest results are added properly.
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, SuggestRelevance) {
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("a"), false, false);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default provider's suggest service was queried.
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetResponseString("[\"a\",[\"a1\", \"a2\", \"a3\", \"a4\"]]");
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the expected verbatim and (first 3) suggestions' relative relevances.
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch verbatim, match_a1, match_a2, match_a3, match_a4;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a1"), &match_a1));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a2"), &match_a2));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a3"), &match_a3));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("a4"), &match_a4));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(verbatim.relevance, match_a1.relevance);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(match_a1.relevance, match_a2.relevance);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(match_a2.relevance, match_a3.relevance);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that suggest results with relevance scores are added
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// properly when using the default fetcher.  When adding a new test
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// case to this test, please consider adding it to the tests in
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// KeywordFetcherSuggestRelevance below.
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, DefaultFetcherSuggestRelevance) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string json;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string matches[4];
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that suggestrelevance scores reorder matches.
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "c", "b", kNotApplicable } },
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2]}]",
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { "a", "c.com", "b.com", kNotApplicable } },
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Without suggested relevance scores, we should only allow one
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // navsuggest result to be be displayed.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { "a", "b.com", kNotApplicable, kNotApplicable } },
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatimrelevance scores reorder or suppress verbatim.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Negative values will have no effect; the calculated value will be used.
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9998]}]",
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", kNotApplicable, kNotApplicable } },
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a1", "a", kNotApplicable, kNotApplicable } },
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a1", kNotApplicable, kNotApplicable, kNotApplicable } },
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a1", "a", kNotApplicable, kNotApplicable } },
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":9999,"
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9998]}]",
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a.com", kNotApplicable, kNotApplicable } },
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":9998,"
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "a", kNotApplicable, kNotApplicable } },
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0,"
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", kNotApplicable, kNotApplicable, kNotApplicable } },
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":-1,"
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "a", kNotApplicable, kNotApplicable } },
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that both types of relevance scores reorder matches together.
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "\"google:verbatimrelevance\":9998}]",
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a1", "a", "a2", kNotApplicable } },
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that only inlinable matches may be ranked as the highest result.
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore all suggested relevance scores if this constraint is violated.
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "b", kNotApplicable, kNotApplicable } },
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "\"google:verbatimrelevance\":0}]",
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "b", kNotApplicable, kNotApplicable } },
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "b.com", kNotApplicable, kNotApplicable } },
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999],"
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "b.com", kNotApplicable, kNotApplicable } },
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the top result is ranked as highly as calculated verbatim.
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore the suggested verbatim relevance if this constraint is violated.
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", kNotApplicable, kNotApplicable } },
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]",
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", kNotApplicable, kNotApplicable } },
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1],"
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:verbatimrelevance\":0}]",
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", kNotApplicable, kNotApplicable } },
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2],"
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "\"google:verbatimrelevance\":0}]",
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a2", "a1", kNotApplicable } },
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3],"
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"google:verbatimrelevance\":2}]",
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a2", "a1", kNotApplicable } },
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1],"
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a.com", kNotApplicable, kNotApplicable } },
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2],"
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { "a", "a2.com", "a1.com", kNotApplicable } },
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that all suggestions are considered, regardless of order.
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "h", "g", "f" } },
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\"http://e.com\", \"http://f.com\", \"http://g.com\","
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\"http://h.com\"],[],[],"
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\"],"
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { "a", "h.com", "g.com", "f.com" } },
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that incorrectly sized suggestion relevance lists are ignored.
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", "a2", kNotApplicable } },
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1", kNotApplicable, kNotApplicable } },
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1]}]",
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1.com", kNotApplicable, kNotApplicable } },
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\"],[],[],"
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "\"google:suggestrelevance\":[9999, 1]}]",
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", "a1.com", kNotApplicable, kNotApplicable } },
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that all 'verbatim' results are merged with their maximum score.
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a2", "a", "a1", kNotApplicable } },
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999],"
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a2", "a", "a1", kNotApplicable } },
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that verbatim is always generated without other suggestions.
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(msw): Ensure verbatimrelevance is respected (except suppression).
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", kNotApplicable, kNotApplicable, kNotApplicable } },
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a", kNotApplicable, kNotApplicable, kNotApplicable } },
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16("a"), false, false);
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::TestURLFetcher* fetcher = WaitUntilURLFetcherIsReady(
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID);
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(fetcher);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(cases[i].json);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   const std::string description = "for input with json=" + cases[i].json;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(string16::npos, matches[0].inline_autocomplete_offset) <<
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        description;
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300) << description;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t j = 0;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < matches.size(); ++j)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j]),
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].contents) << description;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that no expected matches are missing.
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(kNotApplicable, cases[i].matches[j]) <<
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "Case # " << i << " " << description;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that suggest results with relevance scores are added
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// properly when using the keyword fetcher.  This is similar to the
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// test DefaultFetcherSuggestRelevance above but this uses inputs that
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// trigger keyword suggestions (i.e., "k a" rather than "a") and has
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// different expectations (because now the results are a mix of
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// keyword suggestions and default provider suggestions).  When a new
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// test is added to this TEST_F, please consider if it would be
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// appropriate to add to DefaultFetcherSuggestRelevance as well.
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordFetcherSuggestRelevance) {
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct {
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string json;
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const struct {
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string contents;
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const bool from_keyword;
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } matches[5];
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } cases[] = {
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that suggest relevance scores reorder matches and that
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the keyword verbatim (lacking a suggested verbatim score) beats
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the default provider verbatim.
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "c", true },
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b", true },
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Again, check that relevance scores reorder matches, just this
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // time with navigation matches.  This also checks that with
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // suggested relevance scores we allow multiple navsuggest results.
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It's odd that navsuggest results that come from a keyword
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // provider are marked as not a keyword result.  I think this
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // comes from them not going to a keyword search engine).
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mpearson): Investigate the implications (if any) of
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tagging these results appropriately.  If so, do it because it
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // makes more sense.
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"d\"],[],[],"
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "\"google:suggestrelevance\":[1301, 1302, 1303]}]",
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "d", true },
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "c.com", false },
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b.com", false },
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false }, } },
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Without suggested relevance scores, we should only allow one
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // navsuggest result to be be displayed.
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b.com", false },
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatimrelevance scores reorder or suppress verbatim.
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Negative values will have no effect; the calculated value will be used.
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9998]}]",
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a1", true },
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a", true },
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a1", true },
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a1", true },
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a", true },
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":9999,"
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9998]}]",
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a.com", false },
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that both types of relevance scores reorder matches together.
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     "\"google:verbatimrelevance\":9998}]",
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a1", true },
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a", true },
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a2", true },
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that only inlinable matches may be ranked as the highest result.
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore all suggested relevance scores if this constraint is violated.
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b", true },
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            "\"google:verbatimrelevance\":0}]",
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b", true },
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b.com", false },
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9999],"
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "b.com", false },
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that the top result is ranked as highly as calculated verbatim.
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore the suggested verbatim relevance if this constraint is violated.
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that keyword suggestions by default (not in suggested relevance
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mode) score more highly than the default verbatim.
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]",
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Continuing the same category of tests, but make sure we keep the
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // suggested relevance scores even as we discard the verbatim relevance
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scores.
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1],"
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:verbatimrelevance\":0}]",
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2],"
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     "\"google:verbatimrelevance\":0}]",
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a2", true },
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3],"
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "\"google:verbatimrelevance\":2}]",
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a2", true },
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that all suggestions are considered, regardless of order.
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "h", true },
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "g", true },
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "f", true } } },
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "\"http://e.com\", \"http://f.com\", \"http://g.com\","
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "\"http://h.com\"],[],[],"
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\"],"
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "h.com", false },
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "g.com", false },
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "f.com", false } } },
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that incorrectly sized suggestion relevance lists are ignored.
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that keyword suggestions by default (not in suggested relevance
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mode) score more highly than the default verbatim.
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a2", true },
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In this case, ignored the suggested relevance scores means we keep
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // only one navsuggest result.
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[1]}]",
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1.com", false },
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\"],[],[],"
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "\"google:suggestrelevance\":[9999, 1]}]",
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1.com", false },
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that all 'verbatim' results are merged with their maximum score.
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a2", true },
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a", true },
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999],"
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a2", true },
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a", true },
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "a1", true },
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatim is always generated without other suggestions.
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mpearson): Ensure the value of verbatimrelevance is respected
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // (except when suggested relevances are ignored).
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { { "a", true },
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { "k a", false },
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false },
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { kNotApplicable, false } } },
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that navsuggestions will be demoted below queries.
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // (Navsuggestions are not allowed to appear first.)  In the process,
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // make sure the navsuggestions still remain in the same order.
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // First, check the situation where navsuggest scores more than verbatim
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // and there are no query suggestions.
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999]}]",
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998]}]",
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when navsuggest scores more than verbatim and there is query
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // suggestion but it scores lower.
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 1300]}]",
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a3", true },
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 1300]}]",
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a3", true },
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when navsuggest scores more than a query suggestion.  There is
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // a verbatim but it scores lower.
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a", true },
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a", true },
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when there is neither verbatim nor a query suggestion that,
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // because we can demote navsuggestions below a query suggestion,
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // we abandon suggested relevance scores entirely.  One consequence is
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // that this means we restore the keyword verbatim match.  Note
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // that in this case of abandoning suggested relevance scores, we still
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // keep the navsuggestions in order by their original scores (just
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // not at their original scores), and continue to allow multiple
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // navsuggestions to appear.
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999]}]",
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998]}]",
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a", true },
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false },
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false } } },
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // More checks that everything works when it's not necessary to demote.
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9997, 9998, 9999]}]",
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a", true },
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "a3", true },
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a1.com", false },
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a2.com", false },
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "a", true },
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "k a", false } } },
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16("k a"), false, true);
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up a default fetcher with no results.
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::TestURLFetcher* default_fetcher = WaitUntilURLFetcherIsReady(
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID);
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(default_fetcher);
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher->set_response_code(200);
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher = NULL;
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up a keyword fetcher with provided results.
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::TestURLFetcher* keyword_fetcher = WaitUntilURLFetcherIsReady(
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SearchProvider::kKeywordProviderURLFetcherID);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(keyword_fetcher);
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->set_response_code(200);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->SetResponseString(cases[i].json);
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher = NULL;
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunTillProviderDone();
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string description = "for input with json=" + cases[i].json;
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ACMatches& matches = provider_->matches();
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(string16::npos, matches[0].inline_autocomplete_offset) <<
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        description;
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300) << description;
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t j = 0;
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that the returned matches equal the expectations.
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; j < matches.size(); ++j) {
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].contents) << description;
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].from_keyword,
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].keyword == ASCIIToUTF16("k")) << description;
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that no expected matches are missing.
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) <<
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "Case # " << i << " " << description;
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies suggest relevance behavior for URL input.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, DefaultProviderSuggestRelevanceScoringUrlInput) {
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string input;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string json;
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string match_contents[4];
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AutocompleteMatch::Type match_types[4];
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure topmost NAVIGATION matches are allowed for URL input.
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"http://a.com/a\"],[],[],"
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"NAVIGATION\"],"
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9999]}]",
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com/a", "a.com", kNotApplicable, kNotApplicable },
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::NAVSUGGEST, AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES, AutocompleteMatch::NUM_TYPES } },
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure topmost SUGGEST matches are not allowed for URL input.
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SearchProvider disregards search and verbatim suggested relevances.
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com info\"],[],[],"
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggestrelevance\":[9999]}]",
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "a.com info", kNotApplicable, kNotApplicable },
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES, AutocompleteMatch::NUM_TYPES } },
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\"],[],[],"
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggestrelevance\":[9999]}]",
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "a.com/a", kNotApplicable, kNotApplicable },
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES, AutocompleteMatch::NUM_TYPES } },
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure the fallback mechanism allows inlinable NAVIGATION matches.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://a.com/b\"],[],[],"
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9999, 9998]}]",
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com/b", "a.com", "a.com/a", kNotApplicable },
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::NAVSUGGEST,
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES } },
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://a.com/b\"],[],[],"
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9998, 9997],"
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:verbatimrelevance\":9999}]",
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com/b", "a.com", "a.com/a", kNotApplicable },
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::NAVSUGGEST,
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES } },
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure the fallback mechanism disallows non-inlinable NAVIGATION matches.
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://abc.com\"],[],[],"
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"google:suggestrelevance\":[9999, 9998]}]",
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "abc.com", "a.com/a", kNotApplicable },
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NAVSUGGEST,
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES } },
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://abc.com\"],[],[],"
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9998, 9997],"
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:verbatimrelevance\":9999}]",
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { "a.com", "abc.com", "a.com/a", kNotApplicable },
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NAVSUGGEST,
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::SEARCH_SUGGEST,
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::NUM_TYPES } },
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input), false, false);
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::TestURLFetcher* fetcher = WaitUntilURLFetcherIsReady(
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(fetcher);
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(cases[i].json);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t j = 0;
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < matches.size(); ++j) {
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(ASCIIToUTF16(cases[i].match_contents[j]), matches[j].contents);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(cases[i].match_types[j], matches[j].type);
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that no expected matches are missing.
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].match_contents); ++j) {
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(kNotApplicable, cases[i].match_contents[j]);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(AutocompleteMatch::NUM_TYPES, cases[i].match_types[j]);
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A basic test that verifies the field trial triggered parsing logic.
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, FieldTrialTriggeredParsing) {
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("foo"), false, false);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the default providers suggest service was queried.
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(fetcher);
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->set_response_code(200);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->SetResponseString(
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "[\"foo\",[\"foo bar\"],[\"\"],[],"
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "{\"google:suggesttype\":[\"QUERY\"],"
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "\"google:fieldtrialtriggered\":true}]");
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher = NULL;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Run till the history results complete.
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTillProviderDone();
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check for the match and field trial triggered bits.
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutocompleteMatch match;
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("foo bar"), &match));
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProvidersInfo providers_info;
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->AddProviderInfo(&providers_info);
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1U, providers_info.size());
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_size());
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_in_session_size());
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Reset the session and check that bits are reset.
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->ResetSession();
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProvidersInfo providers_info;
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->AddProviderInfo(&providers_info);
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1U, providers_info.size());
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_size());
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, providers_info[0].field_trial_triggered_in_session_size());
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies inline autocompletion of navigational results.
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInline) {
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string input;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string url;
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test the expected fill_into_edit, which may drop "http://".
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some cases do not trim "http://" to match from the start of the scheme.
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string fill_into_edit;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t inline_offset;
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches that do not contain the input; trim http as needed.
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "x",                    "http://www.abc.com",
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com",  string16::npos },
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https:",               "http://www.abc.com",
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com",  string16::npos },
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com/",             "http://www.abc.com",
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com",  string16::npos },
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com/a", "http://www.abc.com",
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com",  string16::npos },
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com",   "https://www.abc.com",
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "https://www.abc.com", string16::npos },
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://abc.com",       "ftp://abc.com",
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://abc.com",       string16::npos },
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.abc.com",  "http://www.abc.com",
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com",  string16::npos },
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://abc.com",        "http://abc.com",
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "abc.com",      string16::npos },
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches with invalid input prefixes; trim http as needed.
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ttp",                  "http://www.abc.com",
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "://w",                 "http://www.abc.com",
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ww.",                  "http://www.abc.com",
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ".ab",                  "http://www.abc.com",
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "bc",                   "http://www.abc.com",
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ".com",                 "http://www.abc.com",
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches that omit input domain labels; trim http as needed.
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.a",                "http://a.com",
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "a.com",       string16::npos },
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.a",         "http://a.com",
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://a.com",       string16::npos },
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.a",                "ftp://a.com",
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://a.com",        string16::npos },
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.a",          "ftp://a.com",
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://a.com",        string16::npos },
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Input matching but with nothing to inline will not yield an offset.
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com",              "http://www.abc.com",
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", string16::npos },
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com",   "http://www.abc.com",
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", string16::npos },
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches when the input is a leading substring of the scheme.
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "h",                    "http://www.abc.com",
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 1 },
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http",                 "http://www.abc.com",
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 4 },
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches when the input is a leading substring of the full URL.
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http:",                "http://www.abc.com",
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 5 },
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://w",             "http://www.abc.com",
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 8 },
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.",          "http://www.abc.com",
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 11 },
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.ab",        "http://www.abc.com",
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com", 13 },
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com/p", "http://www.abc.com/path/file.htm?q=x#foo",
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://www.abc.com/path/file.htm?q=x#foo", 20 },
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://abc.com/p",     "http://abc.com/path/file.htm?q=x#foo",
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "http://abc.com/path/file.htm?q=x#foo",     16 },
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches with valid URLPrefixes; only trim "http://".
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "w",                    "http://www.abc.com",
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", 1 },
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.a",                "http://www.abc.com",
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", 5 },
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc",                  "http://www.abc.com",
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", 7 },
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.c",                "http://www.abc.com",
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com", 9 },
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com/p",            "http://www.abc.com/path/file.htm?q=x#foo",
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.abc.com/path/file.htm?q=x#foo", 13 },
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com/p",            "http://abc.com/path/file.htm?q=x#foo",
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "abc.com/path/file.htm?q=x#foo",     9 },
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches using the maximal URLPrefix components.
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "h",                    "http://help.com",
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "help.com",     1 },
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http",                 "http://http.com",
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "http.com",     4 },
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "h",                    "http://www.help.com",
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.help.com", 5 },
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http",                 "http://www.http.com",
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.http.com", 8 },
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "w",                    "http://www.www.com",
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "www.www.com",  5 },
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test similar behavior for the ftp and https schemes.
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.ab",         "ftp://www.abc.com/path/file.htm?q=x#foo",
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://www.abc.com/path/file.htm?q=x#foo",   12 },
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.ab",               "ftp://www.abc.com/path/file.htm?q=x#foo",
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://www.abc.com/path/file.htm?q=x#foo",   12 },
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ab",                   "ftp://www.abc.com/path/file.htm?q=x#foo",
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://www.abc.com/path/file.htm?q=x#foo",   12 },
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ab",                   "ftp://abc.com/path/file.htm?q=x#foo",
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "ftp://abc.com/path/file.htm?q=x#foo",       8 },
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.ab",       "https://www.abc.com/path/file.htm?q=x#foo",
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "https://www.abc.com/path/file.htm?q=x#foo", 14 },
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.ab",               "https://www.abc.com/path/file.htm?q=x#foo",
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "https://www.abc.com/path/file.htm?q=x#foo", 14 },
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ab",                   "https://www.abc.com/path/file.htm?q=x#foo",
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "https://www.abc.com/path/file.htm?q=x#foo", 14 },
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ab",                   "https://abc.com/path/file.htm?q=x#foo",
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "https://abc.com/path/file.htm?q=x#foo",     10 },
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Forced query input should inline and retain the "?" prefix.
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "?http://www.ab",       "http://www.abc.com",
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "?http://www.abc.com", 14 },
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "?www.ab",              "http://www.abc.com",
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "?www.abc.com", 7 },
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "?ab",                  "http://www.abc.com",
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "?www.abc.com", 7 },
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input), false, false);
1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SearchProvider::NavigationResult result(
1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        *provider_, GURL(cases[i].url), string16(), false, 0);
1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutocompleteMatch match(provider_->NavigationToMatch(result));
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(cases[i].inline_offset, match.inline_autocomplete_offset);
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit), match.fill_into_edit);
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that "http://" is not trimmed for input that is a leading substring.
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInlineSchemeSubstring) {
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 input(ASCIIToUTF16("ht"));
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 url(ASCIIToUTF16("http://a.com"));
1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const SearchProvider::NavigationResult result(
1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *provider_, GURL(url), string16(), false, 0);
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the offset and strings when inline autocompletion is allowed.
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(input, false, false);
1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, match_inline.inline_autocomplete_offset);
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_inline.fill_into_edit);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_inline.contents);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the same offset and strings when inline autocompletion is prevented.
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(input, true, false);
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch match_prevent(provider_->NavigationToMatch(result));
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(string16::npos, match_prevent.inline_autocomplete_offset);
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_prevent.fill_into_edit);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_prevent.contents);
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that input "w" marks a more significant domain label than "www.".
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInlineDomainClassify) {
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("w"), false, false);
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://www.wow.com");
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const SearchProvider::NavigationResult result(
1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *provider_, url, string16(), false, 0);
1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch match(provider_->NavigationToMatch(result));
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, match.inline_autocomplete_offset);
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.fill_into_edit);
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.contents);
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that the match for input "w" is marked on "wow" and not "www".
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, match.contents_class.size());
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, match.contents_class[0].offset);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL,
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[0].style);
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, match.contents_class[1].offset);
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL |
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AutocompleteMatch::ACMatchClassification::MATCH,
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[1].style);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, match.contents_class[2].offset);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL,
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[2].style);
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SearchProviderTest, RemoveStaleResultsTest) {
1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(mpearson): Consider expanding this test to explicit cover
1981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // testing staleness for keyword results.
1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct {
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string omnibox_input;
1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int verbatim_relevance;
1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // These cached suggestions should already be sorted.
1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The particular number 5 as the length of the array is
1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // unimportant; it's merely enough cached results to fully test
1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the functioning of RemoveAllStaleResults().
1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    struct {
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string suggestion;
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const bool is_navigation_result;
1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const int relevance;
1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // |expect_match| is true if this result should survive
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // RemoveAllStaleResults() filtering against |omnibox_input| below.
1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const bool expect_match;
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } results[5];
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } cases[] = {
1998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Simple case: multiple query suggestions and no navsuggestions.
1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // All query suggestions score less than search-what-you-typed and
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // thus none should be filtered because none will appear first.
2001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1300,
2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "food", false, 1299, true },
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, true },
2004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "crazy", false, 1297, true },
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false, 0, false } } },
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Similarly simple cases, but the query suggestion appears first.
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 1200,
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "food", false, 1299, true },
2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, true },
2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "crazy", false, 1297, true },
2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false, 0, false } } },
2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 1200,
2016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "food", false, 1299, false },
2017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "crazy", false, 1297, true },
2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false, 0, false } } },
2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1200,
2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "food", false, 1299, false },
2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "crazy", false, 1297, false },
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, false },
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { kNotApplicable, false, 0, false } } },
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The same sort of cases, just using a mix of queries and navsuggestions.
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1300,
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, true },
2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, true },
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, true },
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, true } } },
2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 1200,
2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, true },
2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, true },
2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, true },
2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, true } } },
2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 1200,
2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, false },
2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, true },
2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, true } } },
2047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1200,
2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, false },
2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, false },
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, false },
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, false } } },
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Run the three tests immediately above again, just with verbatim
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // suppressed.  Note that in the last case, all results are filtered.
2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Because verbatim is also suppressed, SearchProvider will realize
2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // in UpdateMatches() that it needs to restore verbatim to fulfill
2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // its constraints.  This restoration does not happen in
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // RemoveAllStaleResults() and hence is not tested here.  This restoration
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // is tested in the DefaultFetcherSuggestRelevance test.
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 0,
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, true },
2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, true },
2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, true },
2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, true } } },
2067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 0,
2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, false },
2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, true },
2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, true },
2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, true } } },
2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 0,
2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      { { "http://food.com/", true, 1299, false },
2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "foobar", false, 1298, false },
2076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://crazy.com/", true, 1297, false },
2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "friend", false, 1296, false },
2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        { "http://friend.com/", true, 1295, false } } },
2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Initialize cached results for this test case.
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->default_verbatim_relevance_ = cases[i].verbatim_relevance;
2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->default_navigation_results_.clear();
2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->default_suggest_results_.clear();
2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases[i].results); ++j) {
2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& suggestion = cases[i].results[j].suggestion;
2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (suggestion == kNotApplicable)
2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cases[i].results[j].is_navigation_result) {
2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_navigation_results_.push_back(
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            SearchProvider::NavigationResult(
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                *provider_, GURL(suggestion), string16(),
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false, cases[i].results[j].relevance));
2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_suggest_results_.push_back(
2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            SearchProvider::SuggestResult(ASCIIToUTF16(suggestion), false,
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          cases[i].results[j].relevance));
2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->input_ = AutocompleteInput(
2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASCIIToUTF16(cases[i].omnibox_input), string16::npos, string16(),
2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GURL(), false, false, true, AutocompleteInput::ALL_MATCHES);
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->RemoveAllStaleResults();
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check cached results.
2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SearchProvider::SuggestResults::const_iterator sug_it =
2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_suggest_results_.begin();
2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SearchProvider::SuggestResults::const_iterator sug_end =
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_suggest_results_.end();
2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SearchProvider::NavigationResults::const_iterator nav_it =
2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_navigation_results_.begin();
2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SearchProvider::NavigationResults::const_iterator nav_end =
2115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        provider_->default_navigation_results_.end();
2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases[i].results); ++j) {
2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& suggestion = cases[i].results[j].suggestion;
2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (suggestion == kNotApplicable)
2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        continue;
2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!cases[i].results[j].expect_match)
2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        continue;
2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cases[i].results[j].is_navigation_result) {
2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_NE(nav_end, nav_it) << "Failed to find " << suggestion;
2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(suggestion, nav_it->url().spec());
2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ++nav_it;
2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_NE(sug_end, sug_it) << "Failed to find " << suggestion;
2128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(ASCIIToUTF16(suggestion), sug_it->suggestion());
2129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ++sug_it;
2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(sug_end, sug_it);
2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(nav_end, nav_it);
2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2136