Home | History | Annotate | Download | only in input
      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 "content/common/input/gesture_event_stream_validator.h"
      6 
      7 #include "content/common/input/synthetic_web_input_event_builders.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 using blink::WebInputEvent;
     11 using blink::WebGestureEvent;
     12 
     13 namespace content {
     14 namespace {
     15 
     16 const blink::WebGestureDevice kDefaultGestureDevice =
     17     blink::WebGestureDeviceTouchscreen;
     18 
     19 blink::WebGestureEvent Build(WebInputEvent::Type type) {
     20   return SyntheticWebGestureEventBuilder::Build(type, kDefaultGestureDevice);
     21 }
     22 
     23 }  // namespace
     24 
     25 TEST(GestureEventStreamValidator, ValidScroll) {
     26   GestureEventStreamValidator validator;
     27   std::string error_msg;
     28   WebGestureEvent event;
     29 
     30   event = Build(WebInputEvent::GestureScrollBegin);
     31   EXPECT_TRUE(validator.Validate(event, &error_msg));
     32   EXPECT_TRUE(error_msg.empty());
     33 
     34   event = Build(WebInputEvent::GestureScrollUpdate);
     35   EXPECT_TRUE(validator.Validate(event, &error_msg));
     36   EXPECT_TRUE(error_msg.empty());
     37 
     38   event = Build(WebInputEvent::GestureScrollEnd);
     39   EXPECT_TRUE(validator.Validate(event, &error_msg));
     40   EXPECT_TRUE(error_msg.empty());
     41 }
     42 
     43 TEST(GestureEventStreamValidator, InvalidScroll) {
     44   GestureEventStreamValidator validator;
     45   std::string error_msg;
     46   WebGestureEvent event;
     47 
     48   // No preceding ScrollBegin.
     49   event = Build(WebInputEvent::GestureScrollUpdate);
     50   EXPECT_FALSE(validator.Validate(event, &error_msg));
     51   EXPECT_FALSE(error_msg.empty());
     52 
     53   // No preceding ScrollBegin.
     54   event = Build(WebInputEvent::GestureScrollEnd);
     55   EXPECT_FALSE(validator.Validate(event, &error_msg));
     56   EXPECT_FALSE(error_msg.empty());
     57 
     58   event = Build(WebInputEvent::GestureScrollBegin);
     59   EXPECT_TRUE(validator.Validate(event, &error_msg));
     60   EXPECT_TRUE(error_msg.empty());
     61 
     62   // Already scrolling.
     63   event = Build(WebInputEvent::GestureScrollBegin);
     64   EXPECT_FALSE(validator.Validate(event, &error_msg));
     65   EXPECT_FALSE(error_msg.empty());
     66 
     67   event = Build(WebInputEvent::GestureScrollEnd);
     68   EXPECT_TRUE(validator.Validate(event, &error_msg));
     69   EXPECT_TRUE(error_msg.empty());
     70 
     71   // Scroll already ended.
     72   event = Build(WebInputEvent::GestureScrollEnd);
     73   EXPECT_FALSE(validator.Validate(event, &error_msg));
     74   EXPECT_FALSE(error_msg.empty());
     75 }
     76 
     77 TEST(GestureEventStreamValidator, ValidFling) {
     78   GestureEventStreamValidator validator;
     79   std::string error_msg;
     80   WebGestureEvent event;
     81 
     82   event = Build(WebInputEvent::GestureScrollBegin);
     83   EXPECT_TRUE(validator.Validate(event, &error_msg));
     84   EXPECT_TRUE(error_msg.empty());
     85 
     86   event = Build(WebInputEvent::GestureFlingStart);
     87   EXPECT_TRUE(validator.Validate(event, &error_msg));
     88   EXPECT_TRUE(error_msg.empty());
     89 }
     90 
     91 TEST(GestureEventStreamValidator, InvalidFling) {
     92   GestureEventStreamValidator validator;
     93   std::string error_msg;
     94   WebGestureEvent event;
     95 
     96   // No preceding ScrollBegin.
     97   event = Build(WebInputEvent::GestureFlingStart);
     98   EXPECT_FALSE(validator.Validate(event, &error_msg));
     99   EXPECT_FALSE(error_msg.empty());
    100 }
    101 
    102 TEST(GestureEventStreamValidator, ValidPinch) {
    103   GestureEventStreamValidator validator;
    104   std::string error_msg;
    105   WebGestureEvent event;
    106 
    107   event = Build(WebInputEvent::GesturePinchBegin);
    108   EXPECT_TRUE(validator.Validate(event, &error_msg));
    109   EXPECT_TRUE(error_msg.empty());
    110 
    111   event = Build(WebInputEvent::GesturePinchUpdate);
    112   EXPECT_TRUE(validator.Validate(event, &error_msg));
    113   EXPECT_TRUE(error_msg.empty());
    114 
    115   event = Build(WebInputEvent::GesturePinchEnd);
    116   EXPECT_TRUE(validator.Validate(event, &error_msg));
    117   EXPECT_TRUE(error_msg.empty());
    118 }
    119 
    120 TEST(GestureEventStreamValidator, InvalidPinch) {
    121   GestureEventStreamValidator validator;
    122   std::string error_msg;
    123   WebGestureEvent event;
    124 
    125   // No preceding PinchBegin.
    126   event = Build(WebInputEvent::GesturePinchUpdate);
    127   EXPECT_FALSE(validator.Validate(event, &error_msg));
    128   EXPECT_FALSE(error_msg.empty());
    129 
    130   event = Build(WebInputEvent::GesturePinchBegin);
    131   EXPECT_TRUE(validator.Validate(event, &error_msg));
    132   EXPECT_TRUE(error_msg.empty());
    133 
    134   // ScrollBegin while pinching.
    135   event = Build(WebInputEvent::GestureScrollBegin);
    136   EXPECT_FALSE(validator.Validate(event, &error_msg));
    137   EXPECT_FALSE(error_msg.empty());
    138 
    139   // ScrollEnd while pinching.
    140   event = Build(WebInputEvent::GestureScrollEnd);
    141   EXPECT_FALSE(validator.Validate(event, &error_msg));
    142   EXPECT_FALSE(error_msg.empty());
    143 
    144   // Pinch already begun.
    145   event = Build(WebInputEvent::GesturePinchBegin);
    146   EXPECT_FALSE(validator.Validate(event, &error_msg));
    147   EXPECT_FALSE(error_msg.empty());
    148 
    149   event = Build(WebInputEvent::GesturePinchEnd);
    150   EXPECT_TRUE(validator.Validate(event, &error_msg));
    151   EXPECT_TRUE(error_msg.empty());
    152 
    153   // Pinch already ended.
    154   event = Build(WebInputEvent::GesturePinchEnd);
    155   EXPECT_FALSE(validator.Validate(event, &error_msg));
    156   EXPECT_FALSE(error_msg.empty());
    157 }
    158 
    159 TEST(GestureEventStreamValidator, ValidTap) {
    160   GestureEventStreamValidator validator;
    161   std::string error_msg;
    162   WebGestureEvent event;
    163 
    164   event = Build(WebInputEvent::GestureTapDown);
    165   EXPECT_TRUE(validator.Validate(event, &error_msg));
    166   EXPECT_TRUE(error_msg.empty());
    167 
    168   event = Build(WebInputEvent::GestureTapCancel);
    169   EXPECT_TRUE(validator.Validate(event, &error_msg));
    170   EXPECT_TRUE(error_msg.empty());
    171 
    172   event = Build(WebInputEvent::GestureTapDown);
    173   EXPECT_TRUE(validator.Validate(event, &error_msg));
    174   EXPECT_TRUE(error_msg.empty());
    175 
    176   event = Build(WebInputEvent::GestureTapUnconfirmed);
    177   EXPECT_TRUE(validator.Validate(event, &error_msg));
    178   EXPECT_TRUE(error_msg.empty());
    179 
    180   event = Build(WebInputEvent::GestureTapCancel);
    181   EXPECT_TRUE(validator.Validate(event, &error_msg));
    182   EXPECT_TRUE(error_msg.empty());
    183 
    184   // Tap and DoubleTap do not require a TapDown (unlike TapUnconfirmed and
    185   // TapCancel).
    186   event = Build(WebInputEvent::GestureTap);
    187   EXPECT_TRUE(validator.Validate(event, &error_msg));
    188   EXPECT_TRUE(error_msg.empty());
    189 
    190   event = Build(WebInputEvent::GestureDoubleTap);
    191   EXPECT_TRUE(validator.Validate(event, &error_msg));
    192   EXPECT_TRUE(error_msg.empty());
    193 }
    194 
    195 TEST(GestureEventStreamValidator, InvalidTap) {
    196   GestureEventStreamValidator validator;
    197   std::string error_msg;
    198   WebGestureEvent event;
    199 
    200   // No preceding TapDown.
    201   event = Build(WebInputEvent::GestureTapUnconfirmed);
    202   EXPECT_FALSE(validator.Validate(event, &error_msg));
    203   EXPECT_FALSE(error_msg.empty());
    204 
    205   event = Build(WebInputEvent::GestureTapCancel);
    206   EXPECT_FALSE(validator.Validate(event, &error_msg));
    207   EXPECT_FALSE(error_msg.empty());
    208 
    209   // TapDown already terminated.
    210   event = Build(WebInputEvent::GestureTapDown);
    211   EXPECT_TRUE(validator.Validate(event, &error_msg));
    212   EXPECT_TRUE(error_msg.empty());
    213 
    214   event = Build(WebInputEvent::GestureDoubleTap);
    215   EXPECT_TRUE(validator.Validate(event, &error_msg));
    216   EXPECT_TRUE(error_msg.empty());
    217 
    218   event = Build(WebInputEvent::GestureTapCancel);
    219   EXPECT_FALSE(validator.Validate(event, &error_msg));
    220   EXPECT_FALSE(error_msg.empty());
    221 
    222   // TapDown already terminated.
    223   event = Build(WebInputEvent::GestureTapDown);
    224   EXPECT_TRUE(validator.Validate(event, &error_msg));
    225   EXPECT_TRUE(error_msg.empty());
    226 
    227   event = Build(WebInputEvent::GestureTap);
    228   EXPECT_TRUE(validator.Validate(event, &error_msg));
    229   EXPECT_TRUE(error_msg.empty());
    230 
    231   event = Build(WebInputEvent::GestureTapCancel);
    232   EXPECT_FALSE(validator.Validate(event, &error_msg));
    233   EXPECT_FALSE(error_msg.empty());
    234 }
    235 
    236 }  // namespace content
    237