| Index: chrome/browser/autocomplete/keyword_provider_unittest.cc
|
| diff --git a/chrome/browser/autocomplete/keyword_provider_unittest.cc b/chrome/browser/autocomplete/keyword_provider_unittest.cc
|
| index 617811b45045c4769e7a404538dd6fa0e9e10793..f6169509e77873c6baed7fbe67fce1b384d2d28a 100644
|
| --- a/chrome/browser/autocomplete/keyword_provider_unittest.cc
|
| +++ b/chrome/browser/autocomplete/keyword_provider_unittest.cc
|
| @@ -17,10 +17,16 @@
|
| class KeywordProviderTest : public testing::Test {
|
| protected:
|
| template<class ResultType>
|
| - struct test_data {
|
| + struct MatchType {
|
| + const ResultType member;
|
| + bool allowed_to_be_default_match;
|
| + };
|
| +
|
| + template<class ResultType>
|
| + struct TestData {
|
| const string16 input;
|
| const size_t num_results;
|
| - const ResultType output[3];
|
| + const MatchType<ResultType> output[3];
|
| };
|
|
|
| KeywordProviderTest() : kw_provider_(NULL) { }
|
| @@ -30,7 +36,7 @@ class KeywordProviderTest : public testing::Test {
|
| virtual void TearDown();
|
|
|
| template<class ResultType>
|
| - void RunTest(test_data<ResultType>* keyword_cases,
|
| + void RunTest(TestData<ResultType>* keyword_cases,
|
| int num_cases,
|
| ResultType AutocompleteMatch::* member);
|
|
|
| @@ -64,71 +70,94 @@ void KeywordProviderTest::TearDown() {
|
|
|
| template<class ResultType>
|
| void KeywordProviderTest::RunTest(
|
| - test_data<ResultType>* keyword_cases,
|
| + TestData<ResultType>* keyword_cases,
|
| int num_cases,
|
| ResultType AutocompleteMatch::* member) {
|
| ACMatches matches;
|
| for (int i = 0; i < num_cases; ++i) {
|
| + SCOPED_TRACE(keyword_cases[i].input);
|
| AutocompleteInput input(keyword_cases[i].input, string16::npos, string16(),
|
| GURL(), AutocompleteInput::INVALID_SPEC, true,
|
| false, true, AutocompleteInput::ALL_MATCHES);
|
| kw_provider_->Start(input, false);
|
| EXPECT_TRUE(kw_provider_->done());
|
| matches = kw_provider_->matches();
|
| - EXPECT_EQ(keyword_cases[i].num_results, matches.size()) <<
|
| - ASCIIToUTF16("Input was: ") + keyword_cases[i].input;
|
| - if (matches.size() == keyword_cases[i].num_results) {
|
| - for (size_t j = 0; j < keyword_cases[i].num_results; ++j) {
|
| - EXPECT_EQ(keyword_cases[i].output[j], matches[j].*member);
|
| - }
|
| + ASSERT_EQ(keyword_cases[i].num_results, matches.size());
|
| + for (size_t j = 0; j < matches.size(); ++j) {
|
| + EXPECT_EQ(keyword_cases[i].output[j].member, matches[j].*member);
|
| + EXPECT_EQ(keyword_cases[i].output[j].allowed_to_be_default_match,
|
| + matches[j].allowed_to_be_default_match);
|
| }
|
| }
|
| }
|
|
|
| TEST_F(KeywordProviderTest, Edit) {
|
| - test_data<string16> edit_cases[] = {
|
| + const MatchType<string16> kEmptyMatch = { string16(), false };
|
| + TestData<string16> edit_cases[] = {
|
| // Searching for a nonexistent prefix should give nothing.
|
| - {ASCIIToUTF16("Not Found"), 0, {}},
|
| - {ASCIIToUTF16("aaaaaNot Found"), 0, {}},
|
| + { ASCIIToUTF16("Not Found"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("aaaaaNot Found"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Check that tokenization only collapses whitespace between first tokens,
|
| // no-query-input cases have a space appended, and action is not escaped.
|
| - {ASCIIToUTF16("z"), 1, {ASCIIToUTF16("z ")}},
|
| - {ASCIIToUTF16("z \t"), 1, {ASCIIToUTF16("z ")}},
|
| + { ASCIIToUTF16("z"), 1,
|
| + { { ASCIIToUTF16("z "), true }, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("z \t"), 1,
|
| + { { ASCIIToUTF16("z "), true }, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Check that exact, substituting keywords with a verbatim search term
|
| // don't generate a result. (These are handled by SearchProvider.)
|
| - {ASCIIToUTF16("z foo"), 0, {}},
|
| - {ASCIIToUTF16("z a b c++"), 0, {}},
|
| + { ASCIIToUTF16("z foo"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("z a b c++"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Matches should be limited to three, and sorted in quality order, not
|
| // alphabetical.
|
| - {ASCIIToUTF16("aaa"), 2, {ASCIIToUTF16("aaaa "),
|
| - ASCIIToUTF16("aaaaa ")}},
|
| - {ASCIIToUTF16("a 1 2 3"), 3, {ASCIIToUTF16("aa 1 2 3"),
|
| - ASCIIToUTF16("ab 1 2 3"),
|
| - ASCIIToUTF16("aaaa 1 2 3")}},
|
| - {ASCIIToUTF16("www.a"), 3, {ASCIIToUTF16("aa "),
|
| - ASCIIToUTF16("ab "),
|
| - ASCIIToUTF16("aaaa ")}},
|
| + { ASCIIToUTF16("aaa"), 2,
|
| + { { ASCIIToUTF16("aaaa "), false },
|
| + { ASCIIToUTF16("aaaaa "), false },
|
| + kEmptyMatch } },
|
| + { ASCIIToUTF16("a 1 2 3"), 3,
|
| + { { ASCIIToUTF16("aa 1 2 3"), false },
|
| + { ASCIIToUTF16("ab 1 2 3"), false },
|
| + { ASCIIToUTF16("aaaa 1 2 3"), false } } },
|
| + { ASCIIToUTF16("www.a"), 3,
|
| + { { ASCIIToUTF16("aa "), false },
|
| + { ASCIIToUTF16("ab "), false },
|
| + { ASCIIToUTF16("aaaa "), false } } },
|
| // Exact matches should prevent returning inexact matches. Also, the
|
| // verbatim query for this keyword match should not be returned. (It's
|
| // returned by SearchProvider.)
|
| - {ASCIIToUTF16("aaaa foo"), 0, {}},
|
| - {ASCIIToUTF16("www.aaaa foo"), 0, {}},
|
| + { ASCIIToUTF16("aaaa foo"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("www.aaaa foo"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Clean up keyword input properly. "http" and "https" are the only
|
| // allowed schemes.
|
| - {ASCIIToUTF16("www"), 1, {ASCIIToUTF16("www ")}},
|
| - {ASCIIToUTF16("www."), 0, {}},
|
| - {ASCIIToUTF16("www.w w"), 2, {ASCIIToUTF16("www w"),
|
| - ASCIIToUTF16("weasel w")}},
|
| - {ASCIIToUTF16("http://www"), 1, {ASCIIToUTF16("www ")}},
|
| - {ASCIIToUTF16("http://www."), 0, {}},
|
| - {ASCIIToUTF16("ftp: blah"), 0, {}},
|
| - {ASCIIToUTF16("mailto:z"), 0, {}},
|
| - {ASCIIToUTF16("ftp://z"), 0, {}},
|
| - {ASCIIToUTF16("https://z"), 1, {ASCIIToUTF16("z ")}},
|
| + { ASCIIToUTF16("www"), 1,
|
| + { { ASCIIToUTF16("www "), true }, kEmptyMatch, kEmptyMatch }},
|
| + { ASCIIToUTF16("www."), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("www.w w"), 2,
|
| + { { ASCIIToUTF16("www w"), false },
|
| + { ASCIIToUTF16("weasel w"), false },
|
| + kEmptyMatch } },
|
| + { ASCIIToUTF16("http://www"), 1,
|
| + { { ASCIIToUTF16("www "), true }, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("http://www."), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("ftp: blah"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("mailto:z"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("ftp://z"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("https://z"), 1,
|
| + { { ASCIIToUTF16("z "), true }, kEmptyMatch, kEmptyMatch } },
|
| };
|
|
|
| RunTest<string16>(edit_cases, arraysize(edit_cases),
|
| @@ -136,24 +165,34 @@ TEST_F(KeywordProviderTest, Edit) {
|
| }
|
|
|
| TEST_F(KeywordProviderTest, URL) {
|
| - test_data<GURL> url_cases[] = {
|
| + const MatchType<GURL> kEmptyMatch = { GURL(), false };
|
| + TestData<GURL> url_cases[] = {
|
| // No query input -> empty destination URL.
|
| - {ASCIIToUTF16("z"), 1, {GURL()}},
|
| - {ASCIIToUTF16("z \t"), 1, {GURL()}},
|
| + { ASCIIToUTF16("z"), 1,
|
| + { { GURL(), true }, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("z \t"), 1,
|
| + { { GURL(), true }, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Check that tokenization only collapses whitespace between first tokens
|
| // and query input, but not rest of URL, is escaped.
|
| - {ASCIIToUTF16("w bar +baz"), 2, {GURL(" +%2B?=bar+%2Bbazfoo "),
|
| - GURL("bar+%2Bbaz=z")}},
|
| + { ASCIIToUTF16("w bar +baz"), 2,
|
| + { { GURL(" +%2B?=bar+%2Bbazfoo "), false },
|
| + { GURL("bar+%2Bbaz=z"), false },
|
| + kEmptyMatch } },
|
|
|
| // Substitution should work with various locations of the "%s".
|
| - {ASCIIToUTF16("aaa 1a2b"), 2, {GURL("http://aaaa/?aaaa=1&b=1a2b&c"),
|
| - GURL("1a2b")}},
|
| - {ASCIIToUTF16("a 1 2 3"), 3, {GURL("aa.com?foo=1+2+3"),
|
| - GURL("bogus URL 1+2+3"),
|
| - GURL("http://aaaa/?aaaa=1&b=1+2+3&c")}},
|
| - {ASCIIToUTF16("www.w w"), 2, {GURL(" +%2B?=wfoo "),
|
| - GURL("weaselwweasel")}},
|
| + { ASCIIToUTF16("aaa 1a2b"), 2,
|
| + { { GURL("http://aaaa/?aaaa=1&b=1a2b&c"), false },
|
| + { GURL("1a2b"), false },
|
| + kEmptyMatch } },
|
| + { ASCIIToUTF16("a 1 2 3"), 3,
|
| + { { GURL("aa.com?foo=1+2+3"), false },
|
| + { GURL("bogus URL 1+2+3"), false },
|
| + { GURL("http://aaaa/?aaaa=1&b=1+2+3&c"), false } } },
|
| + { ASCIIToUTF16("www.w w"), 2,
|
| + { { GURL(" +%2B?=wfoo "), false },
|
| + { GURL("weaselwweasel"), false },
|
| + kEmptyMatch } },
|
| };
|
|
|
| RunTest<GURL>(url_cases, arraysize(url_cases),
|
| @@ -161,16 +200,23 @@ TEST_F(KeywordProviderTest, URL) {
|
| }
|
|
|
| TEST_F(KeywordProviderTest, Contents) {
|
| - test_data<string16> contents_cases[] = {
|
| + const MatchType<string16> kEmptyMatch = { string16(), false };
|
| + TestData<string16> contents_cases[] = {
|
| // No query input -> substitute "<enter query>" into contents.
|
| - {ASCIIToUTF16("z"), 1,
|
| - {ASCIIToUTF16("Search z for <enter query>")}},
|
| - {ASCIIToUTF16("z \t"), 1,
|
| - {ASCIIToUTF16("Search z for <enter query>")}},
|
| + { ASCIIToUTF16("z"), 1,
|
| + { { ASCIIToUTF16("Search z for <enter query>"), true },
|
| + kEmptyMatch,
|
| + kEmptyMatch } },
|
| + { ASCIIToUTF16("z \t"), 1,
|
| + { { ASCIIToUTF16("Search z for <enter query>"), true },
|
| + kEmptyMatch,
|
| + kEmptyMatch } },
|
|
|
| // Exact keyword matches with remaining text should return nothing.
|
| - {ASCIIToUTF16("www.www www"), 0, {}},
|
| - {ASCIIToUTF16("z a b c++"), 0, {}},
|
| + { ASCIIToUTF16("www.www www"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
| + { ASCIIToUTF16("z a b c++"), 0,
|
| + { kEmptyMatch, kEmptyMatch, kEmptyMatch } },
|
|
|
| // Exact keyword matches with remaining text when the keyword is an
|
| // extension keyword should return something. This is tested in
|
| @@ -178,18 +224,20 @@ TEST_F(KeywordProviderTest, Contents) {
|
| // in OmniboxApiTest's Basic test.
|
|
|
| // Substitution should work with various locations of the "%s".
|
| - {ASCIIToUTF16("aaa"), 2,
|
| - {ASCIIToUTF16("Search aaaa for <enter query>"),
|
| - ASCIIToUTF16("Search aaaaa for <enter query>")}},
|
| - {ASCIIToUTF16("www.w w"), 2,
|
| - {ASCIIToUTF16("Search www for w"),
|
| - ASCIIToUTF16("Search weasel for w")}},
|
| + { ASCIIToUTF16("aaa"), 2,
|
| + { { ASCIIToUTF16("Search aaaa for <enter query>"), false },
|
| + { ASCIIToUTF16("Search aaaaa for <enter query>"), false },
|
| + kEmptyMatch} },
|
| + { ASCIIToUTF16("www.w w"), 2,
|
| + { { ASCIIToUTF16("Search www for w"), false },
|
| + { ASCIIToUTF16("Search weasel for w"), false },
|
| + kEmptyMatch } },
|
| // Also, check that tokenization only collapses whitespace between first
|
| // tokens and contents are not escaped or unescaped.
|
| - {ASCIIToUTF16("a 1 2+ 3"), 3,
|
| - {ASCIIToUTF16("Search aa for 1 2+ 3"),
|
| - ASCIIToUTF16("Search ab for 1 2+ 3"),
|
| - ASCIIToUTF16("Search aaaa for 1 2+ 3")}},
|
| + { ASCIIToUTF16("a 1 2+ 3"), 3,
|
| + { { ASCIIToUTF16("Search aa for 1 2+ 3"), false },
|
| + { ASCIIToUTF16("Search ab for 1 2+ 3"), false },
|
| + { ASCIIToUTF16("Search aaaa for 1 2+ 3"), false } } },
|
| };
|
|
|
| RunTest<string16>(contents_cases, arraysize(contents_cases),
|
| @@ -286,10 +334,11 @@ TEST_F(KeywordProviderTest, ExtraQueryParams) {
|
| CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| switches::kExtraSearchQueryParams, "a=b");
|
|
|
| - test_data<GURL> url_cases[] = {
|
| - {ASCIIToUTF16("a 1 2 3"), 3, {GURL("aa.com?a=b&foo=1+2+3"),
|
| - GURL("bogus URL 1+2+3"),
|
| - GURL("http://aaaa/?aaaa=1&b=1+2+3&c")}},
|
| + TestData<GURL> url_cases[] = {
|
| + { ASCIIToUTF16("a 1 2 3"), 3,
|
| + { { GURL("aa.com?a=b&foo=1+2+3"), false },
|
| + { GURL("bogus URL 1+2+3"), false },
|
| + { GURL("http://aaaa/?aaaa=1&b=1+2+3&c"), false } } },
|
| };
|
|
|
| RunTest<GURL>(url_cases, arraysize(url_cases),
|
|
|