Merge lp:~mhr3/unity/fix-1067327 into lp:unity

Proposed by Michal Hruby
Status: Merged
Approved by: Paweł Stołowski
Approved revision: no longer in the source branch.
Merged at revision: 2844
Proposed branch: lp:~mhr3/unity/fix-1067327
Merge into: lp:unity
Diff against target: 195 lines (+142/-2)
2 files modified
UnityCore/HomeLens.cpp (+8/-2)
tests/test_home_lens.cpp (+134/-0)
To merge this branch: bzr merge lp:~mhr3/unity/fix-1067327
Reviewer Review Type Date Requested Status
Paweł Stołowski (community) Approve
PS Jenkins bot continuous-integration Pending
Review via email: mp+129869@code.launchpad.net

Commit message

Ensure categories with non-personal results can show up before empty categories with personal results

Description of the change

Due to a bug in the CategorySorter, lenses with "personal-content" flag set were sorted before lenses without the flag even if there were 0 results. This then caused lenses without the persoanl-content flag set to be displayed below shopping lens, simple example of how it looked after sort:

1) apps.lens - 0 results
2) files.lens - 0 results
3) shopping.lens - 5 results
4) video.lens - 14 (non-personal) results
...

Included unit tests to ensure this doesn't regress.

To post a comment you must log in.
Revision history for this message
Paweł Stołowski (stolowski) wrote :

Looks good, just one suggestion - since you added temporary a_results & b_results:

10 + unsigned a_results = results_per_category_[cat_a];
11 + unsigned b_results = results_per_category_[cat_b];

Can you move them up and simplify the return statement:

17 return results_per_category_[cat_a] > results_per_category_[cat_b];

review: Needs Fixing
Revision history for this message
Paweł Stołowski (stolowski) wrote :

Couldn't test it because of a unity trunk - nux trunk compilation issue, but code-wise looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'UnityCore/HomeLens.cpp'
2--- UnityCore/HomeLens.cpp 2012-10-01 13:30:18 +0000
3+++ UnityCore/HomeLens.cpp 2012-10-16 14:31:20 +0000
4@@ -307,13 +307,19 @@
5 b_has_personal_content = it->second->provides_personal_content();
6 }
7
8+ unsigned a_results = results_per_category_[cat_a];
9+ unsigned b_results = results_per_category_[cat_b];
10+
11 // prioritize categories that have private content
12 if (a_has_personal_content != b_has_personal_content)
13 {
14- return a_has_personal_content ? true : false;
15+ // personal content results are first unless there are 0 results
16+ if (a_has_personal_content && a_results > 0) return true;
17+ else if (b_has_personal_content) return !(b_results > 0);
18+ return false;
19 }
20
21- return results_per_category_[cat_a] > results_per_category_[cat_b];
22+ return a_results > b_results;
23 }
24
25 private:
26
27=== modified file 'tests/test_home_lens.cpp'
28--- tests/test_home_lens.cpp 2012-08-31 11:17:42 +0000
29+++ tests/test_home_lens.cpp 2012-10-16 14:31:20 +0000
30@@ -63,9 +63,11 @@
31 description, search_hint, true, "",
32 ModelType::LOCAL)
33 , num_results_(-1)
34+ , provides_personal_results_(true)
35 {
36 search_in_global(true);
37 connected.SetGetterFunction(sigc::mem_fun(this, &StaticTestLens::force_connected));
38+ provides_personal_content.SetGetterFunction(sigc::mem_fun(this, &StaticTestLens::get_provides_personal_results));
39
40 DeeModel* cats = categories()->model();
41 DeeModel* results = global_results()->model();
42@@ -96,6 +98,11 @@
43 return true;
44 }
45
46+ bool get_provides_personal_results()
47+ {
48+ return provides_personal_results_;
49+ }
50+
51 virtual void DoGlobalSearch(string const& search_string)
52 {
53 DeeModel* model = global_results()->model();
54@@ -165,9 +172,15 @@
55 num_results_ = count;
56 }
57
58+ void SetProvidesPersonalResults(bool value)
59+ {
60+ provides_personal_results_ = value;
61+ }
62+
63 private:
64 string results_base_name_;
65 int num_results_;
66+ bool provides_personal_results_;
67 };
68
69 static gboolean dispatch_global_search(gpointer userdata)
70@@ -643,4 +656,125 @@
71 EXPECT_EQ(order_changed, true);
72 }
73
74+TEST(TestHomeLens, TestPersonalResultsFirst)
75+{
76+ HomeLens home_lens_("name", "description", "searchhint",
77+ HomeLens::MergeMode::OWNER_LENS);
78+ ThreeStaticTestLenses lenses_;
79+ unsigned int lens1_cat = 0;
80+ unsigned int lens2_cat = 1;
81+ // the lens is added as third, so must have cat == 2
82+ unsigned int apps_lens_cat = 2;
83+
84+ home_lens_.AddLenses(lenses_);
85+
86+ /*
87+ * lens1 -> 1 result
88+ * lens2 -> 3 results (no personal content)
89+ * lens3 -> 2 results (apps.lens)
90+ */
91+
92+ Lens::Ptr lens = lenses_.GetLensAtIndex(2);
93+ auto static_lens = dynamic_pointer_cast<StaticTestLens>(lens);
94+ static_lens->SetResultsBaseName("noapes"); // no exact match in apps lens
95+ static_lens->SetNumResults(2);
96+
97+ static_lens = dynamic_pointer_cast<StaticTestLens>(lenses_.GetLensAtIndex(0));
98+ static_lens->SetNumResults(1);
99+ static_lens = dynamic_pointer_cast<StaticTestLens>(lenses_.GetLensAtIndex(1));
100+ static_lens->SetNumResults(3);
101+ static_lens->SetProvidesPersonalResults(false);
102+
103+ bool order_changed = false;
104+ home_lens_.categories_reordered.connect([&order_changed] ()
105+ {
106+ order_changed = true;
107+ });
108+
109+ home_lens_.Search("ape");
110+
111+ bool finished = false;
112+ home_lens_.search_finished.connect([&finished] (Lens::Hints const& hints)
113+ {
114+ finished = true;
115+ });
116+ Utils::WaitUntil(finished);
117+
118+ /* Validate counts */
119+ EXPECT_EQ(home_lens_.results()->count(), 6); // 1+3+2 hits
120+ EXPECT_EQ(home_lens_.categories()->count(), 3); // 3 cats since we are merging categories by lens
121+ EXPECT_EQ(home_lens_.filters()->count(), 0); // We ignore filters deliberately currently
122+
123+ /* Validate the category order */
124+ auto order = home_lens_.GetCategoriesOrder();
125+
126+ /* The home lens includes applications lens but it doesn't contain exact
127+ * match, so can't be the first category */
128+ EXPECT_EQ(order.at(0), apps_lens_cat);
129+ EXPECT_EQ(order.at(1), lens1_cat);
130+ EXPECT_EQ(order.at(2), lens2_cat);
131+
132+ /* Plus the categories reordered should have been emitted */
133+ EXPECT_EQ(order_changed, true);
134+}
135+
136+TEST(TestHomeLens, TestNonPersonalCategoriesBeforeEmpty)
137+{
138+ HomeLens home_lens_("name", "description", "searchhint",
139+ HomeLens::MergeMode::OWNER_LENS);
140+ ThreeStaticTestLenses lenses_;
141+ unsigned int lens1_cat = 0;
142+ unsigned int lens2_cat = 1;
143+ // the lens is added as third, so must have cat == 2
144+ unsigned int apps_lens_cat = 2;
145+
146+ home_lens_.AddLenses(lenses_);
147+
148+ /*
149+ * lens1 -> 1 result
150+ * lens2 -> 3 results (no personal content)
151+ * lens3 -> 0 results (apps.lens)
152+ */
153+
154+ Lens::Ptr lens = lenses_.GetLensAtIndex(2);
155+ auto static_lens = dynamic_pointer_cast<StaticTestLens>(lens);
156+ static_lens->SetNumResults(0);
157+
158+ static_lens = dynamic_pointer_cast<StaticTestLens>(lenses_.GetLensAtIndex(0));
159+ static_lens->SetNumResults(1);
160+ static_lens = dynamic_pointer_cast<StaticTestLens>(lenses_.GetLensAtIndex(1));
161+ static_lens->SetNumResults(3);
162+ static_lens->SetProvidesPersonalResults(false);
163+
164+ bool order_changed = false;
165+ home_lens_.categories_reordered.connect([&order_changed] ()
166+ {
167+ order_changed = true;
168+ });
169+
170+ home_lens_.Search("ape");
171+
172+ bool finished = false;
173+ home_lens_.search_finished.connect([&finished] (Lens::Hints const& hints)
174+ {
175+ finished = true;
176+ });
177+ Utils::WaitUntil(finished);
178+
179+ /* Validate counts */
180+ EXPECT_EQ(home_lens_.results()->count(), 4); // 1+3 hits
181+ EXPECT_EQ(home_lens_.categories()->count(), 3); // 3 cats since we are merging categories by lens
182+ EXPECT_EQ(home_lens_.filters()->count(), 0); // We ignore filters deliberately currently
183+
184+ /* Validate the category order */
185+ auto order = home_lens_.GetCategoriesOrder();
186+
187+ EXPECT_EQ(order.at(0), lens1_cat);
188+ EXPECT_EQ(order.at(1), lens2_cat);
189+ EXPECT_EQ(order.at(2), apps_lens_cat);
190+
191+ /* Plus the categories reordered should have been emitted */
192+ EXPECT_EQ(order_changed, true);
193+}
194+
195 }