blob: b699efbbcedd602175f15945c15fdee99055ae0e [file] [log] [blame]
// Copyright 2015 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 "ash/shell.h"
#include "components/exo/buffer.h"
#include "components/exo/pointer.h"
#include "components/exo/pointer_delegate.h"
#include "components/exo/shell_surface.h"
#include "components/exo/surface.h"
#include "components/exo/test/exo_test_base.h"
#include "components/exo/test/exo_test_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "ui/events/event_utils.h"
#include "ui/events/test/event_generator.h"
namespace exo {
namespace {
using PointerTest = test::ExoTestBase;
class MockPointerDelegate : public PointerDelegate {
public:
MockPointerDelegate() {}
// Overridden from PointerDelegate:
MOCK_METHOD1(OnPointerDestroying, void(Pointer*));
MOCK_CONST_METHOD1(CanAcceptPointerEventsForSurface, bool(Surface*));
MOCK_METHOD3(OnPointerEnter, void(Surface*, const gfx::Point&, int));
MOCK_METHOD1(OnPointerLeave, void(Surface*));
MOCK_METHOD2(OnPointerMotion, void(base::TimeDelta, const gfx::Point&));
MOCK_METHOD3(OnPointerButton, void(base::TimeDelta, int, bool));
MOCK_METHOD2(OnPointerWheel, void(base::TimeDelta, const gfx::Vector2d&));
};
TEST_F(PointerTest, OnPointerEnter) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
TEST_F(PointerTest, OnPointerLeave) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
generator.MoveMouseTo(surface->GetBoundsInScreen().bottom_right());
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
TEST_F(PointerTest, OnPointerMotion) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::Point(1, 1)));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin() +
gfx::Vector2d(1, 1));
scoped_ptr<Surface> sub_surface(new Surface);
surface->AddSubSurface(sub_surface.get());
surface->SetSubSurfacePosition(sub_surface.get(), gfx::Point(5, 5));
gfx::Size sub_buffer_size(5, 5);
scoped_ptr<Buffer> sub_buffer(
new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(sub_buffer_size),
GL_TEXTURE_2D));
sub_surface->Attach(sub_buffer.get());
sub_surface->Commit();
surface->Commit();
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(sub_surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
EXPECT_CALL(delegate, OnPointerEnter(sub_surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(sub_surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::Point(1, 1)));
generator.MoveMouseTo(sub_surface->GetBoundsInScreen().origin() +
gfx::Vector2d(1, 1));
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
TEST_F(PointerTest, OnPointerButton) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate,
OnPointerButton(testing::_, ui::EF_LEFT_MOUSE_BUTTON, true));
EXPECT_CALL(delegate,
OnPointerButton(testing::_, ui::EF_LEFT_MOUSE_BUTTON, false));
generator.ClickLeftButton();
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
TEST_F(PointerTest, OnPointerWheel) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
EXPECT_CALL(delegate, OnPointerWheel(testing::_, gfx::Vector2d(1, 1)));
generator.MoveMouseWheel(1, 1);
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
TEST_F(PointerTest, OnPointerScroll) {
scoped_ptr<Surface> surface(new Surface);
scoped_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
gfx::Size buffer_size(10, 10);
scoped_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D));
surface->Attach(buffer.get());
surface->Commit();
MockPointerDelegate delegate;
scoped_ptr<Pointer> pointer(new Pointer(&delegate));
ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
gfx::Point location = surface->GetBoundsInScreen().origin();
EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
generator.MoveMouseTo(location);
EXPECT_CALL(delegate, OnPointerWheel(testing::_, gfx::Vector2d(1, 1)));
ui::ScrollEvent scroll_event(ui::ET_SCROLL, location, ui::EventTimeForNow(),
0 /* flags */, 1 /* x_offset */,
1 /* y_offset */, 1 /* x_offset_ordinal */,
1 /* y_offset_ordinal */, 1 /* finger_count */);
generator.Dispatch(&scroll_event);
EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
pointer.reset();
}
} // namespace
} // namespace exo