Index: components/bookmarks/core/browser/bookmark_index_unittest.cc |
diff --git a/components/bookmarks/core/browser/bookmark_index_unittest.cc b/components/bookmarks/core/browser/bookmark_index_unittest.cc |
deleted file mode 100644 |
index b4094d0ba993b42eb611cc491af72934174cb013..0000000000000000000000000000000000000000 |
--- a/components/bookmarks/core/browser/bookmark_index_unittest.cc |
+++ /dev/null |
@@ -1,463 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/bookmarks/core/browser/bookmark_index.h" |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/macros.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "components/bookmarks/core/browser/bookmark_match.h" |
-#include "components/bookmarks/core/browser/bookmark_model.h" |
-#include "components/bookmarks/core/test/bookmark_test_helpers.h" |
-#include "components/bookmarks/core/test/test_bookmark_client.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::ASCIIToUTF16; |
-using base::UTF8ToUTF16; |
- |
-namespace { |
- |
-const char kAboutBlankURL[] = "about:blank"; |
- |
-class BookmarkClientMock : public test::TestBookmarkClient { |
- public: |
- BookmarkClientMock(const std::map<GURL, int>& typed_count_map) |
- : typed_count_map_(typed_count_map) {} |
- |
- virtual bool SupportsTypedCountForNodes() OVERRIDE { return true; } |
- |
- virtual void GetTypedCountForNodes( |
- const NodeSet& nodes, |
- NodeTypedCountPairs* node_typed_count_pairs) OVERRIDE { |
- for (NodeSet::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { |
- const BookmarkNode* node = *it; |
- std::map<GURL, int>::const_iterator found = |
- typed_count_map_.find(node->url()); |
- if (found == typed_count_map_.end()) |
- continue; |
- |
- node_typed_count_pairs->push_back(std::make_pair(node, found->second)); |
- } |
- } |
- |
- private: |
- const std::map<GURL, int> typed_count_map_; |
- |
- DISALLOW_COPY_AND_ASSIGN(BookmarkClientMock); |
-}; |
- |
-class BookmarkIndexTest : public testing::Test { |
- public: |
- BookmarkIndexTest() : model_(client_.CreateModel(false)) {} |
- |
- typedef std::pair<std::string, std::string> TitleAndURL; |
- |
- void AddBookmarks(const char** titles, const char** urls, size_t count) { |
- // The pair is (title, url). |
- std::vector<TitleAndURL> bookmarks; |
- for (size_t i = 0; i < count; ++i) { |
- TitleAndURL bookmark(titles[i], urls[i]); |
- bookmarks.push_back(bookmark); |
- } |
- AddBookmarks(bookmarks); |
- } |
- |
- void AddBookmarks(const std::vector<TitleAndURL>& bookmarks) { |
- for (size_t i = 0; i < bookmarks.size(); ++i) { |
- model_->AddURL(model_->other_node(), static_cast<int>(i), |
- ASCIIToUTF16(bookmarks[i].first), |
- GURL(bookmarks[i].second)); |
- } |
- } |
- |
- void ExpectMatches(const std::string& query, |
- const char** expected_titles, |
- size_t expected_count) { |
- std::vector<std::string> title_vector; |
- for (size_t i = 0; i < expected_count; ++i) |
- title_vector.push_back(expected_titles[i]); |
- ExpectMatches(query, title_vector); |
- } |
- |
- void ExpectMatches(const std::string& query, |
- const std::vector<std::string>& expected_titles) { |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(ASCIIToUTF16(query), 1000, &matches); |
- ASSERT_EQ(expected_titles.size(), matches.size()); |
- for (size_t i = 0; i < expected_titles.size(); ++i) { |
- bool found = false; |
- for (size_t j = 0; j < matches.size(); ++j) { |
- if (ASCIIToUTF16(expected_titles[i]) == matches[j].node->GetTitle()) { |
- matches.erase(matches.begin() + j); |
- found = true; |
- break; |
- } |
- } |
- ASSERT_TRUE(found); |
- } |
- } |
- |
- void ExtractMatchPositions(const std::string& string, |
- BookmarkMatch::MatchPositions* matches) { |
- std::vector<std::string> match_strings; |
- base::SplitString(string, ':', &match_strings); |
- for (size_t i = 0; i < match_strings.size(); ++i) { |
- std::vector<std::string> chunks; |
- base::SplitString(match_strings[i], ',', &chunks); |
- ASSERT_EQ(2U, chunks.size()); |
- matches->push_back(BookmarkMatch::MatchPosition()); |
- int chunks0, chunks1; |
- EXPECT_TRUE(base::StringToInt(chunks[0], &chunks0)); |
- EXPECT_TRUE(base::StringToInt(chunks[1], &chunks1)); |
- matches->back().first = chunks0; |
- matches->back().second = chunks1; |
- } |
- } |
- |
- void ExpectMatchPositions( |
- const BookmarkMatch::MatchPositions& actual_positions, |
- const BookmarkMatch::MatchPositions& expected_positions) { |
- ASSERT_EQ(expected_positions.size(), actual_positions.size()); |
- for (size_t i = 0; i < expected_positions.size(); ++i) { |
- EXPECT_EQ(expected_positions[i].first, actual_positions[i].first); |
- EXPECT_EQ(expected_positions[i].second, actual_positions[i].second); |
- } |
- } |
- |
- protected: |
- test::TestBookmarkClient client_; |
- scoped_ptr<BookmarkModel> model_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(BookmarkIndexTest); |
-}; |
- |
-// Various permutations with differing input, queries and output that exercises |
-// all query paths. |
-TEST_F(BookmarkIndexTest, GetBookmarksMatching) { |
- struct TestData { |
- const std::string titles; |
- const std::string query; |
- const std::string expected; |
- } data[] = { |
- // Trivial test case of only one term, exact match. |
- { "a;b", "A", "a" }, |
- |
- // Prefix match, one term. |
- { "abcd;abc;b", "abc", "abcd;abc" }, |
- |
- // Prefix match, multiple terms. |
- { "abcd cdef;abcd;abcd cdefg", "abc cde", "abcd cdef;abcd cdefg"}, |
- |
- // Exact and prefix match. |
- { "ab cdef;abcd;abcd cdefg", "ab cdef", "ab cdef"}, |
- |
- // Exact and prefix match. |
- { "ab cdef ghij;ab;cde;cdef;ghi;cdef ab;ghij ab", |
- "ab cde ghi", |
- "ab cdef ghij"}, |
- |
- // Title with term multiple times. |
- { "ab ab", "ab", "ab ab"}, |
- |
- // Make sure quotes don't do a prefix match. |
- { "think", "\"thi\"", ""}, |
- |
- // Prefix matches against multiple candidates. |
- { "abc1 abc2 abc3 abc4", "abc", "abc1 abc2 abc3 abc4"}, |
- }; |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
- std::vector<std::string> titles; |
- base::SplitString(data[i].titles, ';', &titles); |
- std::vector<TitleAndURL> bookmarks; |
- for (size_t j = 0; j < titles.size(); ++j) { |
- TitleAndURL bookmark(titles[j], kAboutBlankURL); |
- bookmarks.push_back(bookmark); |
- } |
- AddBookmarks(bookmarks); |
- |
- std::vector<std::string> expected; |
- if (!data[i].expected.empty()) |
- base::SplitString(data[i].expected, ';', &expected); |
- |
- ExpectMatches(data[i].query, expected); |
- |
- model_ = client_.CreateModel(false); |
- } |
-} |
- |
-// Analogous to GetBookmarksMatching, this test tests various permutations |
-// of title, URL, and input to see if the title/URL matches the input as |
-// expected. |
-TEST_F(BookmarkIndexTest, GetBookmarksMatchingWithURLs) { |
- struct TestData { |
- const std::string query; |
- const std::string title; |
- const std::string url; |
- const bool should_be_retrieved; |
- } data[] = { |
- // Test single-word inputs. Include both exact matches and prefix matches. |
- { "foo", "Foo", "http://www.bar.com/", true }, |
- { "foo", "Foodie", "http://www.bar.com/", true }, |
- { "foo", "Bar", "http://www.foo.com/", true }, |
- { "foo", "Bar", "http://www.foodie.com/", true }, |
- { "foo", "Foo", "http://www.foo.com/", true }, |
- { "foo", "Bar", "http://www.bar.com/", false }, |
- { "foo", "Bar", "http://www.bar.com/blah/foo/blah-again/ ", true }, |
- { "foo", "Bar", "http://www.bar.com/blah/foodie/blah-again/ ", true }, |
- { "foo", "Bar", "http://www.bar.com/blah-foo/blah-again/ ", true }, |
- { "foo", "Bar", "http://www.bar.com/blah-foodie/blah-again/ ", true }, |
- { "foo", "Bar", "http://www.bar.com/blahafoo/blah-again/ ", false }, |
- |
- // Test multi-word inputs. |
- { "foo bar", "Foo Bar", "http://baz.com/", true }, |
- { "foo bar", "Foodie Bar", "http://baz.com/", true }, |
- { "bar foo", "Foo Bar", "http://baz.com/", true }, |
- { "bar foo", "Foodie Barly", "http://baz.com/", true }, |
- { "foo bar", "Foo Baz", "http://baz.com/", false }, |
- { "foo bar", "Foo Baz", "http://bar.com/", true }, |
- { "foo bar", "Foo Baz", "http://barly.com/", true }, |
- { "foo bar", "Foodie Baz", "http://barly.com/", true }, |
- { "bar foo", "Foo Baz", "http://bar.com/", true }, |
- { "bar foo", "Foo Baz", "http://barly.com/", true }, |
- { "foo bar", "Baz Bar", "http://blah.com/foo", true }, |
- { "foo bar", "Baz Barly", "http://blah.com/foodie", true }, |
- { "foo bar", "Baz Bur", "http://blah.com/foo/bar", true }, |
- { "foo bar", "Baz Bur", "http://blah.com/food/barly", true }, |
- { "foo bar", "Baz Bur", "http://bar.com/blah/foo", true }, |
- { "foo bar", "Baz Bur", "http://barly.com/blah/food", true }, |
- { "foo bar", "Baz Bur", "http://bar.com/blah/flub", false }, |
- { "foo bar", "Baz Bur", "http://foo.com/blah/flub", false } |
- }; |
- |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
- model_ = client_.CreateModel(true); |
- std::vector<TitleAndURL> bookmarks; |
- bookmarks.push_back(TitleAndURL(data[i].title, data[i].url)); |
- AddBookmarks(bookmarks); |
- |
- std::vector<std::string> expected; |
- if (data[i].should_be_retrieved) |
- expected.push_back(data[i].title); |
- |
- ExpectMatches(data[i].query, expected); |
- } |
-} |
- |
-TEST_F(BookmarkIndexTest, Normalization) { |
- struct TestData { |
- const char* const title; |
- const char* const query; |
- } data[] = { |
- { "fooa\xcc\x88-test", "foo\xc3\xa4-test" }, |
- { "fooa\xcc\x88-test", "fooa\xcc\x88-test" }, |
- { "fooa\xcc\x88-test", "foo\xc3\xa4" }, |
- { "fooa\xcc\x88-test", "fooa\xcc\x88" }, |
- { "fooa\xcc\x88-test", "foo" }, |
- { "foo\xc3\xa4-test", "foo\xc3\xa4-test" }, |
- { "foo\xc3\xa4-test", "fooa\xcc\x88-test" }, |
- { "foo\xc3\xa4-test", "foo\xc3\xa4" }, |
- { "foo\xc3\xa4-test", "fooa\xcc\x88" }, |
- { "foo\xc3\xa4-test", "foo" }, |
- { "foo", "foo" } |
- }; |
- |
- GURL url(kAboutBlankURL); |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
- model_->AddURL(model_->other_node(), 0, UTF8ToUTF16(data[i].title), url); |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(UTF8ToUTF16(data[i].query), 10, &matches); |
- EXPECT_EQ(1u, matches.size()); |
- model_ = client_.CreateModel(false); |
- } |
-} |
- |
-// Makes sure match positions are updated appropriately for title matches. |
-TEST_F(BookmarkIndexTest, MatchPositionsTitles) { |
- struct TestData { |
- const std::string title; |
- const std::string query; |
- const std::string expected_title_match_positions; |
- } data[] = { |
- // Trivial test case of only one term, exact match. |
- { "a", "A", "0,1" }, |
- { "foo bar", "bar", "4,7" }, |
- { "fooey bark", "bar foo", "0,3:6,9" }, |
- // Non-trivial tests. |
- { "foobar foo", "foobar foo", "0,6:7,10" }, |
- { "foobar foo", "foo foobar", "0,6:7,10" }, |
- { "foobar foobar", "foobar foo", "0,6:7,13" }, |
- { "foobar foobar", "foo foobar", "0,6:7,13" }, |
- }; |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
- std::vector<TitleAndURL> bookmarks; |
- TitleAndURL bookmark(data[i].title, kAboutBlankURL); |
- bookmarks.push_back(bookmark); |
- AddBookmarks(bookmarks); |
- |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(ASCIIToUTF16(data[i].query), 1000, &matches); |
- ASSERT_EQ(1U, matches.size()); |
- |
- BookmarkMatch::MatchPositions expected_title_matches; |
- ExtractMatchPositions(data[i].expected_title_match_positions, |
- &expected_title_matches); |
- ExpectMatchPositions(matches[0].title_match_positions, |
- expected_title_matches); |
- |
- model_ = client_.CreateModel(false); |
- } |
-} |
- |
-// Makes sure match positions are updated appropriately for URL matches. |
-TEST_F(BookmarkIndexTest, MatchPositionsURLs) { |
- // The encoded stuff between /wiki/ and the # is 第二次世界大戦 |
- const std::string ja_wiki_url = "http://ja.wikipedia.org/wiki/%E7%AC%AC%E4" |
- "%BA%8C%E6%AC%A1%E4%B8%96%E7%95%8C%E5%A4%A7%E6%88%A6#.E3.83.B4.E3.82.A7" |
- ".E3.83.AB.E3.82.B5.E3.82.A4.E3.83.A6.E4.BD.93.E5.88.B6"; |
- struct TestData { |
- const std::string query; |
- const std::string url; |
- const std::string expected_url_match_positions; |
- } data[] = { |
- { "foo", "http://www.foo.com/", "11,14" }, |
- { "foo", "http://www.foodie.com/", "11,14" }, |
- { "foo", "http://www.foofoo.com/", "11,14" }, |
- { "www", "http://www.foo.com/", "7,10" }, |
- { "foo", "http://www.foodie.com/blah/foo/fi", "11,14:27,30" }, |
- { "foo", "http://www.blah.com/blah/foo/fi", "25,28" }, |
- { "foo www", "http://www.foodie.com/blah/foo/fi", "7,10:11,14:27,30" }, |
- { "www foo", "http://www.foodie.com/blah/foo/fi", "7,10:11,14:27,30" }, |
- { "www bla", "http://www.foodie.com/blah/foo/fi", "7,10:22,25" }, |
- { "http", "http://www.foo.com/", "0,4" }, |
- { "http www", "http://www.foo.com/", "0,4:7,10" }, |
- { "http foo", "http://www.foo.com/", "0,4:11,14" }, |
- { "http foo", "http://www.bar.com/baz/foodie/hi", "0,4:23,26" }, |
- { "第二次", ja_wiki_url, "29,56" }, |
- { "ja 第二次", ja_wiki_url, "7,9:29,56" }, |
- { "第二次 E3.8", ja_wiki_url, "29,56:94,98:103,107:" |
- "112,116:121,125:" |
- "130,134:139,143" } |
- }; |
- |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { |
- model_ = client_.CreateModel(true); |
- std::vector<TitleAndURL> bookmarks; |
- TitleAndURL bookmark("123456", data[i].url); |
- bookmarks.push_back(bookmark); |
- AddBookmarks(bookmarks); |
- |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(UTF8ToUTF16(data[i].query), 1000, &matches); |
- ASSERT_EQ(1U, matches.size()) << data[i].url << data[i].query; |
- |
- BookmarkMatch::MatchPositions expected_url_matches; |
- ExtractMatchPositions(data[i].expected_url_match_positions, |
- &expected_url_matches); |
- ExpectMatchPositions(matches[0].url_match_positions, expected_url_matches); |
- } |
-} |
- |
-// Makes sure index is updated when a node is removed. |
-TEST_F(BookmarkIndexTest, Remove) { |
- const char* titles[] = { "a", "b" }; |
- const char* urls[] = { kAboutBlankURL, kAboutBlankURL }; |
- AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles)); |
- |
- // Remove the node and make sure we don't get back any results. |
- model_->Remove(model_->other_node(), 0); |
- ExpectMatches("A", NULL, 0U); |
-} |
- |
-// Makes sure index is updated when a node's title is changed. |
-TEST_F(BookmarkIndexTest, ChangeTitle) { |
- const char* titles[] = { "a", "b" }; |
- const char* urls[] = { kAboutBlankURL, kAboutBlankURL }; |
- AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles)); |
- |
- // Remove the node and make sure we don't get back any results. |
- const char* expected[] = { "blah" }; |
- model_->SetTitle(model_->other_node()->GetChild(0), ASCIIToUTF16("blah")); |
- ExpectMatches("BlAh", expected, ARRAYSIZE_UNSAFE(expected)); |
-} |
- |
-// Makes sure no more than max queries is returned. |
-TEST_F(BookmarkIndexTest, HonorMax) { |
- const char* titles[] = { "abcd", "abcde" }; |
- const char* urls[] = { kAboutBlankURL, kAboutBlankURL }; |
- AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles)); |
- |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(ASCIIToUTF16("ABc"), 1, &matches); |
- EXPECT_EQ(1U, matches.size()); |
-} |
- |
-// Makes sure if the lower case string of a bookmark title is more characters |
-// than the upper case string no match positions are returned. |
-TEST_F(BookmarkIndexTest, EmptyMatchOnMultiwideLowercaseString) { |
- const BookmarkNode* n1 = model_->AddURL(model_->other_node(), 0, |
- base::WideToUTF16(L"\u0130 i"), |
- GURL("http://www.google.com")); |
- |
- std::vector<BookmarkMatch> matches; |
- model_->GetBookmarksMatching(ASCIIToUTF16("i"), 100, &matches); |
- ASSERT_EQ(1U, matches.size()); |
- EXPECT_EQ(n1, matches[0].node); |
- EXPECT_TRUE(matches[0].title_match_positions.empty()); |
-} |
- |
-TEST_F(BookmarkIndexTest, GetResultsSortedByTypedCount) { |
- struct TestData { |
- const GURL url; |
- const char* title; |
- const int typed_count; |
- } data[] = { |
- { GURL("http://www.google.com/"), "Google", 100 }, |
- { GURL("http://maps.google.com/"), "Google Maps", 40 }, |
- { GURL("http://docs.google.com/"), "Google Docs", 50 }, |
- { GURL("http://reader.google.com/"), "Google Reader", 80 }, |
- }; |
- |
- std::map<GURL, int> typed_count_map; |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) |
- typed_count_map.insert(std::make_pair(data[i].url, data[i].typed_count)); |
- |
- BookmarkClientMock client(typed_count_map); |
- scoped_ptr<BookmarkModel> model = client.CreateModel(false); |
- |
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) |
- // Populate the BookmarkIndex. |
- model->AddURL( |
- model->other_node(), i, UTF8ToUTF16(data[i].title), data[i].url); |
- |
- // Populate match nodes. |
- std::vector<BookmarkMatch> matches; |
- model->GetBookmarksMatching(ASCIIToUTF16("google"), 4, &matches); |
- |
- // The resulting order should be: |
- // 1. Google (google.com) 100 |
- // 2. Google Reader (google.com/reader) 80 |
- // 3. Google Docs (docs.google.com) 50 |
- // 4. Google Maps (maps.google.com) 40 |
- ASSERT_EQ(4, static_cast<int>(matches.size())); |
- EXPECT_EQ(data[0].url, matches[0].node->url()); |
- EXPECT_EQ(data[3].url, matches[1].node->url()); |
- EXPECT_EQ(data[2].url, matches[2].node->url()); |
- EXPECT_EQ(data[1].url, matches[3].node->url()); |
- |
- matches.clear(); |
- // Select top two matches. |
- model->GetBookmarksMatching(ASCIIToUTF16("google"), 2, &matches); |
- |
- ASSERT_EQ(2, static_cast<int>(matches.size())); |
- EXPECT_EQ(data[0].url, matches[0].node->url()); |
- EXPECT_EQ(data[3].url, matches[1].node->url()); |
-} |
- |
-} // namespace |