shortcuts_provider_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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/shortcuts_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider_listener.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/shortcuts_backend.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/shortcuts_backend_factory.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/url_database.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::ShortcutsBackend;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestShortcutInfo {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string guid;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title;  // The text that orginally was searched for.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents_class;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string description;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string description_class;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int typed_count;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int days_from_now;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} shortcut_test_db[] = {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E0",
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.google.com/", "goog",
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Google", "0,1,4,0", "Google", "0,3,4,1", 100, 1 },
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E1",
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://slashdot.org/", "slash",
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "slashdot.org", "0,3,5,1",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Slashdot - News for nerds, stuff that matters", "0,2,5,0", 100, 0},
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E2",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://slashdot.org/", "news",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "slashdot.org", "0,1",
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Slashdot - News for nerds, stuff that matters", "0,0,11,2,15,0", 5, 0},
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E3",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://sports.yahoo.com/", "news",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sports.yahoo.com", "0,1",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "0,0,23,2,27,0", 5, 2},
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E4",
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.cnn.com/index.html", "news weather",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.cnn.com/index.html", "0,1",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "CNN.com - Breaking News, U.S., World, Weather, Entertainment & Video",
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "0,0,19,2,23,0,38,2,45,0", 10, 1},
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E5",
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://sports.yahoo.com/", "nhl scores",
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "sports.yahoo.com", "0,1",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "0,0,29,2,35,0", 10, 1},
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E6",
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.nhl.com/scores/index.html", "nhl scores",
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.nhl.com/scores/index.html", "0,1,4,3,7,1",
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "January 13, 2010 - NHL.com - Scores", "0,0,19,2,22,0,29,2,35,0", 1, 5},
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E7",
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/a.html", "just",
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/a.html", "0,1",
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 1, 5},
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E8",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/b.html", "just",
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/b.html", "0,1",
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 2, 5},
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E9",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/c.html", "just",
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/c.html", "0,1",
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 1, 8},
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EA",
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/d.html", "just a",
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/d.html", "0,1",
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 1, 12},
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EB",
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/e.html", "just a t",
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/e.html", "0,1",
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 1, 12},
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EC",
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.testsite.com/f.html", "just a te",
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.testsite.com/f.html", "0,1",
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site - just a test", "0,0,14,2,18,0", 1, 12},
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880ED",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.daysagotest.com/a.html", "ago",
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.daysagotest.com/a.html", "0,1,8,3,11,1",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site", "0,0", 1, 1},
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EE",
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.daysagotest.com/b.html", "ago",
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.daysagotest.com/b.html", "0,1,8,3,11,1",
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site", "0,0", 1, 2},
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EF",
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.daysagotest.com/c.html", "ago",
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.daysagotest.com/c.html", "0,1,8,3,11,1",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site", "0,0", 1, 3},
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F0",
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.daysagotest.com/d.html", "ago",
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "www.daysagotest.com/d.html", "0,1,8,3,11,1",
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Test - site", "0,0", 1, 4},
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShortcutsProviderTest : public testing::Test,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              public AutocompleteProviderListener {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShortcutsProviderTest();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutocompleteProviderListener:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProviderUpdate(bool updated_matches) OVERRIDE;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SetShouldContain
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : public std::unary_function<const std::string&, std::set<std::string> > {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SetShouldContain(const ACMatches& matched_urls);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void operator()(const std::string& expected);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> Leftovers() const { return matches_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<std::string> matches_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills test data into the provider.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillData(TestShortcutInfo* db, size_t db_size);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs an autocomplete query on |text| and checks to see that the returned
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results' destination URLs match those provided. |expected_urls| does not
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to be in sorted order.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(const string16 text,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               std::vector<std::string> expected_urls,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               std::string expected_top_result);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForUI message_loop_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatches ac_matches_;  // The resulting matches after running RunTest.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ShortcutsBackend> backend_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ShortcutsProvider> provider_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShortcutsProviderTest::ShortcutsProviderTest()
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ui_thread_(BrowserThread::UI, &message_loop_),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_thread_(BrowserThread::FILE, &message_loop_) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::OnProviderUpdate(bool updated_matches) {}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::SetUp() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShortcutsBackendFactory::GetInstance()->SetTestingFactoryAndUse(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &ShortcutsBackendFactory::BuildProfileNoDatabaseForTesting);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  backend_ = ShortcutsBackendFactory::GetForProfile(&profile_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(backend_.get());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.CreateHistoryService(true, false);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = new ShortcutsProvider(this, &profile_);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillData(shortcut_test_db, arraysize(shortcut_test_db));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::TearDown() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run all pending tasks or else some threads hold on to the message loop
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and prevent it from being deleted.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop_.RunUntilIdle();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = NULL;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::FillData(TestShortcutInfo* db, size_t db_size) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(provider_.get());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t expected_size = backend_->shortcuts_map().size() + db_size;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < db_size; ++i) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestShortcutInfo& cur = db[i];
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShortcutsBackend::Shortcut shortcut(cur.guid,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16(cur.title), GURL(cur.url), ASCIIToUTF16(cur.contents),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::ClassificationsFromString(cur.contents_class),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16(cur.description),
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutocompleteMatch::ClassificationsFromString(cur.description_class),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Time::Now() - base::TimeDelta::FromDays(cur.days_from_now),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur.typed_count);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backend_->AddShortcut(shortcut);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_size, backend_->shortcuts_map().size());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShortcutsProviderTest::SetShouldContain::SetShouldContain(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matched_urls) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator iter = matched_urls.begin();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != matched_urls.end(); ++iter)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches_.insert(iter->destination_url.spec());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::SetShouldContain::operator()(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, matches_.erase(expected));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsProviderTest::RunTest(const string16 text,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::vector<std::string> expected_urls,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::string expected_top_result) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(expected_urls.begin(), expected_urls.end());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MessageLoop::current()->RunUntilIdle();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteInput input(text, string16::npos, string16(), GURL(), false,
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          false, true, AutocompleteInput::ALL_MATCHES);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->Start(input, false);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(provider_->done());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ac_matches_ = provider_->matches();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have gotten back at most AutocompleteProvider::kMaxMatches.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(ac_matches_.size(), AutocompleteProvider::kMaxMatches);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the number of expected and actual matches aren't equal then we need
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test no further, but let's do anyway so that we know which URLs failed.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_urls.size(), ac_matches_.size());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that all expected URLs were found and that all found URLs
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // were expected.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> Leftovers =
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for_each(expected_urls.begin(), expected_urls.end(),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SetShouldContain(ac_matches_)).Leftovers();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, Leftovers.size());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if we got the expected top scorer.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ac_matches_.empty()) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::partial_sort(ac_matches_.begin(), ac_matches_.begin() + 1,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ac_matches_.end(), AutocompleteMatch::MoreRelevant);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_top_result, ac_matches_[0].destination_url.spec());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, SimpleSingleMatch) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text(ASCIIToUTF16("go"));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_url("http://www.google.com/");
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back(expected_url);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(text, expected_urls, expected_url);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, MultiMatch) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text(ASCIIToUTF16("NEWS"));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of completion length.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://slashdot.org/");
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of visit count.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://sports.yahoo.com/");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scores high because of visit count but less match span,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which is more important.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.cnn.com/index.html");
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(text, expected_urls, "http://slashdot.org/");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, TypedCountMatches) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text(ASCIIToUTF16("just"));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/b.html");
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/a.html");
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/c.html");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(text, expected_urls, "http://www.testsite.com/b.html");
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, FragmentLengthMatches) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text(ASCIIToUTF16("just a"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/d.html");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/e.html");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.testsite.com/f.html");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(text, expected_urls, "http://www.testsite.com/d.html");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, DaysAgoMatches) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 text(ASCIIToUTF16("ago"));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> expected_urls;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.daysagotest.com/a.html");
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.daysagotest.com/b.html");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_urls.push_back("http://www.daysagotest.com/c.html");
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(text, expected_urls, "http://www.daysagotest.com/a.html");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class to make running tests of ClassifyAllMatchesInString() more
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// convenient.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClassifyTest {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest(const string16& text, ACMatchClassifications matches);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ClassifyTest();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications RunTest(const string16& find_text);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 text_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ACMatchClassifications matches_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClassifyTest::ClassifyTest(const string16& text, ACMatchClassifications matches)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : text_(text),
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      matches_(matches) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClassifyTest::~ClassifyTest() {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACMatchClassifications ClassifyTest::RunTest(const string16& find_text) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ShortcutsProvider::ClassifyAllMatchesInString(find_text,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CreateWordMapForString(find_text), text_, matches_);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, ClassifyAllMatchesInString) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications matches;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(0, ACMatchClassification::NONE));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test(ASCIIToUTF16("A man, a plan, a canal Panama"),
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             matches);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_a = classify_test.RunTest(ASCIIToUTF16("man"));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: '--MMM------------------------'
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, spans_a.size());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_a[0].offset);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[0].style);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_a[1].offset);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_a[1].style);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_a[2].offset);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_a[2].style);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_b = classify_test.RunTest(ASCIIToUTF16("man p"));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be: '--MMM----M-------------M-----'
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7U, spans_b.size());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_b[0].offset);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_b[0].style);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_b[1].offset);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_b[1].style);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_b[2].offset);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_b[2].style);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_b[3].offset);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_b[3].style);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10U, spans_b[4].offset);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_b[4].style);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(23U, spans_b[5].offset);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_b[5].style);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(24U, spans_b[6].offset);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_b[6].style);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_c =
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test.RunTest(ASCIIToUTF16("man plan panama"));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be:'--MMM----MMMM----------MMMMMM'
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, spans_c.size());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_c[0].offset);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_c[0].style);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_c[1].offset);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_c[1].style);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_c[2].offset);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_c[2].style);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_c[3].offset);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_c[3].style);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(13U, spans_c[4].offset);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_c[4].style);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(23U, spans_c[5].offset);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_c[5].style);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test2(ASCIIToUTF16("Yahoo! Sports - Sports News, "
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Scores, Rumors, Fantasy Games, and more"), matches);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_d = classify_test2.RunTest(ASCIIToUTF16("ne"));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should match first two letters of the "news".
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, spans_d.size());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_d[0].offset);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_d[0].style);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(23U, spans_d[1].offset);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_d[1].style);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(25U, spans_d[2].offset);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_d[2].style);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_e =
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test2.RunTest(ASCIIToUTF16("news r"));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should be the same as original matches.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(15U, spans_e.size());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_e[0].offset);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[0].style);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "r" in "Sports".
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10U, spans_e[1].offset);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[1].style);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11U, spans_e[2].offset);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[2].style);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "r" in second "Sports".
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(19U, spans_e[3].offset);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[3].style);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20U, spans_e[4].offset);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[4].style);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "News".
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(23U, spans_e[5].offset);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[5].style);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(27U, spans_e[6].offset);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[6].style);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "r" in "Scores".
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(32U, spans_e[7].offset);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[7].style);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(33U, spans_e[8].offset);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[8].style);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First "r" in "Rumors".
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(37U, spans_e[9].offset);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[9].style);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(38U, spans_e[10].offset);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[10].style);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second "r" in "Rumors".
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(41U, spans_e[11].offset);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[11].style);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(42U, spans_e[12].offset);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[12].style);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "r" in "more".
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(66U, spans_e[13].offset);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_e[13].style);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(67U, spans_e[14].offset);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_e[14].style);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.clear();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(0, ACMatchClassification::URL));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test3(ASCIIToUTF16("livescore.goal.com"), matches);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_f = classify_test3.RunTest(ASCIIToUTF16("go"));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACMatch spans should match first two letters of the "goal".
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, spans_f.size());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_f[0].offset);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_f[0].style);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10U, spans_f[1].offset);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL | ACMatchClassification::MATCH,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_f[1].style);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(12U, spans_f[2].offset);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_f[2].style);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.clear();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(0, ACMatchClassification::NONE));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(13, ACMatchClassification::URL));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test4(ASCIIToUTF16("Email login: mail.somecorp.com"),
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              matches);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_g = classify_test4.RunTest(ASCIIToUTF16("ail"));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, spans_g.size());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_g[0].offset);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_g[0].style);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_g[1].offset);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_g[1].style);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_g[2].offset);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_g[2].style);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(13U, spans_g[3].offset);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_g[3].style);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(14U, spans_g[4].offset);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL | ACMatchClassification::MATCH,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_g[4].style);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(17U, spans_g[5].offset);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_g[5].style);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_h =
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test4.RunTest(ASCIIToUTF16("lo log"));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, spans_h.size());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_h[0].offset);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_h[0].style);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6U, spans_h[1].offset);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_h[1].style);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_h[2].offset);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_h[2].style);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(13U, spans_h[3].offset);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_h[3].style);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_i =
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test4.RunTest(ASCIIToUTF16("ail em"));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'Email' and 'ail' should be matched.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5U, spans_i.size());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_i[0].offset);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::MATCH, spans_i[0].style);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_i[1].offset);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_i[1].style);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(13U, spans_i[2].offset);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_i[2].style);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(14U, spans_i[3].offset);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL | ACMatchClassification::MATCH,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_i[3].style);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(17U, spans_i[4].offset);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_i[4].style);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some web sites do not have a description.  If the string being searched is
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // empty, the classifications must also be empty: http://crbug.com/148647
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extra parens in the next line hack around C++03's "most vexing parse".
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ClassifyTest classify_test5((string16()), ACMatchClassifications());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_j = classify_test5.RunTest(ASCIIToUTF16("man"));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, spans_j.size());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Matches which end at beginning of classification merge properly.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.clear();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(0, ACMatchClassification::DIM));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(9, ACMatchClassification::NONE));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test6(ASCIIToUTF16("html password example"), matches);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extra space in the next string avoids having the string be a prefix of the
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // text above, which would allow for two different valid classification sets,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one of which uses two spans (the first of which would mark all of "html
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pass" as a match) and one which uses four (which marks the individual words
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as matches but not the space between them).  This way only the latter is
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // valid.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_k =
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test6.RunTest(ASCIIToUTF16("html  pass"));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, spans_k.size());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_k[0].offset);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::DIM | ACMatchClassification::MATCH,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_k[0].style);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, spans_k[1].offset);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::DIM, spans_k[1].style);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, spans_k[2].offset);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::DIM | ACMatchClassification::MATCH,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_k[2].style);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_k[3].offset);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_k[3].style);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multiple matches with both beginning and end at beginning of
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // classifications merge properly.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.clear();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(0, ACMatchClassification::URL));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.push_back(ACMatchClassification(11, ACMatchClassification::NONE));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClassifyTest classify_test7(ASCIIToUTF16("http://a.co is great"), matches);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_l =
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classify_test7.RunTest(ASCIIToUTF16("ht co"));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, spans_l.size());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, spans_l[0].offset);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL | ACMatchClassification::MATCH,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_l[0].style);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, spans_l[1].offset);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL, spans_l[1].style);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, spans_l[2].offset);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::URL | ACMatchClassification::MATCH,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            spans_l[2].style);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11U, spans_l[3].offset);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ACMatchClassification::NONE, spans_l[3].style);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, CalculateScore) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_content;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spans_content.push_back(ACMatchClassification(0, ACMatchClassification::URL));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spans_content.push_back(ACMatchClassification(
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      4, ACMatchClassification::MATCH | ACMatchClassification::URL));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spans_content.push_back(ACMatchClassification(8, ACMatchClassification::URL));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatchClassifications spans_description;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spans_description.push_back(
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ACMatchClassification(0, ACMatchClassification::NONE));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spans_description.push_back(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ACMatchClassification(2, ACMatchClassification::MATCH));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShortcutsBackend::Shortcut shortcut(std::string(),
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("test"), GURL("http://www.test.com"),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("www.test.com"), spans_content, ASCIIToUTF16("A test"),
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      spans_description, base::Time::Now(), 1);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maximal score.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kMaxScore = ShortcutsProvider::CalculateScore(
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("test"), shortcut);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Score decreases as percent of the match is decreased.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_three_quarters =
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("tes"), shortcut);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_three_quarters, kMaxScore);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_one_half =
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("te"), shortcut);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_one_half, score_three_quarters);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_one_quarter =
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("t"), shortcut);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_one_quarter, score_one_half);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should decay with time - one week.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(7);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_week_old =
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_week_old, kMaxScore);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should decay more in two weeks.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_two_weeks_old =
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_two_weeks_old, score_week_old);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But not if it was activly clicked on. 2 hits slow decaying power.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.number_of_hits = 2;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_popular_two_weeks_old =
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_two_weeks_old, score_popular_two_weeks_old);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But still decayed.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_popular_two_weeks_old, kMaxScore);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3 hits slow decaying power even more.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.number_of_hits = 3;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int score_more_popular_two_weeks_old =
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_two_weeks_old, score_more_popular_two_weeks_old);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_popular_two_weeks_old, score_more_popular_two_weeks_old);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But still decayed.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(score_more_popular_two_weeks_old, kMaxScore);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsProviderTest, DeleteMatch) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestShortcutInfo shortcuts_to_test_delete[3] = {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "BD85DBA2-8C29-49F9-84AE-48E1E90880F1",
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/1.html", "delete",
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/1.html", "0,2",
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Erase this shortcut!", "0,0", 1, 1},
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "BD85DBA2-8C29-49F9-84AE-48E1E90880F2",
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/1.html", "erase",
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/1.html", "0,2",
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Erase this shortcut!", "0,0", 1, 1},
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "BD85DBA2-8C29-49F9-84AE-48E1E90880F3",
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/2.html", "delete",
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.deletetest.com/2.html", "0,2",
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Erase this shortcut!", "0,0", 1, 1},
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t original_shortcuts_count = backend_->shortcuts_map().size();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillData(shortcuts_to_test_delete, arraysize(shortcuts_to_test_delete));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_shortcuts_count + 3, backend_->shortcuts_map().size());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(backend_->shortcuts_map().end() ==
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               backend_->shortcuts_map().find(ASCIIToUTF16("delete")));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(backend_->shortcuts_map().end() ==
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               backend_->shortcuts_map().find(ASCIIToUTF16("erase")));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch match(provider_, 1200, true,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          AutocompleteMatch::HISTORY_TITLE);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.destination_url = GURL(shortcuts_to_test_delete[0].url);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.contents = ASCIIToUTF16(shortcuts_to_test_delete[0].contents);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.description = ASCIIToUTF16(shortcuts_to_test_delete[0].description);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->DeleteMatch(match);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |shortcuts_to_test_delete[0]| and |shortcuts_to_test_delete[1]| should be
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleted, but not |shortcuts_to_test_delete[2]| as it has different url.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_shortcuts_count + 1, backend_->shortcuts_map().size());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(backend_->shortcuts_map().end() ==
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               backend_->shortcuts_map().find(ASCIIToUTF16("delete")));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend_->shortcuts_map().end() ==
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              backend_->shortcuts_map().find(ASCIIToUTF16("erase")));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.destination_url = GURL(shortcuts_to_test_delete[2].url);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.contents = ASCIIToUTF16(shortcuts_to_test_delete[2].contents);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  match.description = ASCIIToUTF16(shortcuts_to_test_delete[2].description);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->DeleteMatch(match);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_shortcuts_count, backend_->shortcuts_map().size());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(backend_->shortcuts_map().end() ==
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              backend_->shortcuts_map().find(ASCIIToUTF16("delete")));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
674