blob: 409a24957aa719374df6f4886d3b954eab552e2f [file] [log] [blame]
// Copyright 2014 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 "athena/home/home_card_gesture_manager.h"
#include "athena/home/home_card_constants.h"
#include "athena/home/public/home_card.h"
#include "athena/test/athena_test_base.h"
#include "base/time/time.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
namespace athena {
class HomeCardGestureManagerTest : public test::AthenaTestBase,
public HomeCardGestureManager::Delegate {
public:
HomeCardGestureManagerTest()
: final_state_(HomeCard::HIDDEN),
last_from_state_(HomeCard::HIDDEN),
last_to_state_(HomeCard::HIDDEN),
last_progress_(0.0f),
last_y_(0),
progress_count_(0),
end_count_(0) {}
virtual ~HomeCardGestureManagerTest() {}
// testing::Test:
virtual void SetUp() OVERRIDE {
test::AthenaTestBase::SetUp();
gesture_manager_.reset(new HomeCardGestureManager(this, screen_bounds()));
}
protected:
int GetEndCountAndReset() {
int result = end_count_;
end_count_ = 0;
return result;
}
int GetProgressCountAndReset() {
int result = progress_count_;
progress_count_ = 0;
return result;
}
// Process a gesture event for our use case.
bool ProcessGestureEvent(ui::EventType type, int y) {
ui::GestureEvent event(0, y, ui::EF_NONE, base::TimeDelta(),
ui::GestureEventDetails(type, 0, (y - last_y_)));
// Assumes the initial location is based on minimized height.
if (type == ui::ET_GESTURE_SCROLL_BEGIN) {
gfx::Point location = event.location();
location.set_y(
location.y() - (screen_bounds().bottom() - kHomeCardMinimizedHeight));
event.set_location(location);
}
gesture_manager_->ProcessGestureEvent(&event);
last_y_ = y;
return event.handled();
}
void ProcessFlingGesture(float velocity) {
ui::GestureEvent event(0, last_y_, ui::EF_NONE, base::TimeDelta(),
ui::GestureEventDetails(
ui::ET_SCROLL_FLING_START, 0, velocity));
gesture_manager_->ProcessGestureEvent(&event);
}
HomeCard::State final_state_;
HomeCard::State last_from_state_;
HomeCard::State last_to_state_;
float last_progress_;
private:
gfx::Rect screen_bounds() const {
return gfx::Rect(0, 0, 1280, 1024);
}
// HomeCardGestureManager::Delegate:
virtual void OnGestureEnded(HomeCard::State final_state) OVERRIDE {
final_state_ = final_state;
++end_count_;
}
virtual void OnGestureProgressed(HomeCard::State from_state,
HomeCard::State to_state,
float progress) OVERRIDE {
last_from_state_ = from_state;
last_to_state_ = to_state;
last_progress_ = progress;
++progress_count_;
}
int last_y_;
int progress_count_;
int end_count_;
scoped_ptr<HomeCardGestureManager> gesture_manager_;
DISALLOW_COPY_AND_ASSIGN(HomeCardGestureManagerTest);
};
TEST_F(HomeCardGestureManagerTest, Basic) {
EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
EXPECT_EQ(0, GetEndCountAndReset());
EXPECT_EQ(0, GetProgressCountAndReset());
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1019);
EXPECT_EQ(1, GetProgressCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_from_state_);
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_to_state_);
EXPECT_GT(1.0f, last_progress_);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
float progress_1010 = last_progress_;
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1008);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1000);
EXPECT_EQ(3, GetProgressCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_from_state_);
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_to_state_);
EXPECT_LT(progress_1010, last_progress_);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 900);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 800);
EXPECT_EQ(2, GetProgressCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
float progress_800 = last_progress_;
EXPECT_GT(1.0f, last_progress_);
EXPECT_LT(0.0f, last_progress_);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 790);
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
EXPECT_LT(progress_800, last_progress_);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 810);
EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_from_state_);
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_to_state_);
EXPECT_GT(progress_800, (1.0f - last_progress_));
EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 810));
EXPECT_EQ(1, GetEndCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
}
TEST_F(HomeCardGestureManagerTest, FlingUpAtEnd) {
EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
EXPECT_EQ(0, GetEndCountAndReset());
EXPECT_EQ(0, GetProgressCountAndReset());
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 800);
ProcessFlingGesture(-150.0f);
EXPECT_EQ(1, GetEndCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_CENTERED, final_state_);
}
TEST_F(HomeCardGestureManagerTest, FlingDownAtEnd) {
EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
EXPECT_EQ(0, GetEndCountAndReset());
EXPECT_EQ(0, GetProgressCountAndReset());
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 800);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 200);
ProcessFlingGesture(150.0f);
EXPECT_EQ(1, GetEndCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
}
TEST_F(HomeCardGestureManagerTest, WeakFling) {
EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
EXPECT_EQ(0, GetEndCountAndReset());
EXPECT_EQ(0, GetProgressCountAndReset());
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 800);
ProcessFlingGesture(-30.0f);
EXPECT_EQ(1, GetEndCountAndReset());
EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
}
} // namespace athena