mobile_scroller_unittest.cc 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <limits.h>
  5. #include "base/time/time.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "ui/events/mobile_scroller.h"
  8. namespace ui {
  9. namespace {
  10. const float kDefaultStartX = 7.f;
  11. const float kDefaultStartY = 25.f;
  12. const float kDefaultDeltaX = -20.f;
  13. const float kDefaultDeltaY = 73.f;
  14. const float kDefaultVelocityX = -350.f;
  15. const float kDefaultVelocityY = 220.f;
  16. const float kEpsilon = 1e-3f;
  17. MobileScroller::Config DefaultConfig() {
  18. return MobileScroller::Config();
  19. }
  20. } // namespace
  21. using MobileScrollerTest = testing::Test;
  22. TEST_F(MobileScrollerTest, Scroll) {
  23. MobileScroller scroller(DefaultConfig());
  24. base::TimeTicks start_time = base::TimeTicks::Now();
  25. // Start a scroll and verify initialized values.
  26. scroller.StartScroll(kDefaultStartX, kDefaultStartY, kDefaultDeltaX,
  27. kDefaultDeltaY, start_time);
  28. EXPECT_EQ(kDefaultStartX, scroller.GetStartX());
  29. EXPECT_EQ(kDefaultStartY, scroller.GetStartY());
  30. EXPECT_EQ(kDefaultStartX, scroller.GetCurrX());
  31. EXPECT_EQ(kDefaultStartY, scroller.GetCurrY());
  32. EXPECT_EQ(kDefaultStartX + kDefaultDeltaX, scroller.GetFinalX());
  33. EXPECT_EQ(kDefaultStartY + kDefaultDeltaY, scroller.GetFinalY());
  34. EXPECT_FALSE(scroller.IsFinished());
  35. EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed());
  36. // Advance halfway through the scroll.
  37. const base::TimeDelta scroll_duration = scroller.GetDuration();
  38. gfx::Vector2dF offset, velocity;
  39. EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2,
  40. &offset, &velocity));
  41. // Ensure we've moved in the direction of the delta, but have yet to reach
  42. // the target.
  43. EXPECT_GT(kDefaultStartX, offset.x());
  44. EXPECT_LT(kDefaultStartY, offset.y());
  45. EXPECT_LT(scroller.GetFinalX(), offset.x());
  46. EXPECT_GT(scroller.GetFinalY(), offset.y());
  47. EXPECT_FALSE(scroller.IsFinished());
  48. // Ensure our velocity is non-zero and in the same direction as the delta.
  49. EXPECT_GT(0.f, velocity.x() * kDefaultDeltaX);
  50. EXPECT_GT(0.f, velocity.y() * kDefaultDeltaY);
  51. EXPECT_TRUE(scroller.IsScrollingInDirection(kDefaultDeltaX, kDefaultDeltaY));
  52. // Repeated offset computations at the same timestamp should yield identical
  53. // results.
  54. float curr_x = offset.x();
  55. float curr_y = offset.y();
  56. float curr_velocity_x = velocity.x();
  57. float curr_velocity_y = velocity.y();
  58. EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2,
  59. &offset, &velocity));
  60. EXPECT_EQ(curr_x, offset.x());
  61. EXPECT_EQ(curr_y, offset.y());
  62. EXPECT_EQ(curr_velocity_x, velocity.x());
  63. EXPECT_EQ(curr_velocity_y, velocity.y());
  64. // Advance to the end.
  65. EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration,
  66. &offset, &velocity));
  67. EXPECT_EQ(scroller.GetFinalX(), offset.x());
  68. EXPECT_EQ(scroller.GetFinalY(), offset.y());
  69. EXPECT_TRUE(scroller.IsFinished());
  70. EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
  71. EXPECT_NEAR(0.f, velocity.x(), kEpsilon);
  72. EXPECT_NEAR(0.f, velocity.y(), kEpsilon);
  73. // Try to advance further; nothing should change.
  74. EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration * 2,
  75. &offset, &velocity));
  76. EXPECT_EQ(scroller.GetFinalX(), offset.x());
  77. EXPECT_EQ(scroller.GetFinalY(), offset.y());
  78. EXPECT_TRUE(scroller.IsFinished());
  79. EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
  80. }
  81. TEST_F(MobileScrollerTest, Fling) {
  82. MobileScroller scroller(DefaultConfig());
  83. base::TimeTicks start_time = base::TimeTicks::Now();
  84. // Start a fling and verify initialized values.
  85. scroller.Fling(kDefaultStartX, kDefaultStartY, kDefaultVelocityX,
  86. kDefaultVelocityY, INT_MIN, static_cast<float>(INT_MAX),
  87. INT_MIN, static_cast<float>(INT_MAX), start_time);
  88. EXPECT_EQ(kDefaultStartX, scroller.GetStartX());
  89. EXPECT_EQ(kDefaultStartY, scroller.GetStartY());
  90. EXPECT_EQ(kDefaultStartX, scroller.GetCurrX());
  91. EXPECT_EQ(kDefaultStartY, scroller.GetCurrY());
  92. EXPECT_GT(kDefaultStartX, scroller.GetFinalX());
  93. EXPECT_LT(kDefaultStartY, scroller.GetFinalY());
  94. EXPECT_FALSE(scroller.IsFinished());
  95. EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed());
  96. // Advance halfway through the fling.
  97. const base::TimeDelta scroll_duration = scroller.GetDuration();
  98. gfx::Vector2dF offset, velocity;
  99. scroller.ComputeScrollOffset(start_time + scroll_duration / 2, &offset,
  100. &velocity);
  101. // Ensure we've moved in the direction of the velocity, but have yet to reach
  102. // the target.
  103. EXPECT_GT(kDefaultStartX, offset.x());
  104. EXPECT_LT(kDefaultStartY, offset.y());
  105. EXPECT_LT(scroller.GetFinalX(), offset.x());
  106. EXPECT_GT(scroller.GetFinalY(), offset.y());
  107. EXPECT_FALSE(scroller.IsFinished());
  108. // Ensure our velocity is non-zero and in the same direction as the original
  109. // velocity.
  110. EXPECT_LT(0.f, velocity.x() * kDefaultVelocityX);
  111. EXPECT_LT(0.f, velocity.y() * kDefaultVelocityY);
  112. EXPECT_TRUE(
  113. scroller.IsScrollingInDirection(kDefaultVelocityX, kDefaultVelocityY));
  114. // Repeated offset computations at the same timestamp should yield identical
  115. // results.
  116. float curr_x = offset.x();
  117. float curr_y = offset.y();
  118. float curr_velocity_x = velocity.x();
  119. float curr_velocity_y = velocity.y();
  120. EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2,
  121. &offset, &velocity));
  122. EXPECT_EQ(curr_x, offset.x());
  123. EXPECT_EQ(curr_y, offset.y());
  124. EXPECT_EQ(curr_velocity_x, velocity.x());
  125. EXPECT_EQ(curr_velocity_y, velocity.y());
  126. // Advance to the end.
  127. EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration,
  128. &offset, &velocity));
  129. EXPECT_EQ(scroller.GetFinalX(), offset.x());
  130. EXPECT_EQ(scroller.GetFinalY(), offset.y());
  131. EXPECT_TRUE(scroller.IsFinished());
  132. EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
  133. EXPECT_NEAR(0.f, velocity.x(), kEpsilon);
  134. EXPECT_NEAR(0.f, velocity.y(), kEpsilon);
  135. // Try to advance further; nothing should change.
  136. EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration * 2,
  137. &offset, &velocity));
  138. EXPECT_EQ(scroller.GetFinalX(), offset.x());
  139. EXPECT_EQ(scroller.GetFinalY(), offset.y());
  140. EXPECT_TRUE(scroller.IsFinished());
  141. EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
  142. }
  143. } // namespace ui