| 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
|
|
|