blob: fd96da9fa0e53feddaf040febac6c56647410845 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/graphics/cast_system_gesture_event_handler.h"
#include <memory>
#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/test/aura_test_base.h"
#include "ui/aura/test/event_generator_delegate_aura.h"
#include "ui/aura/window.h"
#include "ui/events/test/event_generator.h"
#include "ui/wm/core/default_screen_position_client.h"
namespace chromecast {
namespace test {
namespace {
constexpr base::TimeDelta kTimeDelay = base::TimeDelta::FromMilliseconds(100);
constexpr int kSwipeDistance = 50;
} // namespace
class TestEventGeneratorDelegate
: public aura::test::EventGeneratorDelegateAura {
public:
explicit TestEventGeneratorDelegate(aura::Window* root_window)
: root_window_(root_window) {}
~TestEventGeneratorDelegate() override = default;
// EventGeneratorDelegateAura overrides:
aura::WindowTreeHost* GetHostAt(const gfx::Point& point) const override {
return root_window_->GetHost();
}
aura::client::ScreenPositionClient* GetScreenPositionClient(
const aura::Window* window) const override {
return aura::client::GetScreenPositionClient(root_window_);
}
private:
aura::Window* root_window_;
DISALLOW_COPY_AND_ASSIGN(TestEventGeneratorDelegate);
};
class TestSideSwipeGestureHandler
: public CastSideSwipeGestureHandlerInterface {
public:
~TestSideSwipeGestureHandler() override = default;
void OnSideSwipeBegin(CastSideSwipeOrigin swipe_origin,
ui::GestureEvent* gesture_event) override {
if (handle_swipe_) {
begin_swipe_origin_ = swipe_origin;
begin_gesture_event_ = gesture_event;
gesture_event->SetHandled();
}
}
void OnSideSwipeEnd(CastSideSwipeOrigin swipe_origin,
ui::GestureEvent* gesture_event) override {
end_swipe_origin_ = swipe_origin;
end_gesture_event_ = gesture_event;
}
void SetHandleSwipe(bool handle_swipe) { handle_swipe_ = handle_swipe; }
CastSideSwipeOrigin begin_swipe_origin() const { return begin_swipe_origin_; }
ui::GestureEvent* begin_gesture_event() const { return begin_gesture_event_; }
CastSideSwipeOrigin end_swipe_origin() const { return end_swipe_origin_; }
ui::GestureEvent* end_gesture_event() const { return end_gesture_event_; }
private:
bool handle_swipe_ = true;
CastSideSwipeOrigin begin_swipe_origin_ = CastSideSwipeOrigin::NONE;
ui::GestureEvent* begin_gesture_event_ = nullptr;
CastSideSwipeOrigin end_swipe_origin_ = CastSideSwipeOrigin::NONE;
ui::GestureEvent* end_gesture_event_ = nullptr;
};
class CastSystemGestureEventHandlerTest : public aura::test::AuraTestBase {
public:
~CastSystemGestureEventHandlerTest() override = default;
void SetUp() override {
aura::test::AuraTestBase::SetUp();
screen_position_client_.reset(new wm::DefaultScreenPositionClient());
aura::client::SetScreenPositionClient(root_window(),
screen_position_client_.get());
gesture_event_handler_.reset(
new CastSystemGestureEventHandler(root_window()));
gesture_handler_.reset(new TestSideSwipeGestureHandler);
gesture_event_handler_->AddSideSwipeGestureHandler(gesture_handler_.get());
}
void TearDown() override {
gesture_event_handler_->RemoveSideSwipeGestureHandler(
gesture_handler_.get());
gesture_event_handler_.reset();
gesture_handler_.reset();
aura::test::AuraTestBase::TearDown();
}
ui::test::EventGenerator& GetEventGenerator() {
if (!event_generator_) {
event_generator_.reset(new ui::test::EventGenerator(
new TestEventGeneratorDelegate(root_window())));
}
return *event_generator_.get();
}
TestSideSwipeGestureHandler& test_gesture_handler() {
return *gesture_handler_;
}
private:
std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_;
std::unique_ptr<ui::test::EventGenerator> event_generator_;
std::unique_ptr<CastSystemGestureEventHandler> gesture_event_handler_;
std::unique_ptr<TestSideSwipeGestureHandler> gesture_handler_;
};
// Test that initialization works and initial state is clean.
TEST_F(CastSystemGestureEventHandlerTest, Initialization) {
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().begin_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().end_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().end_gesture_event());
}
// A swipe in the middle of the screen should produce no system gesture.
TEST_F(CastSystemGestureEventHandlerTest, SwipeWithNoSystemGesture) {
gfx::Point drag_point(root_window()->bounds().width() / 2,
root_window()->bounds().height() / 2);
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point - gfx::Vector2d(0, kSwipeDistance), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().begin_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().end_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().end_gesture_event());
}
TEST_F(CastSystemGestureEventHandlerTest, SwipeFromLeft) {
gfx::Point drag_point(0, root_window()->bounds().height() / 2);
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point + gfx::Vector2d(kSwipeDistance, 0), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::LEFT,
test_gesture_handler().begin_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::LEFT,
test_gesture_handler().end_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().end_gesture_event());
}
TEST_F(CastSystemGestureEventHandlerTest, SwipeFromRight) {
gfx::Point drag_point(root_window()->bounds().width(),
root_window()->bounds().height() / 2);
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point - gfx::Vector2d(kSwipeDistance, 0), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::RIGHT,
test_gesture_handler().begin_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::RIGHT,
test_gesture_handler().end_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().end_gesture_event());
}
TEST_F(CastSystemGestureEventHandlerTest, SwipeFromTop) {
gfx::Point drag_point(root_window()->bounds().width() / 2, 0);
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point + gfx::Vector2d(0, kSwipeDistance), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::TOP,
test_gesture_handler().begin_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::TOP,
test_gesture_handler().end_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().end_gesture_event());
}
TEST_F(CastSystemGestureEventHandlerTest, SwipeFromBottom) {
gfx::Point drag_point(root_window()->bounds().width() / 2,
root_window()->bounds().height());
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point - gfx::Vector2d(0, kSwipeDistance), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::BOTTOM,
test_gesture_handler().begin_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::BOTTOM,
test_gesture_handler().end_swipe_origin());
EXPECT_NE(nullptr, test_gesture_handler().end_gesture_event());
}
// Test that ignoring the gesture at its beginning will make it so the swipe
// is not produced at the end.
TEST_F(CastSystemGestureEventHandlerTest, SwipeUnhandledIgnored) {
test_gesture_handler().SetHandleSwipe(false);
gfx::Point drag_point(root_window()->bounds().width() / 2,
root_window()->bounds().height());
ui::test::EventGenerator& generator = GetEventGenerator();
generator.GestureScrollSequence(
drag_point, drag_point - gfx::Vector2d(0, kSwipeDistance), kTimeDelay, 5);
RunAllPendingInMessageLoop();
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().begin_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().begin_gesture_event());
EXPECT_EQ(CastSideSwipeOrigin::NONE,
test_gesture_handler().end_swipe_origin());
EXPECT_EQ(nullptr, test_gesture_handler().end_gesture_event());
}
} // namespace test
} // namespace chromecast