blob: d5d563e8750bf0f3f615546f725c782295099c22 [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 <fuchsia/ui/input/cpp/fidl.h>
#include <fuchsia/ui/pointerinjector/cpp/fidl.h>
#include <gtest/gtest.h>
#include "src/ui/scenic/lib/input/helper.h"
namespace lib_ui_input_tests {
namespace {
static const glm::mat3 kIdentity{};
static constexpr uint32_t kDeviceId = 0;
using Phase = fuchsia::ui::pointerinjector::EventPhase;
using DeviceType = fuchsia::ui::pointerinjector::DeviceType;
// Convert event to internal representation, then to gfx.
std::vector<fuchsia::ui::input::PointerEvent> ConvertPointerEvent(
const fuchsia::ui::pointerinjector::Event& event, uint64_t trace_id = 0) {
// Default viewport.
scenic_impl::input::Viewport viewport;
viewport.extents = scenic_impl::input::Extents({{{0.f, 0.f}, {10.f, 10.f}}});
viewport.context_from_viewport_transform = kIdentity;
// To intermediate representation.
std::vector<scenic_impl::input::InternalPointerEvent> intermediate =
scenic_impl::input::PointerInjectorEventToInternalPointerEvent(event, kDeviceId, viewport, 1,
2);
// To output fidl type.
std::vector<fuchsia::ui::input::PointerEvent> output;
for (auto& internal_event : intermediate) {
output.push_back(scenic_impl::input::InternalPointerEventToGfxPointerEvent(
internal_event, kIdentity, fuchsia::ui::input::PointerEventType::TOUCH, trace_id));
}
return output;
}
TEST(PointerEventConversionTest, ReversePointerTraceHACK) {
const float high = -3.40282e+38;
const float low = 2.22222e+06;
const trace_flow_id_t trace_id = scenic_impl::input::PointerTraceHACK(high, low);
const auto [rhigh, rlow] = scenic_impl::input::ReversePointerTraceHACK(trace_id);
EXPECT_EQ(rhigh, high);
EXPECT_EQ(rlow, low);
}
TEST(PointerEventConversionTest, Add) {
fuchsia::ui::pointerinjector::Event event;
event.set_timestamp(1);
{
fuchsia::ui::pointerinjector::PointerSample pointer_sample;
pointer_sample.set_pointer_id(2);
pointer_sample.set_position_in_viewport({3, 4});
pointer_sample.set_phase(Phase::ADD);
fuchsia::ui::pointerinjector::Data data;
data.set_pointer_sample(std::move(pointer_sample));
event.set_data(std::move(data));
}
std::vector<fuchsia::ui::input::PointerEvent> results = ConvertPointerEvent(event);
ASSERT_EQ(results.size(), 2u);
EXPECT_EQ(results[0].phase, fuchsia::ui::input::PointerEventPhase::ADD);
EXPECT_EQ(results[0].device_id, kDeviceId);
EXPECT_EQ(results[0].event_time, 1u);
EXPECT_EQ(results[0].pointer_id, 2u);
EXPECT_EQ(results[0].x, 3);
EXPECT_EQ(results[0].y, 4);
EXPECT_EQ(results[1].phase, fuchsia::ui::input::PointerEventPhase::DOWN);
EXPECT_EQ(results[1].device_id, kDeviceId);
EXPECT_EQ(results[1].event_time, 1u);
EXPECT_EQ(results[1].pointer_id, 2u);
EXPECT_EQ(results[1].x, 3);
EXPECT_EQ(results[1].y, 4);
}
TEST(PointerEventConversionTest, Change) {
fuchsia::ui::pointerinjector::Event event;
event.set_timestamp(1);
{
fuchsia::ui::pointerinjector::PointerSample pointer_sample;
pointer_sample.set_pointer_id(2);
pointer_sample.set_position_in_viewport({3, 4});
pointer_sample.set_phase(Phase::CHANGE);
fuchsia::ui::pointerinjector::Data data;
data.set_pointer_sample(std::move(pointer_sample));
event.set_data(std::move(data));
}
std::vector<fuchsia::ui::input::PointerEvent> results = ConvertPointerEvent(event);
ASSERT_EQ(results.size(), 1u);
EXPECT_EQ(results[0].phase, fuchsia::ui::input::PointerEventPhase::MOVE);
EXPECT_EQ(results[0].device_id, kDeviceId);
EXPECT_EQ(results[0].event_time, 1u);
EXPECT_EQ(results[0].pointer_id, 2u);
EXPECT_EQ(results[0].x, 3);
EXPECT_EQ(results[0].y, 4);
}
TEST(PointerEventConversionTest, Remove) {
fuchsia::ui::pointerinjector::Event event;
event.set_timestamp(1);
{
fuchsia::ui::pointerinjector::PointerSample pointer_sample;
pointer_sample.set_pointer_id(2);
pointer_sample.set_position_in_viewport({3, 4});
pointer_sample.set_phase(Phase::REMOVE);
fuchsia::ui::pointerinjector::Data data;
data.set_pointer_sample(std::move(pointer_sample));
event.set_data(std::move(data));
}
std::vector<fuchsia::ui::input::PointerEvent> results = ConvertPointerEvent(event);
ASSERT_EQ(results.size(), 2u);
EXPECT_EQ(results[0].phase, fuchsia::ui::input::PointerEventPhase::UP);
EXPECT_EQ(results[0].device_id, kDeviceId);
EXPECT_EQ(results[0].event_time, 1u);
EXPECT_EQ(results[0].pointer_id, 2u);
EXPECT_EQ(results[0].x, 3);
EXPECT_EQ(results[0].y, 4);
EXPECT_EQ(results[1].phase, fuchsia::ui::input::PointerEventPhase::REMOVE);
EXPECT_EQ(results[1].device_id, kDeviceId);
EXPECT_EQ(results[1].event_time, 1u);
EXPECT_EQ(results[1].pointer_id, 2u);
EXPECT_EQ(results[1].x, 3);
EXPECT_EQ(results[1].y, 4);
}
TEST(PointerEventConversionTest, Cancel) {
fuchsia::ui::pointerinjector::Event event;
event.set_timestamp(1);
{
fuchsia::ui::pointerinjector::PointerSample pointer_sample;
pointer_sample.set_pointer_id(2);
pointer_sample.set_position_in_viewport({3, 4});
pointer_sample.set_phase(Phase::CANCEL);
fuchsia::ui::pointerinjector::Data data;
data.set_pointer_sample(std::move(pointer_sample));
event.set_data(std::move(data));
}
std::vector<fuchsia::ui::input::PointerEvent> results = ConvertPointerEvent(event);
ASSERT_EQ(results.size(), 1u);
EXPECT_EQ(results[0].phase, fuchsia::ui::input::PointerEventPhase::CANCEL);
EXPECT_EQ(results[0].device_id, kDeviceId);
EXPECT_EQ(results[0].event_time, 1u);
EXPECT_EQ(results[0].pointer_id, 2u);
EXPECT_EQ(results[0].x, 3);
EXPECT_EQ(results[0].y, 4);
}
TEST(PointerEventConversionTest, TraceFlowId) {
constexpr uint32_t device_id = 0;
fuchsia::ui::pointerinjector::Event event;
event.set_timestamp(1);
{
fuchsia::ui::pointerinjector::PointerSample pointer_sample;
pointer_sample.set_pointer_id(2);
pointer_sample.set_position_in_viewport({3, 4});
pointer_sample.set_phase(Phase::ADD);
fuchsia::ui::pointerinjector::Data data;
data.set_pointer_sample(std::move(pointer_sample));
event.set_data(std::move(data));
}
// Create a trace id with some high bits and low bits.
constexpr float high = 7;
constexpr float low = 5;
const uint64_t trace_id = scenic_impl::input::PointerTraceHACK(high, low);
std::vector<fuchsia::ui::input::PointerEvent> results = ConvertPointerEvent(event, trace_id);
ASSERT_EQ(results.size(), 2u);
EXPECT_EQ(results[0].radius_minor, low);
EXPECT_EQ(results[0].radius_major, high);
EXPECT_EQ(results[1].radius_minor, low);
EXPECT_EQ(results[1].radius_major, high);
}
} // namespace
} // namespace lib_ui_input_tests