1// Copyright 2013 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 <string>
6
7#include "base/basictypes.h"
8#include "base/compiler_specific.h"
9#include "base/strings/stringprintf.h"
10#include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h"
11#include "testing/gtest/include/gtest/gtest.h"
12#include "ui/events/event.h"
13
14namespace chromeos {
15
16class KeyboardDrivenEventRewriterTest : public testing::Test {
17 public:
18  KeyboardDrivenEventRewriterTest() {}
19
20  virtual ~KeyboardDrivenEventRewriterTest() {}
21
22 protected:
23  std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode,
24                                        int ui_flags,
25                                        ui::EventType ui_type) {
26    ui::KeyEvent keyevent(ui_type, ui_keycode, ui_flags);
27    scoped_ptr<ui::Event> rewritten_event;
28    ui::EventRewriteStatus status =
29        rewriter_.RewriteForTesting(keyevent, &rewritten_event);
30    return base::StringPrintf(
31        "ui_flags=%d status=%d",
32        rewritten_event ? rewritten_event->flags() : keyevent.flags(),
33        status);
34  }
35
36  std::string GetExpectedResultAsString(int ui_flags,
37                                        ui::EventRewriteStatus status) {
38    return base::StringPrintf("ui_flags=%d status=%u", ui_flags, status);
39  }
40
41  KeyboardDrivenEventRewriter rewriter_;
42
43 private:
44  DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest);
45};
46
47TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) {
48  struct {
49    ui::KeyboardCode ui_keycode;
50    int ui_flags;
51  } kTests[] = {
52    { ui::VKEY_A, ui::EF_NONE },
53    { ui::VKEY_A, ui::EF_CONTROL_DOWN },
54    { ui::VKEY_A, ui::EF_ALT_DOWN },
55    { ui::VKEY_A, ui::EF_SHIFT_DOWN },
56    { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
57    { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN },
58
59    { ui::VKEY_LEFT, ui::EF_NONE },
60    { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN },
61    { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
62
63    { ui::VKEY_RIGHT, ui::EF_NONE },
64    { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN },
65    { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
66
67    { ui::VKEY_UP, ui::EF_NONE },
68    { ui::VKEY_UP, ui::EF_CONTROL_DOWN },
69    { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
70
71    { ui::VKEY_DOWN, ui::EF_NONE },
72    { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN },
73    { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
74
75    { ui::VKEY_RETURN, ui::EF_NONE },
76    { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN },
77    { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN },
78  };
79
80  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
81    EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags,
82                                        ui::EVENT_REWRITE_CONTINUE),
83              GetRewrittenEventAsString(kTests[i].ui_keycode,
84                                        kTests[i].ui_flags,
85                                        ui::ET_KEY_PRESSED))
86    << "Test case " << i;
87  }
88}
89
90TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) {
91  const int kModifierMask = ui::EF_SHIFT_DOWN;
92
93  struct {
94    ui::KeyboardCode ui_keycode;
95    int ui_flags;
96  } kTests[] = {
97    { ui::VKEY_LEFT, kModifierMask },
98    { ui::VKEY_RIGHT, kModifierMask },
99    { ui::VKEY_UP, kModifierMask },
100    { ui::VKEY_DOWN, kModifierMask },
101    { ui::VKEY_RETURN, kModifierMask },
102    { ui::VKEY_F6, kModifierMask },
103  };
104
105  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
106    EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE,
107                                        ui::EVENT_REWRITE_REWRITTEN),
108              GetRewrittenEventAsString(kTests[i].ui_keycode,
109                                        kTests[i].ui_flags,
110                                        ui::ET_KEY_PRESSED))
111    << "Test case " << i;
112  }
113}
114
115}  // namespace chromeos
116