Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Unified Diff: ui/aura/gestures/eager_gesture_recognition_aura_unittest.cc

Issue 101933004: Eager Gesture Recognizer (WIP) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Starting work on Android. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura/aura.gyp ('k') | ui/aura/gestures/gesture_recognizer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/aura/aura.gyp ('k') | ui/aura/gestures/gesture_recognizer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698