OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 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 |
| 5 #include "base/message_loop/message_loop.h" |
| 6 #include "base/run_loop.h" |
| 7 #include "testing/gmock/include/gmock/gmock.h" |
| 8 #include "testing/gtest/include/gtest/gtest-spi.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/aura/env.h" |
| 11 #include "ui/events/event.h" |
| 12 #include "ui/events/gestures/gesture_configuration.h" |
| 13 #include "ui/events/gestures/gesture_sequence.h" |
| 14 #include "ui/events/gestures/test/eager_gesture_recognition_test_base.h" |
| 15 #include "ui/events/gestures/touch_point_state.h" |
| 16 |
| 17 using testing::ElementsAre; |
| 18 |
| 19 namespace aura { |
| 20 namespace test { |
| 21 |
| 22 namespace { |
| 23 |
| 24 typedef ui::GestureRecognizer::Gestures Gestures; |
| 25 |
| 26 } // namespace |
| 27 |
| 28 class EagerGestureRecognitionAuraTest : |
| 29 public ui::test::EagerGestureRecognitionTestBase, |
| 30 public ui::GestureEventQueueDelegate { |
| 31 public: |
| 32 EagerGestureRecognitionAuraTest() |
| 33 : wait_until_event_(ui::ET_UNKNOWN) { |
| 34 } |
| 35 |
| 36 virtual void SetUp() OVERRIDE { |
| 37 testing::Test::SetUp(); |
| 38 Env::CreateInstance(); |
| 39 // TODO - this should probably be refactored out of aura_test_base.cc and |
| 40 // here. |
| 41 ui::GestureConfiguration::set_long_press_time_in_seconds(0.01); |
| 42 ui::GestureConfiguration::set_show_press_delay_in_ms(5); |
| 43 geq_.reset(new ui::GestureEventQueue(this)); |
| 44 gesture_sequence_.reset(new ui::GestureSequence(geq_.get())); |
| 45 } |
| 46 |
| 47 virtual void TearDown() OVERRIDE { |
| 48 RunAllPendingInMessageLoop(); |
| 49 Env::DeleteInstance(); |
| 50 testing::Test::TearDown(); |
| 51 } |
| 52 |
| 53 void SendTouch(const ui::TouchEvent& event) { |
| 54 geq_->OnTouchEvent(event); |
| 55 scoped_ptr<Gestures> gestures; |
| 56 gestures.reset(gesture_sequence_->ProcessTouchEventForGesture(event)); |
| 57 for (Gestures::iterator it = gestures->begin(); |
| 58 it != gestures->end(); |
| 59 ++it) { |
| 60 geq_->QueueGestureEvent(*it, ui::TouchPointState::WAIT_FOR_ACK); |
| 61 } |
| 62 // Ownership has been transferred to the geq. |
| 63 gestures->weak_clear(); |
| 64 } |
| 65 |
| 66 void SendAck(const ui::TouchEvent& event, |
| 67 ui::EventResult result) { |
| 68 geq_->OnTouchEventAck(event, result); |
| 69 } |
| 70 |
| 71 void FakeTimerFiring() { |
| 72 geq_->TimerFired(); |
| 73 } |
| 74 |
| 75 virtual void DispatchGestureEvent(ui::GestureEvent* event) OVERRIDE { |
| 76 dispatched_events_.push_back(event->type()); |
| 77 if (wait_until_event_ == event->type() && run_loop_) { |
| 78 run_loop_->Quit(); |
| 79 wait_until_event_ = ui::ET_UNKNOWN; |
| 80 } |
| 81 } |
| 82 |
| 83 std::vector<ui::EventType> GetAndResetDispatchedEvents() { |
| 84 std::vector<ui::EventType> tmp; |
| 85 dispatched_events_.swap(tmp); |
| 86 return tmp; |
| 87 } |
| 88 |
| 89 void RunAllPendingInMessageLoop() { |
| 90 ui_message_loop_.RunUntilIdle(); |
| 91 } |
| 92 |
| 93 void WaitUntilReceivedGesture(ui::EventType type) { |
| 94 wait_until_event_ = type; |
| 95 run_loop_.reset(new base::RunLoop( |
| 96 Env::GetInstance()->GetDispatcher())); |
| 97 run_loop_->Run(); |
| 98 } |
| 99 |
| 100 private: |
| 101 scoped_ptr<ui::GestureSequence> gesture_sequence_; |
| 102 scoped_ptr<ui::GestureEventQueue> geq_; |
| 103 std::vector<ui::EventType> dispatched_events_; |
| 104 |
| 105 base::MessageLoopForUI ui_message_loop_; |
| 106 |
| 107 scoped_ptr<base::RunLoop> run_loop_; |
| 108 ui::EventType wait_until_event_; |
| 109 }; |
| 110 |
| 111 TEST_F(EagerGestureRecognitionAuraTest, BasicPress) { |
| 112 SendTouch(Press(0)); |
| 113 SendAck(Press(0), ui::ER_UNHANDLED); |
| 114 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 115 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 116 } |
| 117 |
| 118 TEST_F(EagerGestureRecognitionAuraTest, BasicTap) { |
| 119 SendTouch(Press(0)); |
| 120 SendAck(Press(0), ui::ER_UNHANDLED); |
| 121 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 122 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 123 |
| 124 SendTouch(Release(0)); |
| 125 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 126 ElementsAre()); |
| 127 SendAck(Release(0), ui::ER_UNHANDLED); |
| 128 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 129 ElementsAre(ui::ET_GESTURE_TAP, ui::ET_GESTURE_END)); |
| 130 } |
| 131 |
| 132 TEST_F(EagerGestureRecognitionAuraTest, DISABLED_ConsumedRelease) { |
| 133 SendTouch(Press(0)); |
| 134 SendAck(Press(0), ui::ER_UNHANDLED); |
| 135 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 136 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 137 |
| 138 SendTouch(Release(0)); |
| 139 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 140 SendAck(Release(0), ui::ER_CONSUMED); |
| 141 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 142 ElementsAre(ui::ET_GESTURE_TAP_CANCEL, ui::ET_GESTURE_END)); |
| 143 } |
| 144 |
| 145 TEST_F(EagerGestureRecognitionAuraTest, TwoFingerTap) { |
| 146 SendTouch(Press(0)); |
| 147 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 148 SendAck(Press(0), ui::ER_UNHANDLED); |
| 149 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 150 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 151 |
| 152 SendTouch(Press(1)); |
| 153 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 154 ElementsAre()); |
| 155 |
| 156 SendAck(Press(1), ui::ER_UNHANDLED); |
| 157 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 158 ElementsAre(ui::ET_GESTURE_TAP_CANCEL, ui::ET_GESTURE_BEGIN)); |
| 159 |
| 160 SendTouch(Release(1)); |
| 161 SendAck(Release(1), ui::ER_UNHANDLED); |
| 162 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 163 ElementsAre(ui::ET_GESTURE_TWO_FINGER_TAP, ui::ET_GESTURE_END)); |
| 164 } |
| 165 |
| 166 TEST_F(EagerGestureRecognitionAuraTest, TwoFingerConsumed) { |
| 167 SendTouch(Press(0)); |
| 168 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 169 SendAck(Press(0), ui::ER_UNHANDLED); |
| 170 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 171 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 172 |
| 173 SendTouch(Press(1)); |
| 174 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 175 SendAck(Press(1), ui::ER_CONSUMED); |
| 176 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 177 ElementsAre()); |
| 178 |
| 179 SendTouch(Release(1)); |
| 180 SendAck(Release(1), ui::ER_UNHANDLED); |
| 181 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 182 ElementsAre()); |
| 183 |
| 184 SendTouch(Press(1)); |
| 185 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 186 SendAck(Press(1), ui::ER_UNHANDLED); |
| 187 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 188 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_PINCH_BEGIN)); |
| 189 |
| 190 SendTouch(Release(1)); |
| 191 SendAck(Release(1), ui::ER_UNHANDLED); |
| 192 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 193 ElementsAre(ui::ET_GESTURE_PINCH_END, ui::ET_GESTURE_END)); |
| 194 } |
| 195 |
| 196 |
| 197 TEST_F(EagerGestureRecognitionAuraTest, SimpleScroll) { |
| 198 SendTouch(Press(0)); |
| 199 SendAck(Press(0), ui::ER_UNHANDLED); |
| 200 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 201 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 202 SendTouch(Move(0)); |
| 203 SendAck(Move(0), ui::ER_UNHANDLED); |
| 204 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 205 ElementsAre(ui::ET_GESTURE_TAP_CANCEL, |
| 206 ui::ET_GESTURE_SCROLL_BEGIN, |
| 207 ui::ET_GESTURE_SCROLL_UPDATE)); |
| 208 } |
| 209 |
| 210 // Ensures that if a one finger scroll has a move consumed, you can't transition |
| 211 // into a pinch. |
| 212 TEST_F(EagerGestureRecognitionAuraTest, ConsumedScrollToPinch) { |
| 213 SendTouch(Press(0)); |
| 214 SendAck(Press(0), ui::ER_UNHANDLED); |
| 215 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 216 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 217 |
| 218 SendTouch(Move(0)); |
| 219 SendAck(Move(0), ui::ER_CONSUMED); |
| 220 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 221 ElementsAre(ui::ET_GESTURE_TAP_CANCEL)); |
| 222 |
| 223 SendTouch(Press(1)); |
| 224 SendAck(Press(1), ui::ER_UNHANDLED); |
| 225 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 226 ElementsAre(ui::ET_GESTURE_BEGIN)); |
| 227 } |
| 228 |
| 229 TEST_F(EagerGestureRecognitionAuraTest, SuccessfulLongPress) { |
| 230 SendTouch(Press(0)); |
| 231 SendAck(Press(0), ui::ER_UNHANDLED); |
| 232 |
| 233 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 234 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 235 WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS); |
| 236 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 237 ElementsAre(ui::ET_GESTURE_SHOW_PRESS)); |
| 238 WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS); |
| 239 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 240 ElementsAre(ui::ET_GESTURE_LONG_PRESS)); |
| 241 } |
| 242 |
| 243 TEST_F(EagerGestureRecognitionAuraTest, TimedOutLongPress) { |
| 244 SendTouch(Press(0)); |
| 245 SendAck(Press(0), ui::ER_UNHANDLED); |
| 246 |
| 247 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 248 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 249 FakeTimerFiring(); |
| 250 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 251 ElementsAre(ui::ET_GESTURE_SHOW_PRESS)); |
| 252 |
| 253 SendTouch(Release(0)); |
| 254 SendAck(Release(0), ui::ER_UNHANDLED); |
| 255 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 256 ElementsAre(ui::ET_GESTURE_TAP, ui::ET_GESTURE_END)); |
| 257 |
| 258 SendTouch(Press(0)); |
| 259 SendAck(Press(0), ui::ER_UNHANDLED); |
| 260 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 261 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 262 } |
| 263 |
| 264 TEST_F(EagerGestureRecognitionAuraTest, ConsumedLongPress) { |
| 265 SendTouch(Press(0)); |
| 266 FakeTimerFiring(); |
| 267 FakeTimerFiring(); |
| 268 SendAck(Press(0), ui::ER_CONSUMED); |
| 269 SendTouch(Release(0)); |
| 270 SendAck(Release(0), ui::ER_UNHANDLED); |
| 271 |
| 272 EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
| 273 |
| 274 SendTouch(Press(0)); |
| 275 SendAck(Press(0), ui::ER_UNHANDLED); |
| 276 |
| 277 EXPECT_THAT(GetAndResetDispatchedEvents(), |
| 278 ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
| 279 } |
| 280 |
| 281 } // namespace test |
| 282 } // namespace aura |
OLD | NEW |