blob: 07f09025ad5e0c97171f714baf7a4f86ff577cf3 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/input/gesture_event_stream_validator.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
using blink::WebInputEvent;
using blink::WebGestureEvent;
namespace input {
namespace {
const blink::WebGestureDevice kDefaultGestureDevice =
blink::WebGestureDevice::kTouchscreen;
blink::WebGestureEvent Build(WebInputEvent::Type type) {
blink::WebGestureEvent event = blink::SyntheticWebGestureEventBuilder::Build(
type, kDefaultGestureDevice);
// Default to providing a (valid) non-zero fling velocity.
if (type == WebInputEvent::Type::kGestureFlingStart)
event.data.fling_start.velocity_x = 5;
return event;
}
} // namespace
TEST(GestureEventStreamValidator, ValidScroll) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureScrollUpdate);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureScrollEnd);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
}
TEST(GestureEventStreamValidator, InvalidScroll) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
// No preceding ScrollBegin.
event = Build(WebInputEvent::Type::kGestureScrollUpdate);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// No preceding ScrollBegin.
event = Build(WebInputEvent::Type::kGestureScrollEnd);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
// Already scrolling.
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureScrollEnd);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
// Scroll already ended.
event = Build(WebInputEvent::Type::kGestureScrollEnd);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
}
TEST(GestureEventStreamValidator, ValidFling) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureFlingStart);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
}
TEST(GestureEventStreamValidator, InvalidFling) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
// No preceding ScrollBegin.
event = Build(WebInputEvent::Type::kGestureFlingStart);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// Zero velocity.
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureFlingStart);
event.data.fling_start.velocity_x = 0;
event.data.fling_start.velocity_y = 0;
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
}
TEST(GestureEventStreamValidator, ValidPinch) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
event = Build(WebInputEvent::Type::kGesturePinchBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGesturePinchUpdate);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGesturePinchEnd);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
}
TEST(GestureEventStreamValidator, InvalidPinch) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
// No preceding PinchBegin.
event = Build(WebInputEvent::Type::kGesturePinchUpdate);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGesturePinchBegin);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
// ScrollBegin while pinching.
event = Build(WebInputEvent::Type::kGestureScrollBegin);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// ScrollEnd while pinching.
event = Build(WebInputEvent::Type::kGestureScrollEnd);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// Pinch already begun.
event = Build(WebInputEvent::Type::kGesturePinchBegin);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGesturePinchEnd);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
// Pinch already ended.
event = Build(WebInputEvent::Type::kGesturePinchEnd);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
}
TEST(GestureEventStreamValidator, ValidTap) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
event = Build(WebInputEvent::Type::kGestureTapDown);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapCancel);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapDown);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapUnconfirmed);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapCancel);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapDown);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTap);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
// DoubleTap does not require a TapDown (unlike Tap, TapUnconfirmed and
// TapCancel).
event = Build(WebInputEvent::Type::kGestureDoubleTap);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
}
TEST(GestureEventStreamValidator, InvalidTap) {
GestureEventStreamValidator validator;
std::string error_msg;
WebGestureEvent event;
// No preceding TapDown.
event = Build(WebInputEvent::Type::kGestureTapUnconfirmed);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapCancel);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTap);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// TapDown already terminated.
event = Build(WebInputEvent::Type::kGestureTapDown);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureDoubleTap);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapCancel);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
// TapDown already terminated.
event = Build(WebInputEvent::Type::kGestureTapDown);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTap);
EXPECT_TRUE(validator.Validate(event, &error_msg));
EXPECT_TRUE(error_msg.empty());
event = Build(WebInputEvent::Type::kGestureTapCancel);
EXPECT_FALSE(validator.Validate(event, &error_msg));
EXPECT_FALSE(error_msg.empty());
}
} // namespace input