1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string>
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/compiler_specific.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace chromeos {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass KeyboardDrivenEventRewriterTest : public testing::Test {
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  KeyboardDrivenEventRewriterTest() {}
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~KeyboardDrivenEventRewriterTest() {}
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode,
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        int ui_flags,
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::EventType ui_type) {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::KeyEvent keyevent(ui_type, ui_keycode, ui_flags);
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    scoped_ptr<ui::Event> rewritten_event;
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ui::EventRewriteStatus status =
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        rewriter_.RewriteForTesting(keyevent, &rewritten_event);
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return base::StringPrintf(
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        "ui_flags=%d status=%d",
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        rewritten_event ? rewritten_event->flags() : keyevent.flags(),
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        status);
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string GetExpectedResultAsString(int ui_flags,
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::EventRewriteStatus status) {
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return base::StringPrintf("ui_flags=%d status=%u", ui_flags, status);
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  KeyboardDrivenEventRewriter rewriter_;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest);
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KeyboardDrivenEventRewriterTest, PassThrough) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ui::KeyboardCode ui_keycode;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int ui_flags;
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } kTests[] = {
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_NONE },
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_CONTROL_DOWN },
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_ALT_DOWN },
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_SHIFT_DOWN },
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN },
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_LEFT, ui::EF_NONE },
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN },
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RIGHT, ui::EF_NONE },
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN },
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_UP, ui::EF_NONE },
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_UP, ui::EF_CONTROL_DOWN },
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_DOWN, ui::EF_NONE },
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN },
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RETURN, ui::EF_NONE },
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN },
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags,
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::EVENT_REWRITE_CONTINUE),
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              GetRewrittenEventAsString(kTests[i].ui_keycode,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        kTests[i].ui_flags,
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::ET_KEY_PRESSED))
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    << "Test case " << i;
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KeyboardDrivenEventRewriterTest, Rewrite) {
91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  const int kModifierMask = ui::EF_SHIFT_DOWN;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ui::KeyboardCode ui_keycode;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int ui_flags;
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } kTests[] = {
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_LEFT, kModifierMask },
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RIGHT, kModifierMask },
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_UP, kModifierMask },
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_DOWN, kModifierMask },
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_RETURN, kModifierMask },
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    { ui::VKEY_F6, kModifierMask },
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE,
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::EVENT_REWRITE_REWRITTEN),
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              GetRewrittenEventAsString(kTests[i].ui_keycode,
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        kTests[i].ui_flags,
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                        ui::ET_KEY_PRESSED))
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    << "Test case " << i;
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace chromeos
116