Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/string16.h" | 8 #include "base/string16.h" |
| 9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 #include "content/public/browser/notification_observer.h" | 22 #include "content/public/browser/notification_observer.h" |
| 23 #include "content/public/browser/notification_registrar.h" | 23 #include "content/public/browser/notification_registrar.h" |
| 24 #include "content/public/browser/notification_source.h" | 24 #include "content/public/browser/notification_source.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 | 26 |
| 27 static std::ostream& operator<<(std::ostream& os, | 27 static std::ostream& operator<<(std::ostream& os, |
| 28 const AutocompleteResult::const_iterator& it) { | 28 const AutocompleteResult::const_iterator& it) { |
| 29 return os << static_cast<const AutocompleteMatch*>(&(*it)); | 29 return os << static_cast<const AutocompleteMatch*>(&(*it)); |
| 30 } | 30 } |
| 31 | 31 |
| 32 namespace { | |
| 33 | |
| 34 const size_t num_results_per_provider = 3; | 32 const size_t num_results_per_provider = 3; |
|
Peter Kasting
2012/01/11 03:00:16
Nit: Enclosing this constant in a namespace before
| |
| 35 | 33 |
| 36 // Autocomplete provider that provides known results. Note that this is | 34 // Autocomplete provider that provides known results. Note that this is |
| 37 // refcounted so that it can also be a task on the message loop. | 35 // refcounted so that it can also be a task on the message loop. |
| 38 class TestProvider : public AutocompleteProvider { | 36 class TestProvider : public AutocompleteProvider { |
| 39 public: | 37 public: |
| 40 TestProvider(int relevance, const string16& prefix) | 38 TestProvider(int relevance, const string16& prefix) |
| 41 : AutocompleteProvider(NULL, NULL, ""), | 39 : AutocompleteProvider(NULL, NULL, ""), |
| 42 relevance_(relevance), | 40 relevance_(relevance), |
| 43 prefix_(prefix) { | 41 prefix_(prefix) { |
| 44 } | 42 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 match.description_class.push_back( | 99 match.description_class.push_back( |
| 102 ACMatchClassification(0, ACMatchClassification::NONE)); | 100 ACMatchClassification(0, ACMatchClassification::NONE)); |
| 103 | 101 |
| 104 matches_.push_back(match); | 102 matches_.push_back(match); |
| 105 } | 103 } |
| 106 } | 104 } |
| 107 | 105 |
| 108 class AutocompleteProviderTest : public testing::Test, | 106 class AutocompleteProviderTest : public testing::Test, |
| 109 public content::NotificationObserver { | 107 public content::NotificationObserver { |
| 110 protected: | 108 protected: |
| 109 struct KeywordTestData { | |
| 110 const string16 fill_into_edit; | |
| 111 const string16 keyword; | |
| 112 const bool expected_keyword_result; | |
| 113 }; | |
| 114 | |
| 115 protected: | |
| 111 void ResetControllerWithTestProviders(bool same_destinations); | 116 void ResetControllerWithTestProviders(bool same_destinations); |
| 112 | 117 |
| 113 // Runs a query on the input "a", and makes sure both providers' input is | 118 // Runs a query on the input "a", and makes sure both providers' input is |
| 114 // properly collected. | 119 // properly collected. |
| 115 void RunTest(); | 120 void RunTest(); |
| 116 | 121 |
| 122 void RunRedundantKeywordTest(const KeywordTestData* match_data, size_t size); | |
| 123 | |
| 124 void RunQuery(const string16 query); | |
| 125 | |
| 117 void ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); | 126 void ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); |
| 127 void ResetControllerWithKeywordProvider(); | |
| 118 void RunExactKeymatchTest(bool allow_exact_keyword_match); | 128 void RunExactKeymatchTest(bool allow_exact_keyword_match); |
| 119 | 129 |
| 120 // These providers are owned by the controller once it's created. | 130 // These providers are owned by the controller once it's created. |
| 121 ACProviders providers_; | 131 ACProviders providers_; |
| 122 | 132 |
| 123 AutocompleteResult result_; | 133 AutocompleteResult result_; |
| 134 scoped_ptr<AutocompleteController> controller_; | |
| 124 | 135 |
| 125 private: | 136 private: |
| 126 // content::NotificationObserver | 137 // content::NotificationObserver |
| 127 virtual void Observe(int type, | 138 virtual void Observe(int type, |
| 128 const content::NotificationSource& source, | 139 const content::NotificationSource& source, |
| 129 const content::NotificationDetails& details); | 140 const content::NotificationDetails& details); |
| 130 | 141 |
| 131 MessageLoopForUI message_loop_; | 142 MessageLoopForUI message_loop_; |
| 132 scoped_ptr<AutocompleteController> controller_; | |
| 133 content::NotificationRegistrar registrar_; | 143 content::NotificationRegistrar registrar_; |
| 134 TestingProfile profile_; | 144 TestingProfile profile_; |
| 135 }; | 145 }; |
| 136 | 146 |
| 137 void AutocompleteProviderTest::ResetControllerWithTestProviders( | 147 void AutocompleteProviderTest::ResetControllerWithTestProviders( |
| 138 bool same_destinations) { | 148 bool same_destinations) { |
| 139 // Forget about any existing providers. The controller owns them and will | 149 // Forget about any existing providers. The controller owns them and will |
| 140 // Release() them below, when we delete it during the call to reset(). | 150 // Release() them below, when we delete it during the call to reset(). |
| 141 providers_.clear(); | 151 providers_.clear(); |
| 142 | 152 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 // Create both a keyword and search provider, and add them in that order. | 204 // Create both a keyword and search provider, and add them in that order. |
| 195 // (Order is important; see comments in RunExactKeymatchTest().) | 205 // (Order is important; see comments in RunExactKeymatchTest().) |
| 196 AutocompleteProvider* keyword_provider = new KeywordProvider(NULL, | 206 AutocompleteProvider* keyword_provider = new KeywordProvider(NULL, |
| 197 &profile_); | 207 &profile_); |
| 198 keyword_provider->AddRef(); | 208 keyword_provider->AddRef(); |
| 199 providers_.push_back(keyword_provider); | 209 providers_.push_back(keyword_provider); |
| 200 AutocompleteProvider* search_provider = new SearchProvider(NULL, &profile_); | 210 AutocompleteProvider* search_provider = new SearchProvider(NULL, &profile_); |
| 201 search_provider->AddRef(); | 211 search_provider->AddRef(); |
| 202 providers_.push_back(search_provider); | 212 providers_.push_back(search_provider); |
| 203 | 213 |
| 214 controller_.reset(new AutocompleteController(providers_, &profile_)); | |
| 215 } | |
| 216 | |
| 217 void AutocompleteProviderTest:: | |
| 218 ResetControllerWithKeywordProvider() { | |
| 219 profile_.CreateTemplateURLService(); | |
| 220 | |
| 221 TemplateURLService* turl_model = | |
| 222 TemplateURLServiceFactory::GetForProfile(&profile_); | |
| 223 | |
| 224 // Create a TemplateURL for KeywordProvider. | |
| 225 TemplateURL* keyword_t_url = new TemplateURL(); | |
| 226 keyword_t_url->set_short_name(ASCIIToUTF16("foo.com")); | |
| 227 keyword_t_url->set_keyword(ASCIIToUTF16("foo.com")); | |
| 228 keyword_t_url->SetURL("http://foo.com/{searchTerms}", 0, 0); | |
| 229 turl_model->Add(keyword_t_url); | |
| 230 ASSERT_NE(0, keyword_t_url->id()); | |
| 231 | |
| 232 // Create another TemplateURL for KeywordProvider. | |
| 233 keyword_t_url = new TemplateURL(); | |
| 234 keyword_t_url->set_short_name(ASCIIToUTF16("bar.com")); | |
| 235 keyword_t_url->set_keyword(ASCIIToUTF16("bar.com")); | |
| 236 keyword_t_url->SetURL("http://bar.com/{searchTerms}", 0, 0); | |
| 237 turl_model->Add(keyword_t_url); | |
| 238 ASSERT_NE(0, keyword_t_url->id()); | |
| 239 | |
| 240 // Forget about any existing providers. The controller owns them and will | |
| 241 // Release() them below, when we delete it during the call to reset(). | |
| 242 providers_.clear(); | |
| 243 | |
| 244 // Create both a keyword and search provider, and add them in that order. | |
| 245 // (Order is important; see comments in RunExactKeymatchTest().) | |
| 246 KeywordProvider* keyword_provider = new KeywordProvider(NULL, | |
| 247 &profile_); | |
| 248 keyword_provider->AddRef(); | |
| 249 providers_.push_back(keyword_provider); | |
| 250 | |
| 204 AutocompleteController* controller = | 251 AutocompleteController* controller = |
| 205 new AutocompleteController(providers_, &profile_); | 252 new AutocompleteController(providers_, &profile_); |
| 253 controller->set_keyword_provider(keyword_provider); | |
| 206 controller_.reset(controller); | 254 controller_.reset(controller); |
| 207 } | 255 } |
| 208 | 256 |
| 209 void AutocompleteProviderTest::RunTest() { | 257 void AutocompleteProviderTest::RunTest() { |
| 258 RunQuery(ASCIIToUTF16("a")); | |
| 259 } | |
| 260 | |
| 261 void AutocompleteProviderTest::RunRedundantKeywordTest( | |
| 262 const KeywordTestData* match_data, | |
| 263 size_t size) { | |
| 264 ACMatches matches; | |
| 265 for (size_t i = 0; i < size; ++i) { | |
| 266 AutocompleteMatch match; | |
| 267 match.fill_into_edit = match_data[i].fill_into_edit; | |
| 268 match.keyword = match_data[i].keyword; | |
| 269 matches.push_back(match); | |
| 270 } | |
| 271 | |
| 272 AutocompleteResult result; | |
| 273 result.AppendMatches(matches); | |
| 274 controller_->UpdateAssociatedKeywords(&result); | |
| 275 | |
| 276 for (size_t j = 0; j < result.size(); ++j) { | |
| 277 EXPECT_EQ(match_data[j].expected_keyword_result, | |
| 278 result.match_at(j).associated_keyword.get() != NULL); | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 | |
| 283 void AutocompleteProviderTest::RunQuery(const string16 query) { | |
| 210 result_.Reset(); | 284 result_.Reset(); |
| 211 controller_->Start(ASCIIToUTF16("a"), string16(), true, false, true, | 285 controller_->Start(query, string16(), true, false, true, |
| 212 AutocompleteInput::ALL_MATCHES); | 286 AutocompleteInput::ALL_MATCHES); |
| 213 | 287 |
| 214 // The message loop will terminate when all autocomplete input has been | 288 if (!controller_->done()) |
| 215 // collected. | 289 // The message loop will terminate when all autocomplete input has been |
| 216 MessageLoop::current()->Run(); | 290 // collected. |
| 291 MessageLoop::current()->Run(); | |
| 217 } | 292 } |
| 218 | 293 |
| 219 void AutocompleteProviderTest::RunExactKeymatchTest( | 294 void AutocompleteProviderTest::RunExactKeymatchTest( |
| 220 bool allow_exact_keyword_match) { | 295 bool allow_exact_keyword_match) { |
| 221 // Send the controller input which exactly matches the keyword provider we | 296 // Send the controller input which exactly matches the keyword provider we |
| 222 // created in ResetControllerWithKeywordAndSearchProviders(). The default | 297 // created in ResetControllerWithKeywordAndSearchProviders(). The default |
| 223 // match should thus be a keyword match iff |allow_exact_keyword_match| is | 298 // match should thus be a keyword match iff |allow_exact_keyword_match| is |
| 224 // true. | 299 // true. |
| 225 controller_->Start(ASCIIToUTF16("k test"), string16(), true, false, | 300 controller_->Start(ASCIIToUTF16("k test"), string16(), true, false, |
| 226 allow_exact_keyword_match, | 301 allow_exact_keyword_match, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 i != result_.end(); ++i) | 341 i != result_.end(); ++i) |
| 267 EXPECT_EQ(providers_[1], i->provider); | 342 EXPECT_EQ(providers_[1], i->provider); |
| 268 } | 343 } |
| 269 | 344 |
| 270 TEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) { | 345 TEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) { |
| 271 ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); | 346 ResetControllerWithTestProvidersWithKeywordAndSearchProviders(); |
| 272 RunExactKeymatchTest(true); | 347 RunExactKeymatchTest(true); |
| 273 RunExactKeymatchTest(false); | 348 RunExactKeymatchTest(false); |
| 274 } | 349 } |
| 275 | 350 |
| 351 // Test that redundant associated keywords are removed. | |
| 352 TEST_F(AutocompleteProviderTest, RedundantKeywordsIgnoredInResult) { | |
| 353 ResetControllerWithKeywordProvider(); | |
| 354 | |
| 355 // Get the controller's internal members in the correct state. | |
| 356 RunQuery(ASCIIToUTF16("fo")); | |
| 357 | |
| 358 { | |
| 359 KeywordTestData duplicate_url[] = { | |
| 360 { ASCIIToUTF16("fo"), string16(), false }, | |
| 361 { ASCIIToUTF16("foo.com"), string16(), true }, | |
| 362 { ASCIIToUTF16("foo.com"), string16(), false } | |
| 363 }; | |
| 364 | |
| 365 SCOPED_TRACE("Duplicate url"); | |
| 366 RunRedundantKeywordTest(duplicate_url, ARRAYSIZE_UNSAFE(duplicate_url)); | |
| 367 } | |
| 368 | |
| 369 { | |
| 370 KeywordTestData keyword_match[] = { | |
| 371 { ASCIIToUTF16("foo.com"), ASCIIToUTF16("foo.com"), false }, | |
| 372 { ASCIIToUTF16("foo.com"), string16(), false } | |
| 373 }; | |
| 374 | |
| 375 SCOPED_TRACE("Duplicate url with keyword match"); | |
| 376 RunRedundantKeywordTest(keyword_match, ARRAYSIZE_UNSAFE(keyword_match)); | |
| 377 } | |
| 378 | |
| 379 { | |
| 380 KeywordTestData multiple_keyword[] = { | |
| 381 { ASCIIToUTF16("fo"), string16(), false }, | |
| 382 { ASCIIToUTF16("foo.com"), string16(), true }, | |
| 383 { ASCIIToUTF16("foo.com"), string16(), false }, | |
| 384 { ASCIIToUTF16("bar.com"), string16(), true }, | |
| 385 }; | |
| 386 | |
| 387 SCOPED_TRACE("Duplicate url with multiple keywords"); | |
| 388 RunRedundantKeywordTest(multiple_keyword, | |
| 389 ARRAYSIZE_UNSAFE(multiple_keyword)); | |
| 390 } | |
| 391 } | |
| 392 | |
| 276 typedef testing::Test AutocompleteTest; | 393 typedef testing::Test AutocompleteTest; |
| 277 | 394 |
| 278 TEST_F(AutocompleteTest, InputType) { | 395 TEST_F(AutocompleteTest, InputType) { |
| 279 struct test_data { | 396 struct test_data { |
| 280 const string16 input; | 397 const string16 input; |
| 281 const AutocompleteInput::Type type; | 398 const AutocompleteInput::Type type; |
| 282 } input_cases[] = { | 399 } input_cases[] = { |
| 283 { string16(), AutocompleteInput::INVALID }, | 400 { string16(), AutocompleteInput::INVALID }, |
| 284 { ASCIIToUTF16("?"), AutocompleteInput::FORCED_QUERY }, | 401 { ASCIIToUTF16("?"), AutocompleteInput::FORCED_QUERY }, |
| 285 { ASCIIToUTF16("?foo"), AutocompleteInput::FORCED_QUERY }, | 402 { ASCIIToUTF16("?foo"), AutocompleteInput::FORCED_QUERY }, |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 477 &scheme, | 594 &scheme, |
| 478 &host); | 595 &host); |
| 479 AutocompleteInput input(input_cases[i].input, string16(), true, false, | 596 AutocompleteInput input(input_cases[i].input, string16(), true, false, |
| 480 true, AutocompleteInput::ALL_MATCHES); | 597 true, AutocompleteInput::ALL_MATCHES); |
| 481 EXPECT_EQ(input_cases[i].scheme.begin, scheme.begin); | 598 EXPECT_EQ(input_cases[i].scheme.begin, scheme.begin); |
| 482 EXPECT_EQ(input_cases[i].scheme.len, scheme.len); | 599 EXPECT_EQ(input_cases[i].scheme.len, scheme.len); |
| 483 EXPECT_EQ(input_cases[i].host.begin, host.begin); | 600 EXPECT_EQ(input_cases[i].host.begin, host.begin); |
| 484 EXPECT_EQ(input_cases[i].host.len, host.len); | 601 EXPECT_EQ(input_cases[i].host.len, host.len); |
| 485 } | 602 } |
| 486 } | 603 } |
| 487 | |
| 488 } // namespace | |
| OLD | NEW |