146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/input/public/accelerator_manager.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/input/public/input_manager.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/test/athena_test_base.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace athena { 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace { 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const int kInvalidCommandId = -1; 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestHandler : public AcceleratorHandler { 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestHandler() : fired_command_id_(kInvalidCommandId), enabled_(true) {} 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~TestHandler() {} 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_enabled(bool enabled) { enabled_ = enabled; } 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int GetFiredCommandIdAndReset() { 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int fired = fired_command_id_; 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fired_command_id_ = kInvalidCommandId; 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return fired; 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // AcceleratorHandler: 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool IsCommandEnabled(int command_id) const OVERRIDE { 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return enabled_; 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool OnAcceleratorFired(int command_id, 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ui::Accelerator& accelerator) OVERRIDE { 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fired_command_id_ = command_id; 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int fired_command_id_; 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool enabled_; 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestHandler); 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace athena 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef test::AthenaTestBase InputManagerTest; 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(InputManagerTest, Basic) { 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) enum TestCommandId { 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_A, 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_B, 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_C, 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_D, 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_E, 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const AcceleratorData data[] = { 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_A, ui::EF_SHIFT_DOWN, COMMAND_A, AF_RESERVED}, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {TRIGGER_ON_RELEASE, ui::VKEY_B, ui::EF_SHIFT_DOWN, COMMAND_B, 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AF_RESERVED}, 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_C, ui::EF_SHIFT_DOWN, COMMAND_C, 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AF_RESERVED | AF_DEBUG}, 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_D, ui::EF_SHIFT_DOWN, COMMAND_D, 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AF_RESERVED | AF_NON_AUTO_REPEATABLE}, 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_E, ui::EF_SHIFT_DOWN, COMMAND_E, AF_NONE}, 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AcceleratorManager* accelerator_manager = 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InputManager::Get()->GetAcceleratorManager(); 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestHandler test_handler; 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) accelerator_manager->RegisterAccelerators( 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) data, arraysize(data), &test_handler); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(root_window()); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_NONE); 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Trigger on press. 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(COMMAND_A, test_handler.GetFiredCommandIdAndReset()); 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.ReleaseKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Trigger on release. 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_B, ui::EF_SHIFT_DOWN); 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.ReleaseKey(ui::VKEY_B, ui::EF_SHIFT_DOWN); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(COMMAND_B, test_handler.GetFiredCommandIdAndReset()); 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Disable command. 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_handler.set_enabled(false); 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test_handler.set_enabled(true); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(COMMAND_A, test_handler.GetFiredCommandIdAndReset()); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Debug accelerators. 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager->SetDebugAcceleratorsEnabled(false); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_C, ui::EF_SHIFT_DOWN); 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager->SetDebugAcceleratorsEnabled(true); 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_C, ui::EF_SHIFT_DOWN); 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(COMMAND_C, test_handler.GetFiredCommandIdAndReset()); 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_manager->SetDebugAcceleratorsEnabled(false); 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Non auto repeatable 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_D, ui::EF_SHIFT_DOWN); 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(COMMAND_D, test_handler.GetFiredCommandIdAndReset()); 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_D, ui::EF_SHIFT_DOWN | ui::EF_IS_REPEAT); 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(oshima): Add scenario where the key event is consumed by 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // an app. 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) generator.PressKey(ui::VKEY_E, ui::EF_SHIFT_DOWN); 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(COMMAND_E, test_handler.GetFiredCommandIdAndReset()); 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace athena 120