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