| // Copyright 2014 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 <stddef.h> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/events/gesture_detection/gesture_event_data_packet.h" |
| #include "ui/events/test/motion_event_test_utils.h" |
| |
| using ui::test::MockMotionEvent; |
| |
| namespace ui { |
| namespace { |
| |
| const float kTouchX = 13.7f; |
| const float kTouchY = 14.2f; |
| const uint32_t uniqueTouchEventId = 1234U; |
| |
| GestureEventData CreateGesture(EventType type) { |
| return GestureEventData(GestureEventDetails(type), |
| 0, |
| MotionEvent::TOOL_TYPE_FINGER, |
| base::TimeTicks(), |
| kTouchX, |
| kTouchY, |
| kTouchX + 5.f, |
| kTouchY + 10.f, |
| 1, |
| gfx::RectF(kTouchX - 1.f, kTouchY - 1.f, 2.f, 2.f), |
| EF_NONE, |
| uniqueTouchEventId); |
| } |
| |
| } // namespace |
| |
| bool GestureEqualsExceptForTouchId(const GestureEventData& lhs, |
| const GestureEventData& rhs) { |
| return lhs.type() == rhs.type() && |
| lhs.motion_event_id == rhs.motion_event_id && |
| lhs.primary_tool_type == rhs.primary_tool_type && |
| lhs.time == rhs.time && lhs.x == rhs.x && lhs.y == rhs.y && |
| lhs.raw_x == rhs.raw_x && lhs.raw_y == rhs.raw_y; |
| } |
| |
| bool PacketEquals(const GestureEventDataPacket& lhs, |
| const GestureEventDataPacket& rhs) { |
| if (lhs.timestamp() != rhs.timestamp() || |
| lhs.gesture_count() != rhs.gesture_count() || |
| lhs.timestamp() != rhs.timestamp() || |
| lhs.gesture_source() != rhs.gesture_source() || |
| lhs.touch_location() != rhs.touch_location() || |
| lhs.raw_touch_location() != rhs.raw_touch_location() || |
| lhs.unique_touch_event_id() != rhs.unique_touch_event_id()) |
| return false; |
| |
| for (size_t i = 0; i < lhs.gesture_count(); ++i) { |
| if (!GestureEqualsExceptForTouchId(lhs.gesture(i), rhs.gesture(i))) |
| return false; |
| if (lhs.gesture(i).unique_touch_event_id != |
| rhs.gesture(i).unique_touch_event_id) |
| return false; |
| } |
| |
| return true; |
| } |
| |
| class GestureEventDataPacketTest : public testing::Test {}; |
| |
| TEST_F(GestureEventDataPacketTest, Basic) { |
| base::TimeTicks touch_time = base::TimeTicks::Now(); |
| |
| GestureEventDataPacket packet; |
| EXPECT_EQ(0U, packet.gesture_count()); |
| EXPECT_EQ(GestureEventDataPacket::UNDEFINED, packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_DOWN, touch_time, kTouchX, kTouchY)); |
| EXPECT_TRUE(touch_time == packet.timestamp()); |
| EXPECT_EQ(0U, packet.gesture_count()); |
| EXPECT_EQ(gfx::PointF(kTouchX, kTouchY), packet.touch_location()); |
| |
| for (size_t i = ET_GESTURE_TYPE_START; i < ET_GESTURE_TYPE_END; ++i) { |
| const EventType type = static_cast<EventType>(i); |
| GestureEventData gesture = CreateGesture(type); |
| packet.Push(gesture); |
| const size_t index = (i - ET_GESTURE_TYPE_START); |
| ASSERT_EQ(index + 1U, packet.gesture_count()); |
| EXPECT_TRUE(GestureEqualsExceptForTouchId(gesture, packet.gesture(index))); |
| EXPECT_EQ(packet.unique_touch_event_id(), |
| packet.gesture(index).unique_touch_event_id); |
| } |
| } |
| |
| TEST_F(GestureEventDataPacketTest, Copy) { |
| GestureEventDataPacket packet0 = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_UP)); |
| packet0.Push(CreateGesture(ET_GESTURE_TAP_DOWN)); |
| packet0.Push(CreateGesture(ET_GESTURE_SCROLL_BEGIN)); |
| |
| GestureEventDataPacket packet1 = packet0; |
| EXPECT_TRUE(PacketEquals(packet0, packet1)); |
| |
| packet0 = packet1; |
| EXPECT_TRUE(PacketEquals(packet1, packet0)); |
| } |
| |
| TEST_F(GestureEventDataPacketTest, GestureSource) { |
| GestureEventDataPacket packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_DOWN)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_START, |
| packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_UP)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_END, |
| packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_CANCEL)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL, |
| packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_MOVE)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_MOVE, packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_POINTER_DOWN)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_START, packet.gesture_source()); |
| |
| packet = GestureEventDataPacket::FromTouch( |
| MockMotionEvent(MotionEvent::ACTION_POINTER_UP)); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_END, packet.gesture_source()); |
| |
| GestureEventData gesture = CreateGesture(ET_GESTURE_TAP); |
| packet = GestureEventDataPacket::FromTouchTimeout(gesture); |
| EXPECT_EQ(GestureEventDataPacket::TOUCH_TIMEOUT, packet.gesture_source()); |
| EXPECT_EQ(1U, packet.gesture_count()); |
| EXPECT_EQ(base::TimeTicks(), packet.timestamp()); |
| EXPECT_EQ(gfx::PointF(gesture.x, gesture.y), packet.touch_location()); |
| } |
| |
| } // namespace ui |