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 10using ui::test::MockMotionEvent; 11 12namespace ui { 13namespace { 14 15const float kTouchX = 13.7f; 16const float kTouchY = 14.2f; 17 18GestureEventData 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 34bool 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 42bool 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 60class GestureEventDataPacketTest : public testing::Test {}; 61 62TEST_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 85TEST_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 98TEST_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