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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 } | 248 } |
249 | 249 |
250 // Assertions around id generation and usage. | 250 // Assertions around id generation and usage. |
251 TEST_F(ShelfModelTest, ShelfIDTests) { | 251 TEST_F(ShelfModelTest, ShelfIDTests) { |
252 // Get the next to use ID counter. | 252 // Get the next to use ID counter. |
253 ShelfID id = model_->next_id(); | 253 ShelfID id = model_->next_id(); |
254 | 254 |
255 // Calling this function multiple times does not change the returned ID. | 255 // Calling this function multiple times does not change the returned ID. |
256 EXPECT_EQ(model_->next_id(), id); | 256 EXPECT_EQ(model_->next_id(), id); |
257 | 257 |
258 // Check that when we reserve a value it will be the previously retrieved ID, | 258 // Adding another item to the list should produce a new ID. |
259 // but it will not change the item count and retrieving the next ID should | |
260 // produce something new. | |
261 EXPECT_EQ(model_->reserve_external_id(), id); | |
262 EXPECT_EQ(1, model_->item_count()); | |
263 ShelfID id2 = model_->next_id(); | |
264 EXPECT_NE(id2, id); | |
265 | |
266 // Adding another item to the list should also produce a new ID. | |
267 ShelfItem item; | 259 ShelfItem item; |
268 item.type = TYPE_APP; | 260 item.type = TYPE_APP; |
269 model_->Add(item); | 261 model_->Add(item); |
270 EXPECT_NE(model_->next_id(), id2); | 262 EXPECT_NE(model_->next_id(), id); |
271 } | 263 } |
272 | 264 |
273 // This verifies that converting an existing item into a lower weight category | 265 // This verifies that converting an existing item into a lower weight category |
274 // (e.g. shortcut to running but not pinned app) will move it to the proper | 266 // (e.g. shortcut to running but not pinned app) will move it to the proper |
275 // location. See crbug.com/248769. | 267 // location. See crbug.com/248769. |
276 TEST_F(ShelfModelTest, CorrectMoveItemsWhenStateChange) { | 268 TEST_F(ShelfModelTest, CorrectMoveItemsWhenStateChange) { |
277 // The first item is the app list and last item is the browser. | 269 // The first item is the app list and last item is the browser. |
278 ShelfItem browser_shortcut; | 270 ShelfItem browser_shortcut; |
279 browser_shortcut.type = TYPE_BROWSER_SHORTCUT; | 271 browser_shortcut.type = TYPE_BROWSER_SHORTCUT; |
280 int browser_shortcut_index = model_->Add(browser_shortcut); | 272 int browser_shortcut_index = model_->Add(browser_shortcut); |
(...skipping 12 matching lines...) Expand all Loading... |
293 | 285 |
294 // Now change the type of the second item and make sure that it is moving | 286 // Now change the type of the second item and make sure that it is moving |
295 // behind the shortcuts. | 287 // behind the shortcuts. |
296 item.type = TYPE_APP; | 288 item.type = TYPE_APP; |
297 model_->Set(app2_index, item); | 289 model_->Set(app2_index, item); |
298 | 290 |
299 // The item should have moved in front of the app launcher. | 291 // The item should have moved in front of the app launcher. |
300 EXPECT_EQ(TYPE_APP, model_->items()[4].type); | 292 EXPECT_EQ(TYPE_APP, model_->items()[4].type); |
301 } | 293 } |
302 | 294 |
| 295 // Test conversion between ShelfID and application [launch] ids. |
| 296 TEST_F(ShelfModelTest, IdentifierConversion) { |
| 297 const std::string app_id1("app_id1"); |
| 298 const std::string launch_id("launch_id"); |
| 299 const ShelfID unknown_shelf_id = 123; |
| 300 |
| 301 // Expect kInvalidShelfID and empty app ids for input not found in the model. |
| 302 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(std::string())); |
| 303 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(app_id1)); |
| 304 EXPECT_EQ(kInvalidShelfID, |
| 305 model_->GetShelfIDForAppIDAndLaunchID(app_id1, std::string())); |
| 306 EXPECT_EQ(kInvalidShelfID, |
| 307 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); |
| 308 EXPECT_TRUE(model_->GetAppIDForShelfID(kInvalidShelfID).empty()); |
| 309 EXPECT_TRUE(model_->GetAppIDForShelfID(unknown_shelf_id).empty()); |
| 310 |
| 311 // Add an example app with an app id and a launch id. |
| 312 ShelfItem item; |
| 313 item.type = TYPE_PINNED_APP; |
| 314 item.app_launch_id = AppLaunchId(app_id1, launch_id); |
| 315 const ShelfID assigned_shelf_id1 = model_->next_id(); |
| 316 const int index = model_->Add(item); |
| 317 |
| 318 // Ensure the item ids can be found and converted as expected. |
| 319 EXPECT_NE(kInvalidShelfID, assigned_shelf_id1); |
| 320 EXPECT_EQ(assigned_shelf_id1, model_->GetShelfIDForAppID(app_id1)); |
| 321 EXPECT_EQ(assigned_shelf_id1, |
| 322 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); |
| 323 EXPECT_EQ(app_id1, model_->GetAppIDForShelfID(assigned_shelf_id1)); |
| 324 |
| 325 // Removing the example app should again yield invalid ids. |
| 326 model_->RemoveItemAt(index); |
| 327 EXPECT_EQ(kInvalidShelfID, model_->GetShelfIDForAppID(app_id1)); |
| 328 EXPECT_EQ(kInvalidShelfID, |
| 329 model_->GetShelfIDForAppIDAndLaunchID(app_id1, launch_id)); |
| 330 EXPECT_TRUE(model_->GetAppIDForShelfID(assigned_shelf_id1).empty()); |
| 331 |
| 332 // Add an example app with a different app id and no launch id. |
| 333 const std::string app_id2("app_id2"); |
| 334 item.app_launch_id = AppLaunchId(app_id2); |
| 335 const ShelfID assigned_shelf_id2 = model_->next_id(); |
| 336 model_->Add(item); |
| 337 |
| 338 // Ensure the item ids can be found and converted as expected. |
| 339 EXPECT_NE(kInvalidShelfID, assigned_shelf_id2); |
| 340 EXPECT_NE(assigned_shelf_id1, assigned_shelf_id2); |
| 341 EXPECT_EQ(assigned_shelf_id2, model_->GetShelfIDForAppID(app_id2)); |
| 342 EXPECT_EQ(assigned_shelf_id2, |
| 343 model_->GetShelfIDForAppIDAndLaunchID(app_id2, std::string())); |
| 344 EXPECT_EQ(kInvalidShelfID, |
| 345 model_->GetShelfIDForAppIDAndLaunchID(app_id2, launch_id)); |
| 346 EXPECT_EQ(app_id2, model_->GetAppIDForShelfID(assigned_shelf_id2)); |
| 347 } |
| 348 |
| 349 // Test pinning and unpinning a closed app, and checking if it is pinned. |
| 350 TEST_F(ShelfModelTest, ClosedAppPinning) { |
| 351 const std::string app_id("app_id"); |
| 352 |
| 353 // Check the initial state. |
| 354 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 355 EXPECT_EQ(1, model_->item_count()); |
| 356 |
| 357 // Pinning a previously unknown app should add an item. |
| 358 model_->PinAppWithID(app_id); |
| 359 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
| 360 EXPECT_EQ(2, model_->item_count()); |
| 361 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); |
| 362 EXPECT_EQ(app_id, model_->items()[1].app_launch_id.app_id()); |
| 363 |
| 364 // Pinning the same app id again should have no change. |
| 365 model_->PinAppWithID(app_id); |
| 366 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
| 367 EXPECT_EQ(2, model_->item_count()); |
| 368 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[1].type); |
| 369 EXPECT_EQ(app_id, model_->items()[1].app_launch_id.app_id()); |
| 370 |
| 371 // Unpinning the app should remove the item. |
| 372 model_->UnpinAppWithID(app_id); |
| 373 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 374 EXPECT_EQ(1, model_->item_count()); |
| 375 |
| 376 // Unpinning the same app id again should have no change. |
| 377 model_->UnpinAppWithID(app_id); |
| 378 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 379 EXPECT_EQ(1, model_->item_count()); |
| 380 } |
| 381 |
| 382 // Test pinning and unpinning a running app, and checking if it is pinned. |
| 383 TEST_F(ShelfModelTest, RunningAppPinning) { |
| 384 const std::string app_id("app_id"); |
| 385 |
| 386 // Check the initial state. |
| 387 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 388 EXPECT_EQ(1, model_->item_count()); |
| 389 |
| 390 // Add an example running app. |
| 391 ShelfItem item; |
| 392 item.type = TYPE_APP; |
| 393 item.status = STATUS_RUNNING; |
| 394 item.app_launch_id = AppLaunchId(app_id); |
| 395 const ShelfID assigned_shelf_id = model_->next_id(); |
| 396 const int index = model_->Add(item); |
| 397 |
| 398 // The item should be added but not pinned. |
| 399 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 400 EXPECT_EQ(2, model_->item_count()); |
| 401 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
| 402 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); |
| 403 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); |
| 404 |
| 405 // Pinning the item should just change its type. |
| 406 model_->PinAppWithID(app_id); |
| 407 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
| 408 EXPECT_EQ(2, model_->item_count()); |
| 409 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); |
| 410 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); |
| 411 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); |
| 412 |
| 413 // Pinning the same app id again should have no change. |
| 414 model_->PinAppWithID(app_id); |
| 415 EXPECT_TRUE(model_->IsAppPinned(app_id)); |
| 416 EXPECT_EQ(2, model_->item_count()); |
| 417 EXPECT_EQ(TYPE_PINNED_APP, model_->items()[index].type); |
| 418 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); |
| 419 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); |
| 420 |
| 421 // Unpinning the app should leave the item unpinnned but running. |
| 422 model_->UnpinAppWithID(app_id); |
| 423 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 424 EXPECT_EQ(2, model_->item_count()); |
| 425 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
| 426 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); |
| 427 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); |
| 428 |
| 429 // Unpinning the same app id again should have no change. |
| 430 model_->UnpinAppWithID(app_id); |
| 431 EXPECT_FALSE(model_->IsAppPinned(app_id)); |
| 432 EXPECT_EQ(2, model_->item_count()); |
| 433 EXPECT_EQ(TYPE_APP, model_->items()[index].type); |
| 434 EXPECT_EQ(app_id, model_->items()[index].app_launch_id.app_id()); |
| 435 EXPECT_EQ(assigned_shelf_id, model_->items()[index].id); |
| 436 } |
| 437 |
303 } // namespace ash | 438 } // namespace ash |
OLD | NEW |