// 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/base/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),
        was_fling_(false),
        last_y_(0),
        progress_count_(0),
        end_count_(0) {}
  ~HomeCardGestureManagerTest() override {}

  // testing::Test:
  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::GestureEventDetails details;
    if (type == ui::ET_GESTURE_SCROLL_BEGIN ||
        type == ui::ET_GESTURE_SCROLL_UPDATE)
      details = ui::GestureEventDetails(type, 0, (y - last_y_));
    else
      details = ui::GestureEventDetails(type);
    ui::GestureEvent event(0, y, ui::EF_NONE, base::TimeDelta(), details);
    if (type == ui::ET_GESTURE_SCROLL_BEGIN) {
      // Compute the position that the home card would have wrt to the top of
      // the screen if the screen had screen_bounds().
      HomeCard::State state = HomeCard::Get()->GetState();
      int home_card_top = 0;
      if (state == HomeCard::VISIBLE_BOTTOM)
        home_card_top = screen_bounds().height() - kHomeCardHeight;
      else if (state == HomeCard::VISIBLE_MINIMIZED)
        home_card_top = screen_bounds().height() - kHomeCardMinimizedHeight;

      gfx::Point location = event.location();
      location.set_y(location.y() - home_card_top);
      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);
  }

  int screen_height() const {
    return screen_bounds().height();
  }

  HomeCard::State final_state_;
  HomeCard::State last_from_state_;
  HomeCard::State last_to_state_;
  float last_progress_;
  bool was_fling_;

 private:
  gfx::Rect screen_bounds() const {
    return gfx::Rect(0, 0, 1280, 1024);
  }

  // HomeCardGestureManager::Delegate:
  void OnGestureEnded(HomeCard::State final_state, bool is_fling) override {
    final_state_ = final_state;
    was_fling_ = is_fling;
    ++end_count_;
  }

  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) {
  ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());

  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, 1020);
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1022);
  EXPECT_EQ(2, GetProgressCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
  EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, last_to_state_);
  EXPECT_EQ(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_BOTTOM, last_from_state_);
  EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
  EXPECT_GT(progress_800, last_progress_);

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 810));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
  EXPECT_FALSE(was_fling_);
}

// Test gesture progress when the gesture is initiated when the home card is in
// the centered state.
TEST_F(HomeCardGestureManagerTest, StartCentered) {
  HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED);

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 20));

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 10);
  EXPECT_EQ(1, GetProgressCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
  EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
  EXPECT_EQ(1.0f, last_progress_);

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 700);
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 710);
  EXPECT_EQ(2, GetProgressCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, last_from_state_);
  EXPECT_EQ(HomeCard::VISIBLE_CENTERED, last_to_state_);
  EXPECT_GT(1.0f, last_progress_);
  EXPECT_LT(0.0f, last_progress_);

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 960);
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 960));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);
}

// Test gesture progress when the gesture is initiated when the home card is in
// the centered state.
TEST_F(HomeCardGestureManagerTest, StartBottom) {
  HomeCard::Get()->SetState(HomeCard::VISIBLE_BOTTOM);

  // No changes for slight moves.
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 960);
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 960));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 950));
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 800));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);

  // State change for the bigger moves.
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 850));
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1000);
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 1000));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 850));
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 300);
  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_END, 300));
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_CENTERED, final_state_);
  EXPECT_FALSE(was_fling_);
}

TEST_F(HomeCardGestureManagerTest, FlingUpAtEnd) {
  ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
  EXPECT_EQ(0, GetEndCountAndReset());
  EXPECT_EQ(0, GetProgressCountAndReset());

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
  ProcessFlingGesture(-150.0f);
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
  EXPECT_TRUE(was_fling_);
}

TEST_F(HomeCardGestureManagerTest, FlingDownAtEnd) {
  HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED);

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 20));
  EXPECT_EQ(0, GetEndCountAndReset());
  EXPECT_EQ(0, GetProgressCountAndReset());

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 30);
  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 100);
  ProcessFlingGesture(150.0f);
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
  EXPECT_TRUE(was_fling_);
}

TEST_F(HomeCardGestureManagerTest, WeakFling) {
  ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());

  EXPECT_TRUE(ProcessGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 1020));
  EXPECT_EQ(0, GetEndCountAndReset());
  EXPECT_EQ(0, GetProgressCountAndReset());

  ProcessGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 1010);
  ProcessFlingGesture(-30.0f);
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, final_state_);
  EXPECT_FALSE(was_fling_);
}

// Test the situation where the user intends a single fling but the finger
// touches the screen long enough, so that the home card becomes bigger than the
// height of VISIBLE_BOTTOM state due to the scroll events.
// In this case the fling event should not change the final state from
// VISIBLE_BOTTOM to VISIBLE_CENTERED because the user's intention was a single
// fling. See http://crbug.com/415211
TEST_F(HomeCardGestureManagerTest, FastFling) {
  ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());

  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,
                      screen_height() - kHomeCardHeight);
  ProcessFlingGesture(-150.0f);
  EXPECT_EQ(1, GetEndCountAndReset());
  EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, final_state_);
  EXPECT_TRUE(was_fling_);
}

}  // namespace athena
