1 // Copyright 2014 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 "base/basictypes.h" 6 #include "testing/gtest/include/gtest/gtest.h" 7 #include "ui/events/gesture_detection/gesture_event_data_packet.h" 8 #include "ui/events/test/mock_motion_event.h" 9 10 using ui::test::MockMotionEvent; 11 12 namespace ui { 13 namespace { 14 15 const float kTouchX = 13.7f; 16 const float kTouchY = 14.2f; 17 18 GestureEventData CreateGesture(EventType type) { 19 return GestureEventData(GestureEventDetails(type), 20 0, 21 MotionEvent::TOOL_TYPE_FINGER, 22 base::TimeTicks(), 23 kTouchX, 24 kTouchY, 25 kTouchX + 5.f, 26 kTouchY + 10.f, 27 1, 28 gfx::RectF(kTouchX - 1.f, kTouchY - 1.f, 2.f, 2.f), 29 EF_NONE); 30 } 31 32 } // namespace 33 34 bool GestureEquals(const GestureEventData& lhs, const GestureEventData& rhs) { 35 return lhs.type() == rhs.type() && 36 lhs.motion_event_id == rhs.motion_event_id && 37 lhs.primary_tool_type == rhs.primary_tool_type && 38 lhs.time == rhs.time && lhs.x == rhs.x && lhs.y == rhs.y && 39 lhs.raw_x == rhs.raw_x && lhs.raw_y == rhs.raw_y; 40 } 41 42 bool PacketEquals(const GestureEventDataPacket& lhs, 43 const GestureEventDataPacket& rhs) { 44 if (lhs.timestamp() != rhs.timestamp() || 45 lhs.gesture_count() != rhs.gesture_count() || 46 lhs.timestamp() != rhs.timestamp() || 47 lhs.gesture_source() != rhs.gesture_source() || 48 lhs.touch_location() != rhs.touch_location() || 49 lhs.raw_touch_location() != rhs.raw_touch_location()) 50 return false; 51 52 for (size_t i = 0; i < lhs.gesture_count(); ++i) { 53 if (!GestureEquals(lhs.gesture(i), rhs.gesture(i))) 54 return false; 55 } 56 57 return true; 58 } 59 60 class GestureEventDataPacketTest : public testing::Test {}; 61 62 TEST_F(GestureEventDataPacketTest, Basic) { 63 base::TimeTicks touch_time = base::TimeTicks::Now(); 64 65 GestureEventDataPacket packet; 66 EXPECT_EQ(0U, packet.gesture_count()); 67 EXPECT_EQ(GestureEventDataPacket::UNDEFINED, packet.gesture_source()); 68 69 packet = GestureEventDataPacket::FromTouch( 70 MockMotionEvent(MotionEvent::ACTION_DOWN, touch_time, kTouchX, kTouchY)); 71 EXPECT_TRUE(touch_time == packet.timestamp()); 72 EXPECT_EQ(0U, packet.gesture_count()); 73 EXPECT_EQ(gfx::PointF(kTouchX, kTouchY), packet.touch_location()); 74 75 for (size_t i = ET_GESTURE_TYPE_START; i < ET_GESTURE_TYPE_END; ++i) { 76 const EventType type = static_cast<EventType>(i); 77 GestureEventData gesture = CreateGesture(type); 78 packet.Push(gesture); 79 const size_t index = (i - ET_GESTURE_TYPE_START); 80 ASSERT_EQ(index + 1U, packet.gesture_count()); 81 EXPECT_TRUE(GestureEquals(gesture, packet.gesture(index))); 82 } 83 } 84 85 TEST_F(GestureEventDataPacketTest, Copy) { 86 GestureEventDataPacket packet0 = GestureEventDataPacket::FromTouch( 87 MockMotionEvent(MotionEvent::ACTION_UP)); 88 packet0.Push(CreateGesture(ET_GESTURE_TAP_DOWN)); 89 packet0.Push(CreateGesture(ET_GESTURE_SCROLL_BEGIN)); 90 91 GestureEventDataPacket packet1 = packet0; 92 EXPECT_TRUE(PacketEquals(packet0, packet1)); 93 94 packet0 = packet1; 95 EXPECT_TRUE(PacketEquals(packet1, packet0)); 96 } 97 98 TEST_F(GestureEventDataPacketTest, GestureSource) { 99 GestureEventDataPacket packet = GestureEventDataPacket::FromTouch( 100 MockMotionEvent(MotionEvent::ACTION_DOWN)); 101 EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_START, 102 packet.gesture_source()); 103 104 packet = GestureEventDataPacket::FromTouch( 105 MockMotionEvent(MotionEvent::ACTION_UP)); 106 EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_END, 107 packet.gesture_source()); 108 109 packet = GestureEventDataPacket::FromTouch( 110 MockMotionEvent(MotionEvent::ACTION_CANCEL)); 111 EXPECT_EQ(GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL, 112 packet.gesture_source()); 113 114 packet = GestureEventDataPacket::FromTouch( 115 MockMotionEvent(MotionEvent::ACTION_MOVE)); 116 EXPECT_EQ(GestureEventDataPacket::TOUCH_MOVE, packet.gesture_source()); 117 118 packet = GestureEventDataPacket::FromTouch( 119 MockMotionEvent(MotionEvent::ACTION_POINTER_DOWN)); 120 EXPECT_EQ(GestureEventDataPacket::TOUCH_START, packet.gesture_source()); 121 122 packet = GestureEventDataPacket::FromTouch( 123 MockMotionEvent(MotionEvent::ACTION_POINTER_UP)); 124 EXPECT_EQ(GestureEventDataPacket::TOUCH_END, packet.gesture_source()); 125 126 GestureEventData gesture = CreateGesture(ET_GESTURE_TAP); 127 packet = GestureEventDataPacket::FromTouchTimeout(gesture); 128 EXPECT_EQ(GestureEventDataPacket::TOUCH_TIMEOUT, packet.gesture_source()); 129 EXPECT_EQ(1U, packet.gesture_count()); 130 EXPECT_EQ(base::TimeTicks(), packet.timestamp()); 131 EXPECT_EQ(gfx::PointF(gesture.x, gesture.y), packet.touch_location()); 132 } 133 134 } // namespace ui 135