diff options
author | yusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-10 10:09:27 +0000 |
---|---|---|
committer | yusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-10 10:09:27 +0000 |
commit | 095c803aeb2c54363e59e2e943c035794ce6217b (patch) | |
tree | fd704e88d28ba2bdc343a15e0b2ee667011f5025 /ui/base/accelerators | |
parent | f829cc36cb9ba1f042055aef3786ea2a859ef2bc (diff) | |
download | chromium_src-095c803aeb2c54363e59e2e943c035794ce6217b.zip chromium_src-095c803aeb2c54363e59e2e943c035794ce6217b.tar.gz chromium_src-095c803aeb2c54363e59e2e943c035794ce6217b.tar.bz2 |
Add ui/base/accelerators/accelerator_manager_unittest.cc.
Since I'll add some features to the manager for crbug.com/116950, _unittest.cc is needed.
BUG=116950
TEST=ui_unittests
Review URL: http://codereview.chromium.org/9651029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126026 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/base/accelerators')
-rw-r--r-- | ui/base/accelerators/accelerator_manager_unittest.cc | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/ui/base/accelerators/accelerator_manager_unittest.cc b/ui/base/accelerators/accelerator_manager_unittest.cc new file mode 100644 index 0000000..0193692 --- /dev/null +++ b/ui/base/accelerators/accelerator_manager_unittest.cc @@ -0,0 +1,183 @@ +// Copyright (c) 2012 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 "ui/base/accelerators/accelerator_manager.h" + +#include "base/compiler_specific.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/events.h" +#include "ui/base/keycodes/keyboard_codes.h" + +namespace ui { +namespace test { + +namespace { + +class TestTarget : public AcceleratorTarget { + public: + TestTarget() : accelerator_pressed_count_(0) {} + virtual ~TestTarget() {} + + int accelerator_pressed_count() const { + return accelerator_pressed_count_; + } + + void set_accelerator_pressed_count(int accelerator_pressed_count) { + accelerator_pressed_count_ = accelerator_pressed_count; + } + + // Overridden from AcceleratorTarget: + virtual bool AcceleratorPressed(const Accelerator& accelerator) OVERRIDE; + virtual bool CanHandleAccelerators() const OVERRIDE; + + private: + int accelerator_pressed_count_; + + DISALLOW_COPY_AND_ASSIGN(TestTarget); +}; + +bool TestTarget::AcceleratorPressed(const Accelerator& accelerator) { + ++accelerator_pressed_count_; + return true; +} + +bool TestTarget::CanHandleAccelerators() const { + return true; +} + +Accelerator GetAccelerator(KeyboardCode code, int mask) { + return Accelerator(code, mask & (1 << 0), mask & (1 << 1), mask & (1 << 2)); +} + +} // namespace + +class AcceleratorManagerTest : public testing::Test { + public: + AcceleratorManagerTest() {} + virtual ~AcceleratorManagerTest() {} + + AcceleratorManager manager_; +}; + +TEST_F(AcceleratorManagerTest, Register) { + const Accelerator accelerator_a(VKEY_A, false, false, false); + TestTarget target; + manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, + &target); + + // The registered accelerator is processed. + EXPECT_TRUE(manager_.Process(accelerator_a)); + EXPECT_EQ(1, target.accelerator_pressed_count()); +} + +TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { + const Accelerator accelerator_a(VKEY_A, false, false, false); + TestTarget target1; + manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, + &target1); + TestTarget target2; + manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, + &target2); + + // If multiple targets are registered with the same accelerator, the target + // registered later processes the accelerator. + EXPECT_TRUE(manager_.Process(accelerator_a)); + EXPECT_EQ(0, target1.accelerator_pressed_count()); + EXPECT_EQ(1, target2.accelerator_pressed_count()); +} + +TEST_F(AcceleratorManagerTest, Unregister) { + const Accelerator accelerator_a(VKEY_A, false, false, false); + TestTarget target; + manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, + &target); + const Accelerator accelerator_b(VKEY_B, false, false, false); + manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, + &target); + + // Unregistering a different accelerator does not affect the other + // accelerator. + manager_.Unregister(accelerator_b, &target); + EXPECT_TRUE(manager_.Process(accelerator_a)); + EXPECT_EQ(1, target.accelerator_pressed_count()); + + // The unregistered accelerator is no longer processed. + target.set_accelerator_pressed_count(0); + manager_.Unregister(accelerator_a, &target); + EXPECT_FALSE(manager_.Process(accelerator_a)); + EXPECT_EQ(0, target.accelerator_pressed_count()); +} + +TEST_F(AcceleratorManagerTest, UnregisterAll) { + const Accelerator accelerator_a(VKEY_A, false, false, false); + TestTarget target1; + manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, + &target1); + const Accelerator accelerator_b(VKEY_B, false, false, false); + manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, + &target1); + const Accelerator accelerator_c(VKEY_C, false, false, false); + TestTarget target2; + manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority, + &target2); + manager_.UnregisterAll(&target1); + + // All the accelerators registered for |target1| are no longer processed. + EXPECT_FALSE(manager_.Process(accelerator_a)); + EXPECT_FALSE(manager_.Process(accelerator_b)); + EXPECT_EQ(0, target1.accelerator_pressed_count()); + + // UnregisterAll with a different target does not affect the other target. + EXPECT_TRUE(manager_.Process(accelerator_c)); + EXPECT_EQ(1, target2.accelerator_pressed_count()); +} + +TEST_F(AcceleratorManagerTest, Process) { + TestTarget target; + + // Test all 2*2*2 cases (shift/control/alt = on/off). + for (int mask = 0; mask < 2 * 2 * 2; ++mask) { + Accelerator accelerator(GetAccelerator(VKEY_A, mask)); + const string16 text = accelerator.GetShortcutText(); + manager_.Register(accelerator, AcceleratorManager::kNormalPriority, + &target); + + // The registered accelerator is processed. + const int last_count = target.accelerator_pressed_count(); + EXPECT_TRUE(manager_.Process(accelerator)) << text; + EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << text; + + // The non-registered accelerators are not processed. + accelerator.set_type(ET_UNKNOWN); + EXPECT_FALSE(manager_.Process(accelerator)) << text; // different type + accelerator.set_type(ET_TRANSLATED_KEY_PRESS); + EXPECT_FALSE(manager_.Process(accelerator)) << text; // different type + accelerator.set_type(ET_KEY_RELEASED); + EXPECT_FALSE(manager_.Process(accelerator)) << text; // different type + accelerator.set_type(ET_TRANSLATED_KEY_RELEASE); + EXPECT_FALSE(manager_.Process(accelerator)) << text; // different type + + EXPECT_FALSE(manager_.Process(GetAccelerator(VKEY_UNKNOWN, mask))) + << text; // different vkey + EXPECT_FALSE(manager_.Process(GetAccelerator(VKEY_B, mask))) + << text; // different vkey + EXPECT_FALSE(manager_.Process(GetAccelerator(VKEY_SHIFT, mask))) + << text; // different vkey + + for (int test_mask = 0; test_mask < 2 * 2 * 2; ++test_mask) { + if (test_mask == mask) + continue; + const Accelerator test_accelerator(GetAccelerator(VKEY_A, test_mask)); + const string16 test_text = test_accelerator.GetShortcutText(); + EXPECT_FALSE(manager_.Process(test_accelerator)) + << text << ", " << test_text; // different modifiers + } + + EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << text; + manager_.UnregisterAll(&target); + } +} + +} // namespace test +} // namespace ui |