Chromium Code Reviews| 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..6eb57525e1e6ab7ec783249dd7fbeb34cb90e53c 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); |
|
jonross
2014/07/25 13:39:06
Are we ever going to see lid vectors this high whi
bruthig
2014/07/25 15:20:42
We shouldn't during normal expected operation, but
jonross
2014/07/25 15:56:34
Acknowledged.
|
| + 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, WasLidOpenedRecently) { |
|
jonross
2014/07/25 13:39:07
Rename to WasLidOpenedRecentlyAffectedByTime, or s
bruthig
2014/07/25 15:20:43
Done.
|
| +#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()); |
|
jonross
2014/07/25 13:39:06
Trivial case for not chrome_os. Don't need to test
bruthig
2014/07/25 15:20:43
I disagree, if there is some bug in ifdefs, or a b
jonross
2014/07/25 15:56:34
Acknowledged.
|
| + |
| +#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) { |
| @@ -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()); |
| } |