Home | History | Annotate | Download | only in gesture_detection
      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