1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "athena/input/public/accelerator_manager.h" 6 7#include "athena/input/public/input_manager.h" 8#include "athena/test/athena_test_base.h" 9#include "ui/events/test/event_generator.h" 10 11namespace athena { 12namespace { 13 14const int kInvalidCommandId = -1; 15 16class TestHandler : public AcceleratorHandler { 17 public: 18 TestHandler() : fired_command_id_(kInvalidCommandId), enabled_(true) {} 19 virtual ~TestHandler() {} 20 21 void set_enabled(bool enabled) { enabled_ = enabled; } 22 23 int GetFiredCommandIdAndReset() { 24 int fired = fired_command_id_; 25 fired_command_id_ = kInvalidCommandId; 26 return fired; 27 } 28 29 private: 30 // AcceleratorHandler: 31 virtual bool IsCommandEnabled(int command_id) const OVERRIDE { 32 return enabled_; 33 } 34 virtual bool OnAcceleratorFired(int command_id, 35 const ui::Accelerator& accelerator) OVERRIDE { 36 fired_command_id_ = command_id; 37 return true; 38 } 39 40 int fired_command_id_; 41 bool enabled_; 42 43 DISALLOW_COPY_AND_ASSIGN(TestHandler); 44}; 45 46} // namespace athena 47 48typedef test::AthenaTestBase InputManagerTest; 49 50TEST_F(InputManagerTest, Basic) { 51 enum TestCommandId { 52 COMMAND_A, 53 COMMAND_B, 54 COMMAND_C, 55 COMMAND_D, 56 COMMAND_E, 57 }; 58 const AcceleratorData data[] = { 59 {TRIGGER_ON_PRESS, ui::VKEY_A, ui::EF_SHIFT_DOWN, COMMAND_A, AF_RESERVED}, 60 {TRIGGER_ON_RELEASE, ui::VKEY_B, ui::EF_SHIFT_DOWN, COMMAND_B, 61 AF_RESERVED}, 62 {TRIGGER_ON_PRESS, ui::VKEY_C, ui::EF_SHIFT_DOWN, COMMAND_C, 63 AF_RESERVED | AF_DEBUG}, 64 {TRIGGER_ON_PRESS, ui::VKEY_D, ui::EF_SHIFT_DOWN, COMMAND_D, 65 AF_RESERVED | AF_NON_AUTO_REPEATABLE}, 66 {TRIGGER_ON_PRESS, ui::VKEY_E, ui::EF_SHIFT_DOWN, COMMAND_E, AF_NONE}, 67 }; 68 AcceleratorManager* accelerator_manager = 69 InputManager::Get()->GetAcceleratorManager(); 70 TestHandler test_handler; 71 accelerator_manager->RegisterAccelerators( 72 data, arraysize(data), &test_handler); 73 74 ui::test::EventGenerator generator(root_window()); 75 generator.PressKey(ui::VKEY_A, ui::EF_NONE); 76 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 77 78 // Trigger on press. 79 generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 80 EXPECT_EQ(COMMAND_A, test_handler.GetFiredCommandIdAndReset()); 81 generator.ReleaseKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 82 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 83 84 // Trigger on release. 85 generator.PressKey(ui::VKEY_B, ui::EF_SHIFT_DOWN); 86 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 87 generator.ReleaseKey(ui::VKEY_B, ui::EF_SHIFT_DOWN); 88 EXPECT_EQ(COMMAND_B, test_handler.GetFiredCommandIdAndReset()); 89 90 // Disable command. 91 test_handler.set_enabled(false); 92 generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 93 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 94 test_handler.set_enabled(true); 95 generator.PressKey(ui::VKEY_A, ui::EF_SHIFT_DOWN); 96 EXPECT_EQ(COMMAND_A, test_handler.GetFiredCommandIdAndReset()); 97 98 // Debug accelerators. 99 accelerator_manager->SetDebugAcceleratorsEnabled(false); 100 generator.PressKey(ui::VKEY_C, ui::EF_SHIFT_DOWN); 101 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 102 accelerator_manager->SetDebugAcceleratorsEnabled(true); 103 generator.PressKey(ui::VKEY_C, ui::EF_SHIFT_DOWN); 104 EXPECT_EQ(COMMAND_C, test_handler.GetFiredCommandIdAndReset()); 105 accelerator_manager->SetDebugAcceleratorsEnabled(false); 106 107 // Non auto repeatable 108 generator.PressKey(ui::VKEY_D, ui::EF_SHIFT_DOWN); 109 EXPECT_EQ(COMMAND_D, test_handler.GetFiredCommandIdAndReset()); 110 generator.PressKey(ui::VKEY_D, ui::EF_SHIFT_DOWN | ui::EF_IS_REPEAT); 111 EXPECT_EQ(kInvalidCommandId, test_handler.GetFiredCommandIdAndReset()); 112 113 // TODO(oshima): Add scenario where the key event is consumed by 114 // an app. 115 generator.PressKey(ui::VKEY_E, ui::EF_SHIFT_DOWN); 116 EXPECT_EQ(COMMAND_E, test_handler.GetFiredCommandIdAndReset()); 117} 118 119} // namespace athena 120