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