| Index: ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
|
| diff --git a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
|
| index 089a2325e8053f0d4ab224d3901f2a856c34dd4a..228456a9b8450da095fea9c64f5c9bda31b7aa51 100644
|
| --- a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
|
| +++ b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
|
| @@ -14,6 +14,7 @@
|
| #include "ash/test/test_screenshot_delegate.h"
|
| #include "ash/test/test_system_tray_delegate.h"
|
| #include "ash/test/test_volume_control_delegate.h"
|
| +#include "base/test/simple_test_tick_clock.h"
|
| #include "ui/aura/test/event_generator.h"
|
| #include "ui/events/event_handler.h"
|
| #include "ui/gfx/vector3d_f.h"
|
| @@ -45,6 +46,19 @@ extern const size_t kAccelerometerLaptopModeTestDataLength;
|
| extern const float kAccelerometerFullyOpenTestData[];
|
| extern const size_t kAccelerometerFullyOpenTestDataLength;
|
|
|
| +// Test vectors that can be used to make the hinge appear to be near a given
|
| +// angle. Use TriggerAccelerometerUpdate(kHingeBaseVector, k<#>DegreeVector)
|
| +// where <#> in k<#>DegreeVector is the desired angle. Note the <#> values are
|
| +// approximations and are within +/-1 degree.
|
| +const gfx::Vector3dF kHingeBaseVector(1.0f, 0.0f, 0.0f);
|
| +const gfx::Vector3dF kHingeLidVector_5(1.0f, 0.0f, 0.1f);
|
| +const gfx::Vector3dF kHingeLidVector_45(0.75f, 0.0f, 0.75f);
|
| +const gfx::Vector3dF kHingeLidVector_90(0.0f, 0.0f, 1.0f);
|
| +const gfx::Vector3dF kHingeLidVector_180(-1.0f, 0.0f, 0.0f);
|
| +const gfx::Vector3dF kHingeLidVector_270(0.0f, 0.0f, -1.0f);
|
| +const gfx::Vector3dF kHingeLidVector_315(0.75f, 0.0f, -0.75f);
|
| +const gfx::Vector3dF kHingeLidVector_355(1.0f, 0.0f, -0.1f);
|
| +
|
| class MaximizeModeControllerTest : public test::AshTestBase {
|
| public:
|
| MaximizeModeControllerTest() {}
|
| @@ -90,43 +104,189 @@ class MaximizeModeControllerTest : public test::AshTestBase {
|
| SetDisplayRotation(gfx::Display::InternalDisplayId(), rotation);
|
| }
|
|
|
| + // Attaches a SimpleTestTickClock to the MaximizeModeController with a non
|
| + // null value initial value.
|
| + void AttachTickClockForTest() {
|
| + tick_clock_ = new base::SimpleTestTickClock();
|
| + tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
|
| + maximize_mode_controller()->SetTickClockForTest(tick_clock_);
|
| + }
|
| +
|
| + void AdvanceTickClock(const base::TimeDelta& delta) {
|
| + DCHECK(tick_clock_);
|
| + tick_clock_->Advance(delta);
|
| + }
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| + void OpenLid() {
|
| + maximize_mode_controller()->LidEventReceived(true /* open */,
|
| + maximize_mode_controller()->tick_clock_->NowTicks());
|
| + }
|
| +
|
| + void CloseLid() {
|
| + maximize_mode_controller()->LidEventReceived(false /* open */,
|
| + maximize_mode_controller()->tick_clock_->NowTicks());
|
| + }
|
| +#endif // OS_CHROMEOS
|
| +
|
| + bool WasLidOpenedRecently() {
|
| + return maximize_mode_controller()->WasLidOpenedRecently();
|
| + }
|
| +
|
| private:
|
| + base::SimpleTestTickClock* tick_clock_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MaximizeModeControllerTest);
|
| };
|
|
|
| -// Tests that opening the lid beyond 180 will enter touchview, and that it will
|
| -// exit when the lid comes back from 180. Also tests the thresholds, i.e. it
|
| -// will stick to the current mode.
|
| -TEST_F(MaximizeModeControllerTest, EnterExitThresholds) {
|
| - // For the simple test the base remains steady.
|
| - gfx::Vector3dF base(0.0f, 0.0f, 1.0f);
|
| +#if defined(OS_CHROMEOS)
|
| +
|
| +// Verify that closing the lid will exit maximize mode.
|
| +TEST_F(MaximizeModeControllerTest, CloseLidWhileInMaximizeMode) {
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_315);
|
| + ASSERT_TRUE(IsMaximizeModeStarted());
|
|
|
| - // Lid open 90 degrees.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
|
| + CloseLid();
|
| EXPECT_FALSE(IsMaximizeModeStarted());
|
| +}
|
| +
|
| +// Verify that maximize mode will not be entered when the lid is closed.
|
| +TEST_F(MaximizeModeControllerTest,
|
| + HingeAnglesWithLidClosed) {
|
| + AttachTickClockForTest();
|
|
|
| - // Open just past 180.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(0.05f, 0.0f, -1.0f));
|
| + CloseLid();
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| EXPECT_FALSE(IsMaximizeModeStarted());
|
|
|
| - // Open up 270 degrees.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(1.0f, 0.0f, 0.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_45);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_90);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_180);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_270);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_315);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_355);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +}
|
| +
|
| +// Verify the maximize mode state for unstable hinge angles when the lid was
|
| +// recently open.
|
| +TEST_F(MaximizeModeControllerTest,
|
| + UnstableHingeAnglesWhenLidRecentlyOpened) {
|
| + AttachTickClockForTest();
|
| +
|
| + OpenLid();
|
| + ASSERT_TRUE(WasLidOpenedRecently());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_355);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + // This is a stable reading and should clear the last lid opened time.
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_45);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| + EXPECT_FALSE(WasLidOpenedRecently());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_355);
|
| EXPECT_TRUE(IsMaximizeModeStarted());
|
|
|
| - // Open up 360 degrees and appearing to be slightly past it (i.e. as if almost
|
| - // closed).
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-0.05f, 0.0f, 1.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| EXPECT_TRUE(IsMaximizeModeStarted());
|
| +}
|
| +
|
| +#endif // OS_CHROMEOS
|
| +
|
| +// Verify the WasLidOpenedRecently signal with respect to time.
|
| +TEST_F(MaximizeModeControllerTest, WasLidOpenedRecentlyOverTime) {
|
| +#if defined(OS_CHROMEOS)
|
| +
|
| + AttachTickClockForTest();
|
| +
|
| + // No lid open time initially.
|
| + ASSERT_FALSE(WasLidOpenedRecently());
|
| +
|
| + CloseLid();
|
| + EXPECT_FALSE(WasLidOpenedRecently());
|
| +
|
| + OpenLid();
|
| + EXPECT_TRUE(WasLidOpenedRecently());
|
|
|
| - // Open just before 180.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-0.05f, 0.0f, -1.0f));
|
| + // 1 second after lid open.
|
| + AdvanceTickClock(base::TimeDelta::FromSeconds(1));
|
| + EXPECT_TRUE(WasLidOpenedRecently());
|
| +
|
| + // 2 seconds after lid open.
|
| + AdvanceTickClock(base::TimeDelta::FromSeconds(1));
|
| + EXPECT_TRUE(WasLidOpenedRecently());
|
| +
|
| + // 3 seconds after lid open.
|
| + AdvanceTickClock(base::TimeDelta::FromSeconds(1));
|
| + EXPECT_FALSE(WasLidOpenedRecently());
|
| +
|
| +#else
|
| +
|
| + EXPECT_FALSE(WasLidOpenedRecently());
|
| +
|
| +#endif // OS_CHROMEOS
|
| +}
|
| +
|
| +// Verify the maximize mode enter/exit thresholds for stable angles.
|
| +TEST_F(MaximizeModeControllerTest, StableHingeAnglesWithLidOpened) {
|
| + ASSERT_FALSE(IsMaximizeModeStarted());
|
| + ASSERT_FALSE(WasLidOpenedRecently());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_180);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_315);
|
| + EXPECT_TRUE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_180);
|
| EXPECT_TRUE(IsMaximizeModeStarted());
|
|
|
| - // Open 90 degrees.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_45);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_270);
|
| + EXPECT_TRUE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_90);
|
| EXPECT_FALSE(IsMaximizeModeStarted());
|
| }
|
|
|
| +// Verify the maximize mode state for unstable hinge angles when the lid is open
|
| +// but not recently.
|
| +TEST_F(MaximizeModeControllerTest, UnstableHingeAnglesWithLidOpened) {
|
| + AttachTickClockForTest();
|
| +
|
| + ASSERT_FALSE(WasLidOpenedRecently());
|
| + ASSERT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| + EXPECT_FALSE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_355);
|
| + EXPECT_TRUE(IsMaximizeModeStarted());
|
| +
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_5);
|
| + EXPECT_TRUE(IsMaximizeModeStarted());
|
| +}
|
| +
|
| // Tests that when the hinge is nearly vertically aligned, the current state
|
| // persists as the computed angle is highly inaccurate in this orientation.
|
| TEST_F(MaximizeModeControllerTest, HingeAligned) {
|
| @@ -157,8 +317,8 @@ TEST_F(MaximizeModeControllerTest, HingeAligned) {
|
| EXPECT_TRUE(IsMaximizeModeStarted());
|
| }
|
|
|
| -// Tests that accelerometer readings in each of the screen angles will trigger
|
| -// a rotation of the internal display.
|
| +// Tests that accelerometer readings in each of the screen angles will trigger a
|
| +// rotation of the internal display.
|
| TEST_F(MaximizeModeControllerTest, DisplayRotation) {
|
| // Trigger maximize mode by opening to 270.
|
| TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 0.0f, -1.0f),
|
| @@ -275,8 +435,7 @@ TEST_F(MaximizeModeControllerTest, Screenshot) {
|
| delegate->set_can_take_screenshot(true);
|
|
|
| // Open up 270 degrees.
|
| - TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 0.0f, 1.0f),
|
| - gfx::Vector3dF(1.0f, 0.0f, 0.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_270);
|
| ASSERT_TRUE(IsMaximizeModeStarted());
|
|
|
| // Pressing power alone does not take a screenshot.
|
| @@ -363,22 +522,17 @@ TEST_F(MaximizeModeControllerTest, RotationLockPreventsRotation) {
|
| // Tests that when MaximizeModeController turns off MaximizeMode that on the
|
| // next accelerometer update the rotation lock is cleared.
|
| TEST_F(MaximizeModeControllerTest, ExitingMaximizeModeClearRotationLock) {
|
| - // The base remains steady.
|
| - gfx::Vector3dF base(0.0f, 0.0f, 1.0f);
|
| -
|
| // Trigger maximize mode by opening to 270.
|
| - TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 0.0f, -1.0f),
|
| - gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_270);
|
| ASSERT_TRUE(IsMaximizeModeStarted());
|
|
|
| maximize_mode_controller()->SetRotationLocked(true);
|
|
|
| - // Open 90 degrees.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_90);
|
| EXPECT_FALSE(IsMaximizeModeStarted());
|
|
|
| - // Send an update that would not relaunch MaximizeMode. 90 degrees.
|
| - TriggerAccelerometerUpdate(base, gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
|
| + // Send an update that would not relaunch MaximizeMode.
|
| + TriggerAccelerometerUpdate(kHingeBaseVector, kHingeLidVector_90);
|
| EXPECT_FALSE(maximize_mode_controller()->rotation_locked());
|
| }
|
|
|
|
|