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
10using blink::WebInputEvent;
11using blink::WebGestureEvent;
12
13namespace content {
14namespace {
15
16const blink::WebGestureDevice kDefaultGestureDevice =
17    blink::WebGestureDeviceTouchscreen;
18
19blink::WebGestureEvent Build(WebInputEvent::Type type) {
20  return SyntheticWebGestureEventBuilder::Build(type, kDefaultGestureDevice);
21}
22
23}  // namespace
24
25TEST(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
43TEST(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
77TEST(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
91TEST(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
102TEST(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
120TEST(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
159TEST(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
195TEST(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