OLD | NEW |
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 "ash/shelf/shelf_model.h" | 5 #include "ash/shelf/shelf_model.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "ash/shelf/shelf_model_observer.h" | 10 #include "ash/shelf/shelf_model_observer.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 ShelfModelTest() {} | 62 ShelfModelTest() {} |
63 ~ShelfModelTest() override {} | 63 ~ShelfModelTest() override {} |
64 | 64 |
65 void SetUp() override { | 65 void SetUp() override { |
66 model_.reset(new ShelfModel); | 66 model_.reset(new ShelfModel); |
67 observer_.reset(new TestShelfModelObserver); | 67 observer_.reset(new TestShelfModelObserver); |
68 EXPECT_EQ(0, model_->item_count()); | 68 EXPECT_EQ(0, model_->item_count()); |
69 | 69 |
70 ShelfItem item; | 70 ShelfItem item; |
71 item.type = TYPE_APP_LIST; | 71 item.type = TYPE_APP_LIST; |
| 72 item.id = ShelfID("AppListId"); |
72 model_->Add(item); | 73 model_->Add(item); |
73 EXPECT_EQ(1, model_->item_count()); | 74 EXPECT_EQ(1, model_->item_count()); |
74 | 75 |
75 model_->AddObserver(observer_.get()); | 76 model_->AddObserver(observer_.get()); |
76 } | 77 } |
77 | 78 |
78 void TearDown() override { | 79 void TearDown() override { |
79 observer_.reset(); | 80 observer_.reset(); |
80 model_.reset(); | 81 model_.reset(); |
81 } | 82 } |
82 | 83 |
83 std::unique_ptr<ShelfModel> model_; | 84 std::unique_ptr<ShelfModel> model_; |
84 std::unique_ptr<TestShelfModelObserver> observer_; | 85 std::unique_ptr<TestShelfModelObserver> observer_; |
85 | 86 |
86 private: | 87 private: |
87 DISALLOW_COPY_AND_ASSIGN(ShelfModelTest); | 88 DISALLOW_COPY_AND_ASSIGN(ShelfModelTest); |
88 }; | 89 }; |
89 | 90 |
90 TEST_F(ShelfModelTest, BasicAssertions) { | 91 TEST_F(ShelfModelTest, BasicAssertions) { |
91 // Add an item. | 92 // Add an item. |
92 ShelfItem item; | 93 ShelfItem item1; |
93 item.type = TYPE_PINNED_APP; | 94 item1.id = ShelfID("item1"); |
94 int index = model_->Add(item); | 95 item1.type = TYPE_PINNED_APP; |
| 96 int index = model_->Add(item1); |
95 EXPECT_EQ(2, model_->item_count()); | 97 EXPECT_EQ(2, model_->item_count()); |
96 EXPECT_EQ("added=1", observer_->StateStringAndClear()); | 98 EXPECT_EQ("added=1", observer_->StateStringAndClear()); |
97 | 99 |
98 // Change to a platform app item. | 100 // Change to a platform app item. |
99 ShelfID original_id = model_->items()[index].id; | 101 ShelfID original_id = model_->items()[index].id; |
100 item.type = TYPE_APP; | 102 item1.type = TYPE_APP; |
101 model_->Set(index, item); | 103 model_->Set(index, item1); |
102 EXPECT_EQ(original_id, model_->items()[index].id); | 104 EXPECT_EQ(original_id, model_->items()[index].id); |
103 EXPECT_EQ("changed=1", observer_->StateStringAndClear()); | 105 EXPECT_EQ("changed=1", observer_->StateStringAndClear()); |
104 EXPECT_EQ(TYPE_APP, model_->items()[index].type); | 106 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
105 | 107 |
106 // Remove the item. | 108 // Remove the item. |
107 model_->RemoveItemAt(index); | 109 model_->RemoveItemAt(index); |
108 EXPECT_EQ(1, model_->item_count()); | 110 EXPECT_EQ(1, model_->item_count()); |
109 EXPECT_EQ("removed=1", observer_->StateStringAndClear()); | 111 EXPECT_EQ("removed=1", observer_->StateStringAndClear()); |
110 | 112 |
111 // Add an app item. | 113 // Add an app item. |
112 item.type = TYPE_PINNED_APP; | 114 ShelfItem item2; |
113 index = model_->Add(item); | 115 item2.id = ShelfID("item2"); |
| 116 item2.type = TYPE_PINNED_APP; |
| 117 index = model_->Add(item2); |
114 observer_->StateStringAndClear(); | 118 observer_->StateStringAndClear(); |
115 | 119 |
116 // Change everything. | 120 // Change the item type. |
117 model_->Set(index, item); | 121 item2.type = TYPE_APP; |
| 122 model_->Set(index, item2); |
118 EXPECT_EQ("changed=1", observer_->StateStringAndClear()); | 123 EXPECT_EQ("changed=1", observer_->StateStringAndClear()); |
119 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); | 124 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
120 | 125 |
121 // Add another item. | 126 // Add another item. |
122 item.type = TYPE_PINNED_APP; | 127 ShelfItem item3; |
123 model_->Add(item); | 128 item3.id = ShelfID("item3"); |
| 129 item3.type = TYPE_PINNED_APP; |
| 130 model_->Add(item3); |
124 observer_->StateStringAndClear(); | 131 observer_->StateStringAndClear(); |
125 | 132 |
126 // Move the second to the first. | 133 // Move the second to the first. |
127 model_->Move(1, 0); | 134 model_->Move(1, 0); |
128 EXPECT_EQ("moved=1", observer_->StateStringAndClear()); | 135 EXPECT_EQ("moved=1", observer_->StateStringAndClear()); |
129 | 136 |
130 // And back. | 137 // And back. |
131 model_->Move(0, 1); | 138 model_->Move(0, 1); |
132 EXPECT_EQ("moved=1", observer_->StateStringAndClear()); | 139 EXPECT_EQ("moved=1", observer_->StateStringAndClear()); |
133 | 140 |
134 // Verifies all the items get unique ids. | 141 // Verifies all the items get unique ids. |
135 std::set<ShelfID> ids; | 142 std::set<ShelfID> ids; |
136 for (int i = 0; i < model_->item_count(); ++i) | 143 for (int i = 0; i < model_->item_count(); ++i) |
137 ids.insert(model_->items()[i].id); | 144 ids.insert(model_->items()[i].id); |
138 EXPECT_EQ(model_->item_count(), static_cast<int>(ids.size())); | 145 EXPECT_EQ(model_->item_count(), static_cast<int>(ids.size())); |
139 } | 146 } |
140 | 147 |
141 // Assertions around where items are added. | 148 // Assertions around where items are added. |
142 TEST_F(ShelfModelTest, AddIndices) { | 149 TEST_F(ShelfModelTest, AddIndices) { |
143 // Insert browser short cut at index 1. | 150 // Insert browser short cut at index 1. |
144 ShelfItem browser_shortcut; | 151 ShelfItem browser_shortcut; |
| 152 browser_shortcut.id = ShelfID("browser"); |
145 browser_shortcut.type = TYPE_BROWSER_SHORTCUT; | 153 browser_shortcut.type = TYPE_BROWSER_SHORTCUT; |
146 int browser_shortcut_index = model_->Add(browser_shortcut); | 154 int browser_shortcut_index = model_->Add(browser_shortcut); |
147 EXPECT_EQ(1, browser_shortcut_index); | 155 EXPECT_EQ(1, browser_shortcut_index); |
148 | 156 |
149 // App items should be after the browser shortcut. | 157 // App items should be after the browser shortcut. |
150 ShelfItem item; | 158 ShelfItem item; |
151 item.type = TYPE_APP; | 159 item.type = TYPE_APP; |
| 160 item.id = ShelfID("id1"); |
152 int platform_app_index1 = model_->Add(item); | 161 int platform_app_index1 = model_->Add(item); |
153 EXPECT_EQ(2, platform_app_index1); | 162 EXPECT_EQ(2, platform_app_index1); |
154 | 163 |
155 // Add another platform app item, it should follow first. | 164 // Add another platform app item, it should follow first. |
| 165 item.id = ShelfID("id2"); |
156 int platform_app_index2 = model_->Add(item); | 166 int platform_app_index2 = model_->Add(item); |
157 EXPECT_EQ(3, platform_app_index2); | 167 EXPECT_EQ(3, platform_app_index2); |
158 | 168 |
159 // TYPE_PINNED_APP priority is higher than TYPE_APP but same as | 169 // TYPE_PINNED_APP priority is higher than TYPE_APP but same as |
160 // TYPE_BROWSER_SHORTCUT. So TYPE_PINNED_APP is located after | 170 // TYPE_BROWSER_SHORTCUT. So TYPE_PINNED_APP is located after |
161 // TYPE_BROWSER_SHORTCUT. | 171 // TYPE_BROWSER_SHORTCUT. |
162 item.type = TYPE_PINNED_APP; | 172 item.type = TYPE_PINNED_APP; |
| 173 item.id = ShelfID("id3"); |
163 int app_shortcut_index1 = model_->Add(item); | 174 int app_shortcut_index1 = model_->Add(item); |
164 EXPECT_EQ(2, app_shortcut_index1); | 175 EXPECT_EQ(2, app_shortcut_index1); |
165 | 176 |
166 item.type = TYPE_PINNED_APP; | 177 item.type = TYPE_PINNED_APP; |
| 178 item.id = ShelfID("id4"); |
167 int app_shortcut_index2 = model_->Add(item); | 179 int app_shortcut_index2 = model_->Add(item); |
168 EXPECT_EQ(3, app_shortcut_index2); | 180 EXPECT_EQ(3, app_shortcut_index2); |
169 | 181 |
170 // Check that AddAt() figures out the correct indexes for app shortcuts. | 182 // Check that AddAt() figures out the correct indexes for app shortcuts. |
171 // TYPE_PINNED_APP and TYPE_BROWSER_SHORTCUT has the same weight. | 183 // TYPE_PINNED_APP and TYPE_BROWSER_SHORTCUT has the same weight. |
172 // So TYPE_PINNED_APP is located at index 0. And, TYPE_BROWSER_SHORTCUT is | 184 // So TYPE_PINNED_APP is located at index 0. And, TYPE_BROWSER_SHORTCUT is |
173 // located at index 1. | 185 // located at index 1. |
174 item.type = TYPE_PINNED_APP; | 186 item.type = TYPE_PINNED_APP; |
| 187 item.id = ShelfID("id5"); |
175 int app_shortcut_index3 = model_->AddAt(1, item); | 188 int app_shortcut_index3 = model_->AddAt(1, item); |
176 EXPECT_EQ(1, app_shortcut_index3); | 189 EXPECT_EQ(1, app_shortcut_index3); |
177 | 190 |
178 item.type = TYPE_PINNED_APP; | 191 item.type = TYPE_PINNED_APP; |
| 192 item.id = ShelfID("id6"); |
179 int app_shortcut_index4 = model_->AddAt(6, item); | 193 int app_shortcut_index4 = model_->AddAt(6, item); |
180 EXPECT_EQ(5, app_shortcut_index4); | 194 EXPECT_EQ(5, app_shortcut_index4); |
181 | 195 |
182 item.type = TYPE_PINNED_APP; | 196 item.type = TYPE_PINNED_APP; |
| 197 item.id = ShelfID("id7"); |
183 int app_shortcut_index5 = model_->AddAt(3, item); | 198 int app_shortcut_index5 = model_->AddAt(3, item); |
184 EXPECT_EQ(3, app_shortcut_index5); | 199 EXPECT_EQ(3, app_shortcut_index5); |
185 | 200 |
186 // Before there are any panels, no icons should be right aligned. | 201 // Before there are any panels, no icons should be right aligned. |
187 EXPECT_EQ(model_->item_count(), model_->FirstPanelIndex()); | 202 EXPECT_EQ(model_->item_count(), model_->FirstPanelIndex()); |
188 | 203 |
189 // Check that AddAt() figures out the correct indexes for apps and panels. | 204 // Check that AddAt() figures out the correct indexes for apps and panels. |
190 item.type = TYPE_APP; | 205 item.type = TYPE_APP; |
| 206 item.id = ShelfID("id8"); |
191 int platform_app_index3 = model_->AddAt(3, item); | 207 int platform_app_index3 = model_->AddAt(3, item); |
192 EXPECT_EQ(7, platform_app_index3); | 208 EXPECT_EQ(7, platform_app_index3); |
193 | 209 |
194 item.type = TYPE_APP_PANEL; | 210 item.type = TYPE_APP_PANEL; |
| 211 item.id = ShelfID("id9"); |
195 int app_panel_index1 = model_->AddAt(2, item); | 212 int app_panel_index1 = model_->AddAt(2, item); |
196 EXPECT_EQ(10, app_panel_index1); | 213 EXPECT_EQ(10, app_panel_index1); |
197 | 214 |
198 item.type = TYPE_APP; | 215 item.type = TYPE_APP; |
| 216 item.id = ShelfID("id10"); |
199 int platform_app_index4 = model_->AddAt(11, item); | 217 int platform_app_index4 = model_->AddAt(11, item); |
200 EXPECT_EQ(10, platform_app_index4); | 218 EXPECT_EQ(10, platform_app_index4); |
201 | 219 |
202 item.type = TYPE_APP_PANEL; | 220 item.type = TYPE_APP_PANEL; |
| 221 item.id = ShelfID("id11"); |
203 int app_panel_index2 = model_->AddAt(12, item); | 222 int app_panel_index2 = model_->AddAt(12, item); |
204 EXPECT_EQ(12, app_panel_index2); | 223 EXPECT_EQ(12, app_panel_index2); |
205 | 224 |
206 item.type = TYPE_APP; | 225 item.type = TYPE_APP; |
| 226 item.id = ShelfID("id12"); |
207 int platform_app_index5 = model_->AddAt(7, item); | 227 int platform_app_index5 = model_->AddAt(7, item); |
208 EXPECT_EQ(7, platform_app_index5); | 228 EXPECT_EQ(7, platform_app_index5); |
209 | 229 |
210 item.type = TYPE_APP_PANEL; | 230 item.type = TYPE_APP_PANEL; |
| 231 item.id = ShelfID("id13"); |
211 int app_panel_index3 = model_->AddAt(13, item); | 232 int app_panel_index3 = model_->AddAt(13, item); |
212 EXPECT_EQ(13, app_panel_index3); | 233 EXPECT_EQ(13, app_panel_index3); |
213 | 234 |
214 // Right aligned index should be the first app panel index. | 235 // Right aligned index should be the first app panel index. |
215 EXPECT_EQ(12, model_->FirstPanelIndex()); | 236 EXPECT_EQ(12, model_->FirstPanelIndex()); |
216 | 237 |
217 EXPECT_EQ(TYPE_BROWSER_SHORTCUT, model_->items()[2].type); | 238 EXPECT_EQ(TYPE_BROWSER_SHORTCUT, model_->items()[2].type); |
218 EXPECT_EQ(TYPE_APP_LIST, model_->items()[0].type); | 239 EXPECT_EQ(TYPE_APP_LIST, model_->items()[0].type); |
219 } | 240 } |
220 | 241 |
221 // Test that the indexes for the running applications are properly determined. | 242 // Test that the indexes for the running applications are properly determined. |
222 TEST_F(ShelfModelTest, FirstRunningAppIndex) { | 243 TEST_F(ShelfModelTest, FirstRunningAppIndex) { |
223 // Insert the browser shortcut at index 1 and check that the running | 244 // Insert the browser shortcut at index 1 and check that the running |
224 // application index would be behind it. | 245 // application index would be behind it. |
225 ShelfItem item; | 246 ShelfItem item; |
| 247 item.id = ShelfID("browser"); |
226 item.type = TYPE_BROWSER_SHORTCUT; | 248 item.type = TYPE_BROWSER_SHORTCUT; |
227 EXPECT_EQ(1, model_->Add(item)); | 249 EXPECT_EQ(1, model_->Add(item)); |
228 EXPECT_EQ(2, model_->FirstRunningAppIndex()); | 250 EXPECT_EQ(2, model_->FirstRunningAppIndex()); |
229 | 251 |
230 // Insert a panel application at the end and check that the running | 252 // Insert a panel application at the end and check that the running |
231 // application index would be at / before the application panel. | 253 // application index would be at / before the application panel. |
232 item.type = TYPE_APP_PANEL; | 254 item.type = TYPE_APP_PANEL; |
| 255 item.id = ShelfID("app panel"); |
233 EXPECT_EQ(2, model_->Add(item)); | 256 EXPECT_EQ(2, model_->Add(item)); |
234 EXPECT_EQ(2, model_->FirstRunningAppIndex()); | 257 EXPECT_EQ(2, model_->FirstRunningAppIndex()); |
235 | 258 |
236 // Insert an application shortcut and make sure that the running application | 259 // Insert an application shortcut and make sure that the running application |
237 // index would be behind it. | 260 // index would be behind it. |
238 item.type = TYPE_PINNED_APP; | 261 item.type = TYPE_PINNED_APP; |
| 262 item.id = ShelfID("pinned app"); |
239 EXPECT_EQ(2, model_->Add(item)); | 263 EXPECT_EQ(2, model_->Add(item)); |
240 EXPECT_EQ(3, model_->FirstRunningAppIndex()); | 264 EXPECT_EQ(3, model_->FirstRunningAppIndex()); |
241 | 265 |
242 // Insert a two app items and check the first running app index. | 266 // Insert a two app items and check the first running app index. |
243 item.type = TYPE_APP; | 267 item.type = TYPE_APP; |
| 268 item.id = ShelfID("app1"); |
244 EXPECT_EQ(3, model_->Add(item)); | 269 EXPECT_EQ(3, model_->Add(item)); |
245 EXPECT_EQ(3, model_->FirstRunningAppIndex()); | 270 EXPECT_EQ(3, model_->FirstRunningAppIndex()); |
| 271 item.id = ShelfID("app2"); |
246 EXPECT_EQ(4, model_->Add(item)); | 272 EXPECT_EQ(4, model_->Add(item)); |
247 EXPECT_EQ(3, model_->FirstRunningAppIndex()); | 273 EXPECT_EQ(3, model_->FirstRunningAppIndex()); |
248 } | 274 } |
249 | 275 |
250 // Assertions around id generation and usage. | 276 // Test item reordering on type/weight (eg. pinning) changes. crbug.com/248769. |
251 TEST_F(ShelfModelTest, ShelfIDTests) { | 277 TEST_F(ShelfModelTest, ReorderOnTypeChanges) { |
252 // Get the next to use ID counter. | 278 EXPECT_EQ(TYPE_APP_LIST, model_->items()[0].type); |
253 ShelfID id = model_->next_id(); | |
254 | 279 |
255 // Calling this function multiple times does not change the returned ID. | 280 // Add three pinned items. |
256 EXPECT_EQ(model_->next_id(), id); | 281 ShelfItem item1; |
| 282 item1.type = TYPE_PINNED_APP; |
| 283 item1.id = ShelfID("id1"); |
| 284 int app1_index = model_->Add(item1); |
| 285 EXPECT_EQ(1, app1_index); |
257 | 286 |
258 // Adding another item to the list should produce a new ID. | 287 ShelfItem item2; |
259 ShelfItem item; | 288 item2.type = TYPE_PINNED_APP; |
260 item.type = TYPE_APP; | 289 item2.id = ShelfID("id2"); |
261 model_->Add(item); | 290 int app2_index = model_->Add(item2); |
262 EXPECT_NE(model_->next_id(), id); | 291 EXPECT_EQ(2, app2_index); |
263 } | |
264 | 292 |
265 // This verifies that converting an existing item into a lower weight category | 293 ShelfItem item3; |
266 // (e.g. shortcut to running but not pinned app) will move it to the proper | 294 item3.type = TYPE_PINNED_APP; |
267 // location. See crbug.com/248769. | 295 item3.id = ShelfID("id3"); |
268 TEST_F(ShelfModelTest, CorrectMoveItemsWhenStateChange) { | 296 int app3_index = model_->Add(item3); |
269 // The first item is the app list and last item is the browser. | 297 EXPECT_EQ(3, app3_index); |
270 ShelfItem browser_shortcut; | |
271 browser_shortcut.type = TYPE_BROWSER_SHORTCUT; | |
272 int browser_shortcut_index = model_->Add(browser_shortcut); | |
273 EXPECT_EQ(TYPE_APP_LIST, model_->items()[0].type); | |
274 EXPECT_EQ(1, browser_shortcut_index); | |
275 | 298 |
276 // Add three shortcuts. They should all be moved between the two. | 299 // Unpinning an item moves it behind the shortcuts. |
277 ShelfItem item; | 300 EXPECT_EQ(item3.id, model_->items()[3].id); |
278 item.type = TYPE_PINNED_APP; | 301 item2.type = TYPE_APP; |
279 int app1_index = model_->Add(item); | 302 model_->Set(app2_index, item2); |
280 EXPECT_EQ(2, app1_index); | 303 EXPECT_EQ(item2.id, model_->items()[3].id); |
281 int app2_index = model_->Add(item); | |
282 EXPECT_EQ(3, app2_index); | |
283 int app3_index = model_->Add(item); | |
284 EXPECT_EQ(4, app3_index); | |
285 | |
286 // Now change the type of the second item and make sure that it is moving | |
287 // behind the shortcuts. | |
288 item.type = TYPE_APP; | |
289 model_->Set(app2_index, item); | |
290 | |
291 // The item should have moved in front of the app launcher. | |
292 EXPECT_EQ(TYPE_APP, model_->items()[4].type); | |
293 } | 304 } |
294 | 305 |
295 // Test conversion between ShelfID and application [launch] ids. | 306 // Test conversion between ShelfID and application [launch] ids. |
296 TEST_F(ShelfModelTest, IdentifierConversion) { | 307 TEST_F(ShelfModelTest, IdentifierConversion) { |
297 const std::string app_id1("app_id1"); | 308 const std::string app_id1("app_id1"); |
298 const std::string launch_id("launch_id"); | 309 const std::string launch_id("launch_id"); |
299 const ShelfID unknown_shelf_id = 123; | |
300 | 310 |
301 // Expect kInvalidShelfID and empty app ids for input not found in the model. | 311 // Expect empty ShelfIDs and app ids for input not found in the model. |
302 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(std::string())); | 312 EXPECT_TRUE(model_->GetShelfIDForAppID(std::string()).IsNull()); |
303 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(app_id1)); | 313 EXPECT_TRUE(model_->GetShelfIDForAppID(app_id1).IsNull()); |
304 EXPECT_EQ(kInvalidShelfID, | 314 EXPECT_TRUE( |
305 model_->GetShelfIDForAppIDAndLaunchID(app_id1, std::string())); | 315 model_->GetShelfIDForAppIDAndLaunchID(app_id1, std::string()).IsNull()); |
306 EXPECT_EQ(kInvalidShelfID, | 316 EXPECT_TRUE( |
307 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); | 317 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id).IsNull()); |
308 EXPECT_TRUE(model_->GetAppIDForShelfID(kInvalidShelfID).empty()); | 318 EXPECT_TRUE(model_->GetAppIDForShelfID(ShelfID()).empty()); |
309 EXPECT_TRUE(model_->GetAppIDForShelfID(unknown_shelf_id).empty()); | 319 EXPECT_TRUE(model_->GetAppIDForShelfID(ShelfID("foo")).empty()); |
310 | 320 |
311 // Add an example app with an app id and a launch id. | 321 // Add an example app with an app id and a launch id. |
312 ShelfItem item; | 322 ShelfItem item; |
313 item.type = TYPE_PINNED_APP; | 323 item.type = TYPE_PINNED_APP; |
314 item.app_launch_id = AppLaunchId(app_id1, launch_id); | 324 item.id = ShelfID(app_id1, launch_id); |
315 const ShelfID assigned_shelf_id1 = model_->next_id(); | |
316 const int index = model_->Add(item); | 325 const int index = model_->Add(item); |
317 | 326 |
318 // Ensure the item ids can be found and converted as expected. | 327 // Ensure the item ids can be found and converted as expected. |
319 EXPECT_NE(kInvalidShelfID, assigned_shelf_id1); | 328 EXPECT_EQ(item.id, model_->GetShelfIDForAppID(app_id1)); |
320 EXPECT_EQ(assigned_shelf_id1, model_->GetShelfIDForAppID(app_id1)); | 329 EXPECT_EQ(item.id, model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); |
321 EXPECT_EQ(assigned_shelf_id1, | 330 EXPECT_NE(item.id, |
322 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); | 331 model_->GetShelfIDForAppIDAndLaunchID(app_id1, std::string())); |
323 EXPECT_EQ(app_id1, model_->GetAppIDForShelfID(assigned_shelf_id1)); | 332 EXPECT_EQ(app_id1, model_->GetAppIDForShelfID(item.id)); |
324 | 333 |
325 // Removing the example app should again yield invalid ids. | 334 // Removing the example app should again yield invalid ids. |
326 model_->RemoveItemAt(index); | 335 model_->RemoveItemAt(index); |
327 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(app_id1)); | 336 EXPECT_TRUE(model_->GetShelfIDForAppID(app_id1).IsNull()); |
328 EXPECT_EQ(kInvalidShelfID, | 337 EXPECT_TRUE( |
329 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); | 338 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id).IsNull()); |
330 EXPECT_TRUE(model_->GetAppIDForShelfID(assigned_shelf_id1).empty()); | 339 EXPECT_TRUE(model_->GetAppIDForShelfID(item.id).empty()); |
331 | 340 |
332 // Add an example app with a different app id and no launch id. | 341 // Add an example app with a different app id and no launch id. |
333 const std::string app_id2("app_id2"); | 342 const std::string app_id2("app_id2"); |
334 item.app_launch_id = AppLaunchId(app_id2); | 343 item.id = ShelfID(app_id2); |
335 const ShelfID assigned_shelf_id2 = model_->next_id(); | |
336 model_->Add(item); | 344 model_->Add(item); |
337 | 345 |
338 // Ensure the item ids can be found and converted as expected. | 346 // Ensure the item ids can be found and converted as expected. |
339 EXPECT_NE(kInvalidShelfID, assigned_shelf_id2); | 347 EXPECT_EQ(item.id, model_->GetShelfIDForAppID(app_id2)); |
340 EXPECT_NE(assigned_shelf_id1, assigned_shelf_id2); | 348 EXPECT_EQ(item.id, |
341 EXPECT_EQ(assigned_shelf_id2, model_->GetShelfIDForAppID(app_id2)); | |
342 EXPECT_EQ(assigned_shelf_id2, | |
343 model_->GetShelfIDForAppIDAndLaunchID(app_id2, std::string())); | 349 model_->GetShelfIDForAppIDAndLaunchID(app_id2, std::string())); |
344 EXPECT_EQ(kInvalidShelfID, | 350 EXPECT_NE(item.id, model_->GetShelfIDForAppIDAndLaunchID(app_id2, launch_id)); |
345 model_->GetShelfIDForAppIDAndLaunchID(app_id2, launch_id)); | 351 EXPECT_EQ(app_id2, model_->GetAppIDForShelfID(item.id)); |
346 EXPECT_EQ(app_id2, model_->GetAppIDForShelfID(assigned_shelf_id2)); | |
347 } | 352 } |
348 | 353 |
349 // Test pinning and unpinning a closed app, and checking if it is pinned. | 354 // Test pinning and unpinning a closed app, and checking if it is pinned. |
350 TEST_F(ShelfModelTest, ClosedAppPinning) { | 355 TEST_F(ShelfModelTest, ClosedAppPinning) { |
351 const std::string app_id("app_id"); | 356 const std::string app_id("app_id"); |
352 | 357 |
353 // Check the initial state. | 358 // Check the initial state. |
354 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 359 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
355 EXPECT_EQ(1, model_->item_count()); | 360 EXPECT_EQ(1, model_->item_count()); |
356 | 361 |
357 // Pinning a previously unknown app should add an item. | 362 // Pinning a previously unknown app should add an item. |
358 model_->PinAppWithID(app_id); | 363 model_->PinAppWithID(app_id); |
359 EXPECT_TRUE(model_->IsAppPinned(app_id)); | 364 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
360 EXPECT_EQ(2, model_->item_count()); | 365 EXPECT_EQ(2, model_->item_count()); |
361 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); | 366 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); |
362 EXPECT_EQ(app_id, model_->items()[1].app_launch_id.app_id()); | 367 EXPECT_EQ(app_id, model_->items()[1].id.app_id); |
363 | 368 |
364 // Pinning the same app id again should have no change. | 369 // Pinning the same app id again should have no change. |
365 model_->PinAppWithID(app_id); | 370 model_->PinAppWithID(app_id); |
366 EXPECT_TRUE(model_->IsAppPinned(app_id)); | 371 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
367 EXPECT_EQ(2, model_->item_count()); | 372 EXPECT_EQ(2, model_->item_count()); |
368 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); | 373 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); |
369 EXPECT_EQ(app_id, model_->items()[1].app_launch_id.app_id()); | 374 EXPECT_EQ(app_id, model_->items()[1].id.app_id); |
370 | 375 |
371 // Unpinning the app should remove the item. | 376 // Unpinning the app should remove the item. |
372 model_->UnpinAppWithID(app_id); | 377 model_->UnpinAppWithID(app_id); |
373 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 378 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
374 EXPECT_EQ(1, model_->item_count()); | 379 EXPECT_EQ(1, model_->item_count()); |
375 | 380 |
376 // Unpinning the same app id again should have no change. | 381 // Unpinning the same app id again should have no change. |
377 model_->UnpinAppWithID(app_id); | 382 model_->UnpinAppWithID(app_id); |
378 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 383 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
379 EXPECT_EQ(1, model_->item_count()); | 384 EXPECT_EQ(1, model_->item_count()); |
380 } | 385 } |
381 | 386 |
382 // Test pinning and unpinning a running app, and checking if it is pinned. | 387 // Test pinning and unpinning a running app, and checking if it is pinned. |
383 TEST_F(ShelfModelTest, RunningAppPinning) { | 388 TEST_F(ShelfModelTest, RunningAppPinning) { |
384 const std::string app_id("app_id"); | 389 const std::string app_id("app_id"); |
385 | 390 |
386 // Check the initial state. | 391 // Check the initial state. |
387 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 392 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
388 EXPECT_EQ(1, model_->item_count()); | 393 EXPECT_EQ(1, model_->item_count()); |
389 | 394 |
390 // Add an example running app. | 395 // Add an example running app. |
391 ShelfItem item; | 396 ShelfItem item; |
392 item.type = TYPE_APP; | 397 item.type = TYPE_APP; |
393 item.status = STATUS_RUNNING; | 398 item.status = STATUS_RUNNING; |
394 item.app_launch_id = AppLaunchId(app_id); | 399 item.id = ShelfID(app_id); |
395 const ShelfID assigned_shelf_id = model_->next_id(); | |
396 const int index = model_->Add(item); | 400 const int index = model_->Add(item); |
397 | 401 |
398 // The item should be added but not pinned. | 402 // The item should be added but not pinned. |
399 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 403 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
400 EXPECT_EQ(2, model_->item_count()); | 404 EXPECT_EQ(2, model_->item_count()); |
401 EXPECT_EQ(TYPE_APP, model_->items()[index].type); | 405 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
402 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); | 406 EXPECT_EQ(item.id, model_->items()[index].id); |
403 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); | |
404 | 407 |
405 // Pinning the item should just change its type. | 408 // Pinning the item should just change its type. |
406 model_->PinAppWithID(app_id); | 409 model_->PinAppWithID(app_id); |
407 EXPECT_TRUE(model_->IsAppPinned(app_id)); | 410 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
408 EXPECT_EQ(2, model_->item_count()); | 411 EXPECT_EQ(2, model_->item_count()); |
409 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); | 412 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); |
410 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); | 413 EXPECT_EQ(item.id, model_->items()[index].id); |
411 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); | |
412 | 414 |
413 // Pinning the same app id again should have no change. | 415 // Pinning the same app id again should have no change. |
414 model_->PinAppWithID(app_id); | 416 model_->PinAppWithID(app_id); |
415 EXPECT_TRUE(model_->IsAppPinned(app_id)); | 417 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
416 EXPECT_EQ(2, model_->item_count()); | 418 EXPECT_EQ(2, model_->item_count()); |
417 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); | 419 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); |
418 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); | 420 EXPECT_EQ(item.id, model_->items()[index].id); |
419 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); | |
420 | 421 |
421 // Unpinning the app should leave the item unpinnned but running. | 422 // Unpinning the app should leave the item unpinnned but running. |
422 model_->UnpinAppWithID(app_id); | 423 model_->UnpinAppWithID(app_id); |
423 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 424 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
424 EXPECT_EQ(2, model_->item_count()); | 425 EXPECT_EQ(2, model_->item_count()); |
425 EXPECT_EQ(TYPE_APP, model_->items()[index].type); | 426 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
426 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); | 427 EXPECT_EQ(item.id, model_->items()[index].id); |
427 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); | |
428 | 428 |
429 // Unpinning the same app id again should have no change. | 429 // Unpinning the same app id again should have no change. |
430 model_->UnpinAppWithID(app_id); | 430 model_->UnpinAppWithID(app_id); |
431 EXPECT_FALSE(model_->IsAppPinned(app_id)); | 431 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
432 EXPECT_EQ(2, model_->item_count()); | 432 EXPECT_EQ(2, model_->item_count()); |
433 EXPECT_EQ(TYPE_APP, model_->items()[index].type); | 433 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
434 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); | 434 EXPECT_EQ(item.id, model_->items()[index].id); |
435 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); | |
436 } | 435 } |
437 | 436 |
438 } // namespace ash | 437 } // namespace ash |
OLD | NEW |