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.
5 #include "content/common/input/touch_event_stream_validator.h"
7 #include "content/common/input/synthetic_web_input_event_builders.h"
8 #include "content/common/input/web_touch_event_traits.h"
9 #include "testing/gtest/include/gtest/gtest.h"
11 using blink::WebInputEvent;
12 using blink::WebTouchEvent;
13 using blink::WebTouchPoint;
17 TEST(TouchEventStreamValidator, ValidTouchStream) {
18 TouchEventStreamValidator validator;
19 SyntheticWebTouchEvent event;
20 std::string error_msg;
22 event.PressPoint(0, 1);
23 EXPECT_TRUE(validator.Validate(event, &error_msg));
24 EXPECT_TRUE(error_msg.empty());
27 event.PressPoint(1, 0);
28 EXPECT_TRUE(validator.Validate(event, &error_msg));
29 EXPECT_TRUE(error_msg.empty());
32 event.MovePoint(1, 1, 1);
33 EXPECT_TRUE(validator.Validate(event, &error_msg));
34 EXPECT_TRUE(error_msg.empty());
37 event.ReleasePoint(1);
38 EXPECT_TRUE(validator.Validate(event, &error_msg));
39 EXPECT_TRUE(error_msg.empty());
42 event.MovePoint(0, -1, 0);
43 EXPECT_TRUE(validator.Validate(event, &error_msg));
44 EXPECT_TRUE(error_msg.empty());
48 EXPECT_TRUE(validator.Validate(event, &error_msg));
49 EXPECT_TRUE(error_msg.empty());
52 event.PressPoint(-1, -1);
53 EXPECT_TRUE(validator.Validate(event, &error_msg));
54 EXPECT_TRUE(error_msg.empty());
57 TEST(TouchEventStreamValidator, ResetOnNewTouchStream) {
58 TouchEventStreamValidator validator;
59 SyntheticWebTouchEvent event;
60 std::string error_msg;
62 event.PressPoint(0, 1);
63 EXPECT_TRUE(validator.Validate(event, &error_msg));
64 EXPECT_TRUE(error_msg.empty());
69 event.PressPoint(1, 0);
70 EXPECT_TRUE(validator.Validate(event, &error_msg));
71 EXPECT_TRUE(error_msg.empty());
74 TEST(TouchEventStreamValidator, MissedTouchStart) {
75 TouchEventStreamValidator validator;
76 SyntheticWebTouchEvent event;
77 std::string error_msg;
79 event.PressPoint(0, 1);
80 EXPECT_TRUE(validator.Validate(event, &error_msg));
81 EXPECT_TRUE(error_msg.empty());
83 event.PressPoint(1, 0);
85 event.PressPoint(1, 1);
86 EXPECT_FALSE(validator.Validate(event, &error_msg));
87 EXPECT_FALSE(error_msg.empty());
90 TEST(TouchEventStreamValidator, MissedTouchEnd) {
91 TouchEventStreamValidator validator;
92 SyntheticWebTouchEvent event;
93 std::string error_msg;
95 event.PressPoint(0, 1);
96 EXPECT_TRUE(validator.Validate(event, &error_msg));
97 EXPECT_TRUE(error_msg.empty());
100 event.PressPoint(0, 1);
101 EXPECT_TRUE(validator.Validate(event, &error_msg));
102 EXPECT_TRUE(error_msg.empty());
105 event.ReleasePoint(1);
107 event.PressPoint(1, 1);
108 EXPECT_FALSE(validator.Validate(event, &error_msg));
109 EXPECT_FALSE(error_msg.empty());
112 TEST(TouchEventStreamValidator, EmptyEvent) {
113 TouchEventStreamValidator validator;
115 std::string error_msg;
117 EXPECT_FALSE(validator.Validate(event, &error_msg));
118 EXPECT_FALSE(error_msg.empty());
121 TEST(TouchEventStreamValidator, InvalidEventType) {
122 TouchEventStreamValidator validator;
124 std::string error_msg;
126 event.type = WebInputEvent::GestureScrollBegin;
127 event.touchesLength = 1;
128 event.touches[0].state = WebTouchPoint::StatePressed;
130 EXPECT_FALSE(validator.Validate(event, &error_msg));
131 EXPECT_FALSE(error_msg.empty());
134 TEST(TouchEventStreamValidator, InvalidPointStates) {
135 TouchEventStreamValidator validator;
136 std::string error_msg;
138 WebInputEvent::Type kTouchTypes[4] = {
139 WebInputEvent::TouchStart, WebInputEvent::TouchMove,
140 WebInputEvent::TouchEnd, WebInputEvent::TouchCancel,
143 WebTouchPoint::State kValidTouchPointStatesForType[4] = {
144 WebTouchPoint::StatePressed, WebTouchPoint::StateMoved,
145 WebTouchPoint::StateReleased, WebTouchPoint::StateCancelled,
148 SyntheticWebTouchEvent start;
149 start.PressPoint(0, 0);
150 for (size_t i = 0; i < 4; ++i) {
151 // Always start with a touchstart to reset the stream validation.
152 EXPECT_TRUE(validator.Validate(start, &error_msg));
153 EXPECT_TRUE(error_msg.empty());
156 event.touchesLength = 1;
157 event.type = kTouchTypes[i];
158 for (size_t j = WebTouchPoint::StateUndefined;
159 j <= WebTouchPoint::StateCancelled;
161 event.touches[0].state = static_cast<WebTouchPoint::State>(j);
162 if (event.touches[0].state == kValidTouchPointStatesForType[i]) {
163 EXPECT_TRUE(validator.Validate(event, &error_msg));
164 EXPECT_TRUE(error_msg.empty());
166 EXPECT_FALSE(validator.Validate(event, &error_msg));
167 EXPECT_FALSE(error_msg.empty());
173 } // namespace content