diff options
Diffstat (limited to 'chromium/ash/shelf/shelf_navigator_unittest.cc')
-rw-r--r-- | chromium/ash/shelf/shelf_navigator_unittest.cc | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/chromium/ash/shelf/shelf_navigator_unittest.cc b/chromium/ash/shelf/shelf_navigator_unittest.cc new file mode 100644 index 00000000000..c4f392d4abe --- /dev/null +++ b/chromium/ash/shelf/shelf_navigator_unittest.cc @@ -0,0 +1,195 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/shelf/shelf_navigator.h" + +#include "ash/ash_switches.h" +#include "ash/launcher/launcher.h" +#include "ash/launcher/launcher_types.h" +#include "ash/shelf/shelf_model.h" +#include "base/command_line.h" +#include "base/compiler_specific.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +namespace { + +class LauncherNavigatorTest : public testing::Test { + public: + LauncherNavigatorTest() {} + + protected: + virtual void SetUp() OVERRIDE { + model_.reset(new ShelfModel); + + // Add APP_LIST for test. + LauncherItem app_list; + app_list.type = TYPE_APP_LIST; + model_->Add(app_list); + + // Initially, applist launcher item is only created. + int total_num = model_->item_count(); + EXPECT_EQ(1, total_num); + EXPECT_TRUE(model_->items()[0].type == TYPE_APP_LIST); + + // Add BROWSER_SHORTCUT for test. + LauncherItem browser_shortcut; + browser_shortcut.type = TYPE_BROWSER_SHORTCUT; + model_->Add(browser_shortcut); + } + + void SetupMockShelfModel(LauncherItemType* types, + int types_length, + int focused_index) { + for (int i = 0; i < types_length; ++i) { + LauncherItem new_item; + new_item.type = types[i]; + new_item.status = + (types[i] == TYPE_PLATFORM_APP) ? STATUS_RUNNING : STATUS_CLOSED; + model_->Add(new_item); + } + + // Set the focused item. + if (focused_index >= 0) { + LauncherItem focused_item =model_->items()[focused_index]; + if (focused_item.type == TYPE_PLATFORM_APP) { + focused_item.status = STATUS_ACTIVE; + model_->Set(focused_index, focused_item); + } + } + } + + const ShelfModel& model() { return *model_.get(); } + + private: + scoped_ptr<ShelfModel> model_; + + DISALLOW_COPY_AND_ASSIGN(LauncherNavigatorTest); +}; + +class LauncherNavigatorLegacyShelfLayoutTest : public LauncherNavigatorTest { + public: + LauncherNavigatorLegacyShelfLayoutTest() : LauncherNavigatorTest() {} + + protected: + virtual void SetUp() OVERRIDE { + CommandLine::ForCurrentProcess()->AppendSwitch( + ash::switches::kAshDisableAlternateShelfLayout); + LauncherNavigatorTest::SetUp(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(LauncherNavigatorLegacyShelfLayoutTest); +}; + +} // namespace + +TEST_F(LauncherNavigatorTest, BasicCycle) { + // An app shortcut and three platform apps. + LauncherItemType types[] = { + TYPE_APP_SHORTCUT, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + // ShelfModel automatically adds BROWSER_SHORTCUT item at the + // beginning, so '3' refers the first TYPE_PLATFORM_APP item. + SetupMockShelfModel(types, arraysize(types), 3); + + EXPECT_EQ(4, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + + // Fourth one. It will skip the APP_SHORTCUT at the beginning of the list and + // the APP_LIST item which is automatically added at the end of items. + EXPECT_EQ(5, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorLegacyShelfLayoutTest, BasicCycle) { + // An app shortcut and three platform apps. + LauncherItemType types[] = { + TYPE_APP_SHORTCUT, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + // ShelfModel automatically adds BROWSER_SHORTCUT item at the + // beginning, so '2' refers the first TYPE_PLATFORM_APP item. + SetupMockShelfModel(types, arraysize(types), 2); + + EXPECT_EQ(3, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + + // Fourth one. It will skip the APP_SHORTCUT at the beginning of the list and + // the APP_LIST item which is automatically added at the end of items. + EXPECT_EQ(4, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorTest, WrapToBeginning) { + LauncherItemType types[] = { + TYPE_APP_SHORTCUT, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + SetupMockShelfModel(types, arraysize(types), 5); + + // Second one. It skips the APP_LIST item at the end of the list, + // wraps to the beginning, and skips BROWSER_SHORTCUT and APP_SHORTCUT + // at the beginning of the list. + EXPECT_EQ(3, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); +} + +TEST_F(LauncherNavigatorLegacyShelfLayoutTest, WrapToBeginning) { + LauncherItemType types[] = { + TYPE_APP_SHORTCUT, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + SetupMockShelfModel(types, arraysize(types), 4); + + // Second one. It skips the APP_LIST item at the end of the list, + // wraps to the beginning, and skips BROWSER_SHORTCUT and APP_SHORTCUT + // at the beginning of the list. + EXPECT_EQ(2, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); +} + +TEST_F(LauncherNavigatorTest, Empty) { + SetupMockShelfModel(NULL, 0, -1); + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorTest, SingleEntry) { + LauncherItemType type = TYPE_PLATFORM_APP; + SetupMockShelfModel(&type, 1, 2); + + // If there's only one item there and it is already active, there's no item + // to be activated next. + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorLegacyShelfLayoutTest, SingleEntry) { + LauncherItemType type = TYPE_PLATFORM_APP; + SetupMockShelfModel(&type, 1, 1); + + // If there's only one item there and it is already active, there's no item + // to be activated next. + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + EXPECT_EQ(-1, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorTest, NoActive) { + LauncherItemType types[] = { + TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + // Special case: no items are 'STATUS_ACTIVE'. + SetupMockShelfModel(types, arraysize(types), -1); + + // If there are no active status, pick the first running item as a fallback. + EXPECT_EQ(2, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + EXPECT_EQ(2, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +TEST_F(LauncherNavigatorLegacyShelfLayoutTest, NoActive) { + LauncherItemType types[] = { + TYPE_PLATFORM_APP, TYPE_PLATFORM_APP, + }; + // Special case: no items are 'STATUS_ACTIVE'. + SetupMockShelfModel(types, arraysize(types), -1); + + // If there are no active status, pick the first running item as a fallback. + EXPECT_EQ(1, GetNextActivatedItemIndex(model(), CYCLE_FORWARD)); + EXPECT_EQ(1, GetNextActivatedItemIndex(model(), CYCLE_BACKWARD)); +} + +} // namespace ash |