Index: ui/aura/gestures/eager_gesture_recognition_aura_unittest.cc |
diff --git a/ui/aura/gestures/eager_gesture_recognition_aura_unittest.cc b/ui/aura/gestures/eager_gesture_recognition_aura_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..76f71a678167128a31a4b47fe9c2382cfb94b0b9 |
--- /dev/null |
+++ b/ui/aura/gestures/eager_gesture_recognition_aura_unittest.cc |
@@ -0,0 +1,282 @@ |
+// Copyright 2013 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 "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest-spi.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/aura/env.h" |
+#include "ui/events/event.h" |
+#include "ui/events/gestures/gesture_configuration.h" |
+#include "ui/events/gestures/gesture_sequence.h" |
+#include "ui/events/gestures/test/eager_gesture_recognition_test_base.h" |
+#include "ui/events/gestures/touch_point_state.h" |
+ |
+using testing::ElementsAre; |
+ |
+namespace aura { |
+namespace test { |
+ |
+namespace { |
+ |
+typedef ui::GestureRecognizer::Gestures Gestures; |
+ |
+} // namespace |
+ |
+class EagerGestureRecognitionAuraTest : |
+ public ui::test::EagerGestureRecognitionTestBase, |
+ public ui::GestureEventQueueDelegate { |
+ public: |
+ EagerGestureRecognitionAuraTest() |
+ : wait_until_event_(ui::ET_UNKNOWN) { |
+ } |
+ |
+ virtual void SetUp() OVERRIDE { |
+ testing::Test::SetUp(); |
+ Env::CreateInstance(); |
+ // TODO - this should probably be refactored out of aura_test_base.cc and |
+ // here. |
+ ui::GestureConfiguration::set_long_press_time_in_seconds(0.01); |
+ ui::GestureConfiguration::set_show_press_delay_in_ms(5); |
+ geq_.reset(new ui::GestureEventQueue(this)); |
+ gesture_sequence_.reset(new ui::GestureSequence(geq_.get())); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ RunAllPendingInMessageLoop(); |
+ Env::DeleteInstance(); |
+ testing::Test::TearDown(); |
+ } |
+ |
+ void SendTouch(const ui::TouchEvent& event) { |
+ geq_->OnTouchEvent(event); |
+ scoped_ptr<Gestures> gestures; |
+ gestures.reset(gesture_sequence_->ProcessTouchEventForGesture(event)); |
+ for (Gestures::iterator it = gestures->begin(); |
+ it != gestures->end(); |
+ ++it) { |
+ geq_->QueueGestureEvent(*it, ui::TouchPointState::WAIT_FOR_ACK); |
+ } |
+ // Ownership has been transferred to the geq. |
+ gestures->weak_clear(); |
+ } |
+ |
+ void SendAck(const ui::TouchEvent& event, |
+ ui::EventResult result) { |
+ geq_->OnTouchEventAck(event, result); |
+ } |
+ |
+ void FakeTimerFiring() { |
+ geq_->TimerFired(); |
+ } |
+ |
+ virtual void DispatchGestureEvent(ui::GestureEvent* event) OVERRIDE { |
+ dispatched_events_.push_back(event->type()); |
+ if (wait_until_event_ == event->type() && run_loop_) { |
+ run_loop_->Quit(); |
+ wait_until_event_ = ui::ET_UNKNOWN; |
+ } |
+ } |
+ |
+ std::vector<ui::EventType> GetAndResetDispatchedEvents() { |
+ std::vector<ui::EventType> tmp; |
+ dispatched_events_.swap(tmp); |
+ return tmp; |
+ } |
+ |
+ void RunAllPendingInMessageLoop() { |
+ ui_message_loop_.RunUntilIdle(); |
+ } |
+ |
+ void WaitUntilReceivedGesture(ui::EventType type) { |
+ wait_until_event_ = type; |
+ run_loop_.reset(new base::RunLoop( |
+ Env::GetInstance()->GetDispatcher())); |
+ run_loop_->Run(); |
+ } |
+ |
+ private: |
+ scoped_ptr<ui::GestureSequence> gesture_sequence_; |
+ scoped_ptr<ui::GestureEventQueue> geq_; |
+ std::vector<ui::EventType> dispatched_events_; |
+ |
+ base::MessageLoopForUI ui_message_loop_; |
+ |
+ scoped_ptr<base::RunLoop> run_loop_; |
+ ui::EventType wait_until_event_; |
+}; |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, BasicPress) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, BasicTap) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ |
+ SendTouch(Release(0)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre()); |
+ SendAck(Release(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP, ui::ET_GESTURE_END)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, DISABLED_ConsumedRelease) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ |
+ SendTouch(Release(0)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ SendAck(Release(0), ui::ER_CONSUMED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP_CANCEL, ui::ET_GESTURE_END)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, TwoFingerTap) { |
+ SendTouch(Press(0)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ |
+ SendTouch(Press(1)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre()); |
+ |
+ SendAck(Press(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP_CANCEL, ui::ET_GESTURE_BEGIN)); |
+ |
+ SendTouch(Release(1)); |
+ SendAck(Release(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TWO_FINGER_TAP, ui::ET_GESTURE_END)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, TwoFingerConsumed) { |
+ SendTouch(Press(0)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ |
+ SendTouch(Press(1)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ SendAck(Press(1), ui::ER_CONSUMED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre()); |
+ |
+ SendTouch(Release(1)); |
+ SendAck(Release(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre()); |
+ |
+ SendTouch(Press(1)); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ SendAck(Press(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_PINCH_BEGIN)); |
+ |
+ SendTouch(Release(1)); |
+ SendAck(Release(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_PINCH_END, ui::ET_GESTURE_END)); |
+} |
+ |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, SimpleScroll) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ SendTouch(Move(0)); |
+ SendAck(Move(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP_CANCEL, |
+ ui::ET_GESTURE_SCROLL_BEGIN, |
+ ui::ET_GESTURE_SCROLL_UPDATE)); |
+} |
+ |
+// Ensures that if a one finger scroll has a move consumed, you can't transition |
+// into a pinch. |
+TEST_F(EagerGestureRecognitionAuraTest, ConsumedScrollToPinch) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ |
+ SendTouch(Move(0)); |
+ SendAck(Move(0), ui::ER_CONSUMED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP_CANCEL)); |
+ |
+ SendTouch(Press(1)); |
+ SendAck(Press(1), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, SuccessfulLongPress) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_SHOW_PRESS)); |
+ WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_LONG_PRESS)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, TimedOutLongPress) { |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+ FakeTimerFiring(); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_SHOW_PRESS)); |
+ |
+ SendTouch(Release(0)); |
+ SendAck(Release(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_TAP, ui::ET_GESTURE_END)); |
+ |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+} |
+ |
+TEST_F(EagerGestureRecognitionAuraTest, ConsumedLongPress) { |
+ SendTouch(Press(0)); |
+ FakeTimerFiring(); |
+ FakeTimerFiring(); |
+ SendAck(Press(0), ui::ER_CONSUMED); |
+ SendTouch(Release(0)); |
+ SendAck(Release(0), ui::ER_UNHANDLED); |
+ |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), ElementsAre()); |
+ |
+ SendTouch(Press(0)); |
+ SendAck(Press(0), ui::ER_UNHANDLED); |
+ |
+ EXPECT_THAT(GetAndResetDispatchedEvents(), |
+ ElementsAre(ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN)); |
+} |
+ |
+} // namespace test |
+} // namespace aura |