Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: ui/app_list/search/mixer_unittest.cc

Issue 796293002: App list voice searches now prioritize exact-match web results. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nit. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/app_list/search/mixer.cc ('k') | ui/app_list/search_controller.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <set>
5 #include <string> 6 #include <string>
6 7
7 #include "base/memory/scoped_vector.h" 8 #include "base/memory/scoped_vector.h"
8 #include "base/strings/string16.h" 9 #include "base/strings/string16.h"
9 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/app_list/app_list_model.h" 13 #include "ui/app_list/app_list_model.h"
13 #include "ui/app_list/search/history_types.h" 14 #include "ui/app_list/search/history_types.h"
14 #include "ui/app_list/search/mixer.h" 15 #include "ui/app_list/search/mixer.h"
15 #include "ui/app_list/search_provider.h" 16 #include "ui/app_list/search_provider.h"
16 #include "ui/app_list/search_result.h" 17 #include "ui/app_list/search_result.h"
17 18
18 namespace app_list { 19 namespace app_list {
19 namespace test { 20 namespace test {
20 21
21 class TestSearchResult : public SearchResult { 22 class TestSearchResult : public SearchResult {
22 public: 23 public:
23 TestSearchResult(const std::string& id, double relevance) 24 TestSearchResult(const std::string& id, double relevance)
24 : instance_id_(instantiation_count++) { 25 : instance_id_(instantiation_count++) {
25 set_id(id); 26 set_id(id);
26 set_title(base::UTF8ToUTF16(id)); 27 set_title(base::UTF8ToUTF16(id));
27 set_relevance(relevance); 28 set_relevance(relevance);
28 } 29 }
29 ~TestSearchResult() override {} 30 ~TestSearchResult() override {}
30 31
32 using SearchResult::set_voice_result;
33
31 // SearchResult overrides: 34 // SearchResult overrides:
32 void Open(int event_flags) override {} 35 void Open(int event_flags) override {}
33 void InvokeAction(int action_index, int event_flags) override {} 36 void InvokeAction(int action_index, int event_flags) override {}
34 scoped_ptr<SearchResult> Duplicate() override { 37 scoped_ptr<SearchResult> Duplicate() override {
35 return scoped_ptr<SearchResult>(new TestSearchResult(id(), relevance())); 38 return scoped_ptr<SearchResult>(new TestSearchResult(id(), relevance()));
36 } 39 }
37 40
38 // For reference equality testing. (Addresses cannot be used to test reference 41 // For reference equality testing. (Addresses cannot be used to test reference
39 // equality because it is possible that an object will be allocated at the 42 // equality because it is possible that an object will be allocated at the
40 // same address as a previously deleted one.) 43 // same address as a previously deleted one.)
(...skipping 16 matching lines...) Expand all
57 : prefix_(prefix), count_(0) {} 60 : prefix_(prefix), count_(0) {}
58 ~TestSearchProvider() override {} 61 ~TestSearchProvider() override {}
59 62
60 // SearchProvider overrides: 63 // SearchProvider overrides:
61 void Start(const base::string16& query) override { 64 void Start(const base::string16& query) override {
62 ClearResults(); 65 ClearResults();
63 for (size_t i = 0; i < count_; ++i) { 66 for (size_t i = 0; i < count_; ++i) {
64 const std::string id = 67 const std::string id =
65 base::StringPrintf("%s%d", prefix_.c_str(), static_cast<int>(i)); 68 base::StringPrintf("%s%d", prefix_.c_str(), static_cast<int>(i));
66 const double relevance = 1.0 - i / 10.0; 69 const double relevance = 1.0 - i / 10.0;
67 Add(scoped_ptr<SearchResult>(new TestSearchResult(id, relevance)).Pass()); 70 TestSearchResult* result = new TestSearchResult(id, relevance);
71 if (voice_result_indices.find(i) != voice_result_indices.end())
72 result->set_voice_result(true);
73 Add(scoped_ptr<SearchResult>(result).Pass());
68 } 74 }
69 } 75 }
70 void Stop() override {} 76 void Stop() override {}
71 77
72 void set_prefix(const std::string& prefix) { prefix_ = prefix; } 78 void set_prefix(const std::string& prefix) { prefix_ = prefix; }
73 void set_count(size_t count) { count_ = count; } 79 void set_count(size_t count) { count_ = count; }
80 void set_as_voice_result(size_t index) { voice_result_indices.insert(index); }
74 81
75 private: 82 private:
76 std::string prefix_; 83 std::string prefix_;
77 size_t count_; 84 size_t count_;
85 // Indices of results that will have the |voice_result| flag set.
86 std::set<size_t> voice_result_indices;
78 87
79 DISALLOW_COPY_AND_ASSIGN(TestSearchProvider); 88 DISALLOW_COPY_AND_ASSIGN(TestSearchProvider);
80 }; 89 };
81 90
82 class MixerTest : public testing::Test { 91 class MixerTest : public testing::Test {
83 public: 92 public:
84 MixerTest() {} 93 MixerTest() : is_voice_query_(false) {}
85 ~MixerTest() override {} 94 ~MixerTest() override {}
86 95
87 // testing::Test overrides: 96 // testing::Test overrides:
88 void SetUp() override { 97 void SetUp() override {
89 results_.reset(new AppListModel::SearchResults); 98 results_.reset(new AppListModel::SearchResults);
90 99
91 providers_.push_back(new TestSearchProvider("app")); 100 providers_.push_back(new TestSearchProvider("app"));
92 providers_.push_back(new TestSearchProvider("omnibox")); 101 providers_.push_back(new TestSearchProvider("omnibox"));
93 providers_.push_back(new TestSearchProvider("webstore")); 102 providers_.push_back(new TestSearchProvider("webstore"));
94 providers_.push_back(new TestSearchProvider("people")); 103 providers_.push_back(new TestSearchProvider("people"));
95 104
105 is_voice_query_ = false;
106
96 mixer_.reset(new Mixer(results_.get())); 107 mixer_.reset(new Mixer(results_.get()));
97 mixer_->Init(); 108 mixer_->Init();
98 mixer_->AddProviderToGroup(Mixer::MAIN_GROUP, providers_[0]); 109 mixer_->AddProviderToGroup(Mixer::MAIN_GROUP, providers_[0]);
99 mixer_->AddProviderToGroup(Mixer::OMNIBOX_GROUP, providers_[1]); 110 mixer_->AddProviderToGroup(Mixer::OMNIBOX_GROUP, providers_[1]);
100 mixer_->AddProviderToGroup(Mixer::WEBSTORE_GROUP, providers_[2]); 111 mixer_->AddProviderToGroup(Mixer::WEBSTORE_GROUP, providers_[2]);
101 mixer_->AddProviderToGroup(Mixer::PEOPLE_GROUP, providers_[3]); 112 mixer_->AddProviderToGroup(Mixer::PEOPLE_GROUP, providers_[3]);
102 } 113 }
103 114
104 void RunQuery() { 115 void RunQuery() {
105 const base::string16 query; 116 const base::string16 query;
106 117
107 for (size_t i = 0; i < providers_.size(); ++i) { 118 for (size_t i = 0; i < providers_.size(); ++i) {
108 providers_[i]->Start(query); 119 providers_[i]->Start(query);
109 providers_[i]->Stop(); 120 providers_[i]->Stop();
110 } 121 }
111 122
112 mixer_->MixAndPublish(KnownResults()); 123 mixer_->MixAndPublish(is_voice_query_, KnownResults());
113 } 124 }
114 125
115 std::string GetResults() const { 126 std::string GetResults() const {
116 std::string result; 127 std::string result;
117 for (size_t i = 0; i < results_->item_count(); ++i) { 128 for (size_t i = 0; i < results_->item_count(); ++i) {
118 if (!result.empty()) 129 if (!result.empty())
119 result += ','; 130 result += ',';
120 131
121 result += base::UTF16ToUTF8(results_->GetItemAt(i)->title()); 132 result += base::UTF16ToUTF8(results_->GetItemAt(i)->title());
122 } 133 }
123 134
124 return result; 135 return result;
125 } 136 }
126 137
127 Mixer* mixer() { return mixer_.get(); } 138 Mixer* mixer() { return mixer_.get(); }
128 TestSearchProvider* app_provider() { return providers_[0]; } 139 TestSearchProvider* app_provider() { return providers_[0]; }
129 TestSearchProvider* omnibox_provider() { return providers_[1]; } 140 TestSearchProvider* omnibox_provider() { return providers_[1]; }
130 TestSearchProvider* webstore_provider() { return providers_[2]; } 141 TestSearchProvider* webstore_provider() { return providers_[2]; }
131 TestSearchProvider* people_provider() { return providers_[3]; } 142 TestSearchProvider* people_provider() { return providers_[3]; }
132 143
144 // Sets whether test runs should be treated as a voice query.
145 void set_is_voice_query(bool is_voice_query) {
146 is_voice_query_ = is_voice_query;
147 }
148
133 private: 149 private:
134 scoped_ptr<Mixer> mixer_; 150 scoped_ptr<Mixer> mixer_;
135 scoped_ptr<AppListModel::SearchResults> results_; 151 scoped_ptr<AppListModel::SearchResults> results_;
136 152
153 bool is_voice_query_;
154
137 ScopedVector<TestSearchProvider> providers_; 155 ScopedVector<TestSearchProvider> providers_;
138 156
139 DISALLOW_COPY_AND_ASSIGN(MixerTest); 157 DISALLOW_COPY_AND_ASSIGN(MixerTest);
140 }; 158 };
141 159
142 TEST_F(MixerTest, Basic) { 160 TEST_F(MixerTest, Basic) {
143 struct TestCase { 161 struct TestCase {
144 const size_t app_results; 162 const size_t app_results;
145 const size_t omnibox_results; 163 const size_t omnibox_results;
146 const size_t webstore_results; 164 const size_t webstore_results;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 // This gives "dup0". 211 // This gives "dup0".
194 webstore_provider()->set_prefix(dup); 212 webstore_provider()->set_prefix(dup);
195 webstore_provider()->set_count(1); 213 webstore_provider()->set_count(1);
196 214
197 RunQuery(); 215 RunQuery();
198 216
199 // Only three results with unique id are kept. 217 // Only three results with unique id are kept.
200 EXPECT_EQ("dup0,dup1,dup2", GetResults()); 218 EXPECT_EQ("dup0,dup1,dup2", GetResults());
201 } 219 }
202 220
221 TEST_F(MixerTest, VoiceQuery) {
222 omnibox_provider()->set_count(3);
223 RunQuery();
224 EXPECT_EQ("omnibox0,omnibox1,omnibox2", GetResults());
225
226 // Set "omnibox1" as a voice result. Do not expect any changes (as this is not
227 // a voice query).
228 omnibox_provider()->set_as_voice_result(1);
229 RunQuery();
230 EXPECT_EQ("omnibox0,omnibox1,omnibox2", GetResults());
231
232 // Perform a voice query. Expect voice result first.
233 set_is_voice_query(true);
234 RunQuery();
235 EXPECT_EQ("omnibox1,omnibox0,omnibox2", GetResults());
236
237 // All voice results should appear before non-voice results.
238 omnibox_provider()->set_as_voice_result(2);
239 RunQuery();
240 EXPECT_EQ("omnibox1,omnibox2,omnibox0", GetResults());
241 }
242
203 TEST_F(MixerTest, Publish) { 243 TEST_F(MixerTest, Publish) {
204 scoped_ptr<SearchResult> result1(new TestSearchResult("app1", 0)); 244 scoped_ptr<SearchResult> result1(new TestSearchResult("app1", 0));
205 scoped_ptr<SearchResult> result2(new TestSearchResult("app2", 0)); 245 scoped_ptr<SearchResult> result2(new TestSearchResult("app2", 0));
206 scoped_ptr<SearchResult> result3(new TestSearchResult("app3", 0)); 246 scoped_ptr<SearchResult> result3(new TestSearchResult("app3", 0));
207 scoped_ptr<SearchResult> result3_copy = result3->Duplicate(); 247 scoped_ptr<SearchResult> result3_copy = result3->Duplicate();
208 scoped_ptr<SearchResult> result4(new TestSearchResult("app4", 0)); 248 scoped_ptr<SearchResult> result4(new TestSearchResult("app4", 0));
209 scoped_ptr<SearchResult> result5(new TestSearchResult("app5", 0)); 249 scoped_ptr<SearchResult> result5(new TestSearchResult("app5", 0));
210 250
211 AppListModel::SearchResults ui_results; 251 AppListModel::SearchResults ui_results;
212 252
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 EXPECT_EQ(old_ui_result_ids[0], 323 EXPECT_EQ(old_ui_result_ids[0],
284 TestSearchResult::GetInstanceId(ui_results.GetItemAt(3))); 324 TestSearchResult::GetInstanceId(ui_results.GetItemAt(3)));
285 EXPECT_EQ(old_ui_result_ids[1], 325 EXPECT_EQ(old_ui_result_ids[1],
286 TestSearchResult::GetInstanceId(ui_results.GetItemAt(0))); 326 TestSearchResult::GetInstanceId(ui_results.GetItemAt(0)));
287 EXPECT_EQ(old_ui_result_ids[2], 327 EXPECT_EQ(old_ui_result_ids[2],
288 TestSearchResult::GetInstanceId(ui_results.GetItemAt(2))); 328 TestSearchResult::GetInstanceId(ui_results.GetItemAt(2)));
289 } 329 }
290 330
291 } // namespace test 331 } // namespace test
292 } // namespace app_list 332 } // namespace app_list
OLDNEW
« no previous file with comments | « ui/app_list/search/mixer.cc ('k') | ui/app_list/search_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698