blob: 54a14b9909b32ba87c5a046bca4f918147a3c8e1 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/events/fuchsia/input_event_dispatcher.h"
#include <fuchsia/ui/input/cpp/fidl.h>
#include <memory>
#include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event.h"
#include "ui/events/fuchsia/input_event_dispatcher_delegate.h"
#include "ui/events/keycodes/dom/dom_key.h"
using fuchsia::ui::input::InputEvent;
using FuchsiaKeyboardEvent = fuchsia::ui::input::KeyboardEvent;
using FuchsiaPointerEvent = fuchsia::ui::input::PointerEvent;
namespace ui {
namespace {
class InputEventDispatcherTest : public testing::Test,
public InputEventDispatcherDelegate {
public:
InputEventDispatcherTest() : dispatcher_(this) {}
~InputEventDispatcherTest() override = default;
void DispatchEvent(Event* event) override {
DCHECK(!captured_event_);
captured_event_ = Event::Clone(*event);
}
protected:
InputEventDispatcher dispatcher_;
std::unique_ptr<ui::Event> captured_event_;
void ResetCapturedEvent() {
DCHECK(captured_event_);
captured_event_.reset();
}
private:
DISALLOW_COPY_AND_ASSIGN(InputEventDispatcherTest);
};
TEST_F(InputEventDispatcherTest, MouseEventButtons) {
// Left mouse button.
FuchsiaPointerEvent pointer_event;
pointer_event.x = 1;
pointer_event.y = 1;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::DOWN;
pointer_event.buttons = fuchsia::ui::input::kMouseButtonPrimary;
pointer_event.type = fuchsia::ui::input::PointerEventType::MOUSE;
InputEvent event;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_TRUE(captured_event_->AsMouseEvent()->IsLeftMouseButton());
ResetCapturedEvent();
// Right mouse button.
pointer_event.buttons = fuchsia::ui::input::kMouseButtonSecondary;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_TRUE(captured_event_->AsMouseEvent()->IsRightMouseButton());
ResetCapturedEvent();
// Middle mouse button.
pointer_event.buttons = fuchsia::ui::input::kMouseButtonTertiary;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_TRUE(captured_event_->AsMouseEvent()->IsMiddleMouseButton());
ResetCapturedEvent();
// Left mouse drag.
pointer_event.buttons = fuchsia::ui::input::kMouseButtonPrimary;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::MOVE;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_MOUSE_DRAGGED, captured_event_->type());
ResetCapturedEvent();
// Left mouse up.
pointer_event.buttons = fuchsia::ui::input::kMouseButtonPrimary;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::UP;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_MOUSE_RELEASED, captured_event_->type());
}
TEST_F(InputEventDispatcherTest, MouseMove) {
FuchsiaPointerEvent pointer_event;
pointer_event.x = 1.5;
pointer_event.y = 2.5;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::MOVE;
pointer_event.type = fuchsia::ui::input::PointerEventType::MOUSE;
InputEvent event;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(1.5, captured_event_->AsMouseEvent()->x());
EXPECT_EQ(2.5, captured_event_->AsMouseEvent()->y());
}
TEST_F(InputEventDispatcherTest, TouchLocation) {
FuchsiaPointerEvent pointer_event;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::DOWN;
pointer_event.type = fuchsia::ui::input::PointerEventType::TOUCH;
pointer_event.x = 1.5;
pointer_event.y = 2.5;
InputEvent event;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(1.5, captured_event_->AsTouchEvent()->x());
EXPECT_EQ(2.5, captured_event_->AsTouchEvent()->y());
}
TEST_F(InputEventDispatcherTest, TouchPointerIds) {
FuchsiaPointerEvent pointer_event;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::DOWN;
pointer_event.type = fuchsia::ui::input::PointerEventType::TOUCH;
pointer_event.pointer_id = 1;
InputEvent event;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_PRESSED, captured_event_->type());
EXPECT_EQ(1, captured_event_->AsTouchEvent()->pointer_details().id);
ResetCapturedEvent();
pointer_event.pointer_id = 2;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_PRESSED, captured_event_->type());
EXPECT_EQ(2, captured_event_->AsTouchEvent()->pointer_details().id);
}
TEST_F(InputEventDispatcherTest, TouchPhases) {
FuchsiaPointerEvent pointer_event;
pointer_event.x = 1;
pointer_event.y = 1;
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::DOWN;
pointer_event.type = fuchsia::ui::input::PointerEventType::TOUCH;
InputEvent event;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_PRESSED, captured_event_->type());
ResetCapturedEvent();
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::HOVER;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_PRESSED, captured_event_->type());
EXPECT_TRUE(captured_event_->AsTouchEvent()->hovering());
ResetCapturedEvent();
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::MOVE;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_MOVED, captured_event_->type());
ResetCapturedEvent();
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::CANCEL;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_CANCELLED, captured_event_->type());
ResetCapturedEvent();
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::UP;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_TOUCH_RELEASED, captured_event_->type());
ResetCapturedEvent();
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::ADD;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(nullptr, captured_event_.get());
pointer_event.phase = fuchsia::ui::input::PointerEventPhase::REMOVE;
event.set_pointer(pointer_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(nullptr, captured_event_.get());
}
TEST_F(InputEventDispatcherTest, KeyPhases) {
FuchsiaKeyboardEvent key_event;
key_event.hid_usage = 4; // Corresponds to pressing "a" on a US keyboard.
key_event.phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
InputEvent event;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
ResetCapturedEvent();
key_event.phase = fuchsia::ui::input::KeyboardEventPhase::REPEAT;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
ResetCapturedEvent();
key_event.phase = fuchsia::ui::input::KeyboardEventPhase::RELEASED;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_RELEASED, captured_event_->type());
ResetCapturedEvent();
key_event.phase = fuchsia::ui::input::KeyboardEventPhase::CANCELLED;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_RELEASED, captured_event_->type());
}
TEST_F(InputEventDispatcherTest, KeyModifiers) {
FuchsiaKeyboardEvent key_event;
key_event.hid_usage = 4; // Corresponds to pressing "a" on a US keyboard.
key_event.phase = fuchsia::ui::input::KeyboardEventPhase::PRESSED;
InputEvent event;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
EXPECT_EQ('a',
DomKey(captured_event_->AsKeyEvent()->GetDomKey()).ToCharacter());
EXPECT_EQ('a', captured_event_->AsKeyEvent()->GetCharacter());
ResetCapturedEvent();
key_event.modifiers = fuchsia::ui::input::kModifierShift;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
EXPECT_EQ('A',
DomKey(captured_event_->AsKeyEvent()->GetDomKey()).ToCharacter());
EXPECT_EQ('A', captured_event_->AsKeyEvent()->GetCharacter());
EXPECT_TRUE(captured_event_->IsShiftDown());
EXPECT_FALSE(captured_event_->IsControlDown());
EXPECT_FALSE(captured_event_->IsAltDown());
ResetCapturedEvent();
key_event.modifiers =
fuchsia::ui::input::kModifierShift | fuchsia::ui::input::kModifierControl;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
EXPECT_TRUE(captured_event_->IsShiftDown());
EXPECT_TRUE(captured_event_->IsControlDown());
EXPECT_FALSE(captured_event_->IsAltDown());
ResetCapturedEvent();
key_event.modifiers = fuchsia::ui::input::kModifierShift |
fuchsia::ui::input::kModifierControl |
fuchsia::ui::input::kModifierAlt;
event.set_keyboard(key_event);
dispatcher_.ProcessEvent(event);
EXPECT_EQ(ET_KEY_PRESSED, captured_event_->type());
EXPECT_EQ('A',
DomKey(captured_event_->AsKeyEvent()->GetDomKey()).ToCharacter());
EXPECT_TRUE(captured_event_->IsShiftDown());
EXPECT_TRUE(captured_event_->IsControlDown());
EXPECT_TRUE(captured_event_->IsAltDown());
}
} // namespace
} // namespace ui