| Index: ash/magnifier/partial_magnification_controller_unittest.cc
|
| diff --git a/ash/magnifier/partial_magnification_controller_unittest.cc b/ash/magnifier/partial_magnification_controller_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7e6e3aa3cbf16002bb46503187404a99a1321ec6
|
| --- /dev/null
|
| +++ b/ash/magnifier/partial_magnification_controller_unittest.cc
|
| @@ -0,0 +1,166 @@
|
| +// Copyright 2016 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/display/display_manager.h"
|
| +#include "ash/magnifier/magnification_controller.h"
|
| +#include "ash/magnifier/partial_magnification_controller.h"
|
| +#include "ash/shell.h"
|
| +#include "ash/test/ash_test_base.h"
|
| +#include "ui/events/test/event_generator.h"
|
| +#include "ui/views/widget/widget.h"
|
| +
|
| +namespace ash {
|
| +
|
| +// Wrapper for PartialMagnificationController that exposes internal state to
|
| +// test functions.
|
| +class PartialMagnificationControllerTestApi {
|
| + public:
|
| + explicit PartialMagnificationControllerTestApi(
|
| + PartialMagnificationController* controller)
|
| + : controller_(controller) {}
|
| + ~PartialMagnificationControllerTestApi() {}
|
| +
|
| + bool is_enabled() const { return controller_->is_enabled_; }
|
| + bool is_active() const { return controller_->is_active_; }
|
| + views::Widget* host_widget() const { return controller_->host_widget_; }
|
| +
|
| + gfx::Point GetWidgetOrigin() const {
|
| + return host_widget()->GetWindowBoundsInScreen().origin();
|
| + }
|
| +
|
| + private:
|
| + PartialMagnificationController* controller_;
|
| +
|
| + DISALLOW_ASSIGN(PartialMagnificationControllerTestApi);
|
| +};
|
| +
|
| +class PartialMagnificationControllerTest : public test::AshTestBase {
|
| + public:
|
| + PartialMagnificationControllerTest() {}
|
| + ~PartialMagnificationControllerTest() override {}
|
| +
|
| + void SetUp() override {
|
| + AshTestBase::SetUp();
|
| + Shell::GetInstance()->display_manager()->UpdateDisplays();
|
| + }
|
| +
|
| + protected:
|
| + PartialMagnificationController* GetController() const {
|
| + return Shell::GetInstance()->partial_magnification_controller();
|
| + }
|
| +
|
| + PartialMagnificationControllerTestApi GetTestApi() const {
|
| + return PartialMagnificationControllerTestApi(
|
| + Shell::GetInstance()->partial_magnification_controller());
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(PartialMagnificationControllerTest);
|
| +};
|
| +
|
| +// The magnifier should not show up immediately after being enabled.
|
| +TEST_F(PartialMagnificationControllerTest, InactiveByDefault) {
|
| + GetController()->SetEnabled(true);
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| + EXPECT_FALSE(GetTestApi().host_widget());
|
| +}
|
| +
|
| +// The magnifier should show up only after a pointer is pressed while enabled.
|
| +TEST_F(PartialMagnificationControllerTest, ActiveOnPointerDown) {
|
| + GetEventGenerator().EnterPenPointerMode();
|
| +
|
| + // While disabled no magnifier shows up.
|
| + GetEventGenerator().PressLeftButton();
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| + EXPECT_FALSE(GetTestApi().host_widget());
|
| + GetEventGenerator().ReleaseLeftButton();
|
| +
|
| + // While enabled the magnifier is only active while the pointer is down.
|
| + GetController()->SetEnabled(true);
|
| + GetEventGenerator().PressLeftButton();
|
| + EXPECT_TRUE(GetTestApi().is_active());
|
| + EXPECT_TRUE(GetTestApi().host_widget());
|
| + GetEventGenerator().ReleaseLeftButton();
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| + EXPECT_FALSE(GetTestApi().host_widget());
|
| +}
|
| +
|
| +// Verifies that nothing bad happens if a second display is disconnected while
|
| +// the magnifier is active.
|
| +TEST_F(PartialMagnificationControllerTest, MultipleDisplays) {
|
| + if (!SupportsMultipleDisplays())
|
| + return;
|
| + GetEventGenerator().EnterPenPointerMode();
|
| +
|
| + // Active magnifier with two displays, move it to the second display.
|
| + UpdateDisplay("800x600,800x600");
|
| + GetController()->SetEnabled(true);
|
| + GetEventGenerator().PressLeftButton();
|
| + GetEventGenerator().MoveMouseTo(gfx::Point(1200, 300));
|
| + EXPECT_TRUE(GetTestApi().is_active());
|
| + EXPECT_TRUE(GetTestApi().host_widget());
|
| +
|
| + // Disconnect the second display, verify that magnifier is still active.
|
| + UpdateDisplay("800x600");
|
| + GetController()->SwitchTargetRootWindowIfNeeded(nullptr);
|
| + EXPECT_TRUE(GetTestApi().is_active());
|
| + EXPECT_TRUE(GetTestApi().host_widget());
|
| +}
|
| +
|
| +// Turning the magnifier off while it is active destroys the window.
|
| +TEST_F(PartialMagnificationControllerTest, DisablingDisablesActive) {
|
| + GetEventGenerator().EnterPenPointerMode();
|
| +
|
| + GetController()->SetEnabled(true);
|
| + GetEventGenerator().PressLeftButton();
|
| + EXPECT_TRUE(GetTestApi().is_active());
|
| +
|
| + GetController()->SetEnabled(false);
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| + EXPECT_FALSE(GetTestApi().host_widget());
|
| +}
|
| +
|
| +// The magnifier only activates for pointer events.
|
| +TEST_F(PartialMagnificationControllerTest, ActivatesOnlyForPointer) {
|
| + GetController()->SetEnabled(true);
|
| + GetEventGenerator().PressRightButton();
|
| + GetEventGenerator().PressTouch();
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| +}
|
| +
|
| +// The magnifier is always located at pointer.
|
| +TEST_F(PartialMagnificationControllerTest, MagnifierFollowsPointer) {
|
| + GetEventGenerator().EnterPenPointerMode();
|
| + GetController()->SetEnabled(true);
|
| +
|
| + // The window does not have to be centered on the press; compute the initial
|
| + // window placement offset. Use a Vector2d for the + operator overload.
|
| + GetEventGenerator().PressLeftButton();
|
| + gfx::Vector2d offset(GetTestApi().GetWidgetOrigin().x(),
|
| + GetTestApi().GetWidgetOrigin().y());
|
| +
|
| + // Move the pointer around, make sure the window follows it.
|
| + GetEventGenerator().MoveMouseTo(gfx::Point(32, 32));
|
| + EXPECT_EQ(GetEventGenerator().current_location() + offset,
|
| + GetTestApi().GetWidgetOrigin());
|
| +
|
| + GetEventGenerator().MoveMouseTo(gfx::Point(0, 10));
|
| + EXPECT_EQ(GetEventGenerator().current_location() + offset,
|
| + GetTestApi().GetWidgetOrigin());
|
| +
|
| + GetEventGenerator().MoveMouseTo(gfx::Point(10, 0));
|
| + EXPECT_EQ(GetEventGenerator().current_location() + offset,
|
| + GetTestApi().GetWidgetOrigin());
|
| +
|
| + GetEventGenerator().ReleaseLeftButton();
|
| +
|
| + // Make sure the window is initially placed correctly.
|
| + GetEventGenerator().set_current_location(gfx::Point(50, 20));
|
| + EXPECT_FALSE(GetTestApi().is_active());
|
| + GetEventGenerator().PressLeftButton();
|
| + EXPECT_EQ(GetEventGenerator().current_location() + offset,
|
| + GetTestApi().GetWidgetOrigin());
|
| +}
|
| +
|
| +} // namespace ash
|
|
|