// 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 "ui/views/controls/button/menu_button.h"

#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/events/test/event_generator.h"
#include "ui/views/controls/button/menu_button_listener.h"
#include "ui/views/test/views_test_base.h"

using base::ASCIIToUTF16;

namespace views {

class MenuButtonTest : public ViewsTestBase {
 public:
  MenuButtonTest() : widget_(NULL), button_(NULL) {}
  virtual ~MenuButtonTest() {}

  virtual void TearDown() OVERRIDE {
    if (widget_ && !widget_->IsClosed())
      widget_->Close();

    ViewsTestBase::TearDown();
  }

  Widget* widget() { return widget_; }
  MenuButton* button() { return button_; }

 protected:
  // Creates a MenuButton with no button listener.
  void CreateMenuButtonWithNoListener() {
    CreateMenuButton(NULL, NULL);
  }

  // Creates a MenuButton with a ButtonListener. In this case, the MenuButton
  // acts like a regular button.
  void CreateMenuButtonWithButtonListener(ButtonListener* button_listener) {
    CreateMenuButton(button_listener, NULL);
  }

  // Creates a MenuButton with a MenuButtonListener. In this case, when the
  // MenuButton is pushed, it notifies the MenuButtonListener to open a
  // drop-down menu.
  void CreateMenuButtonWithMenuButtonListener(
      MenuButtonListener* menu_button_listener) {
    CreateMenuButton(NULL, menu_button_listener);
  }

 private:
  void CreateMenuButton(ButtonListener* button_listener,
                        MenuButtonListener* menu_button_listener) {
    CreateWidget();

    const base::string16 label(ASCIIToUTF16("button"));
    button_ =
        new MenuButton(button_listener, label, menu_button_listener, false);
    button_->SetBoundsRect(gfx::Rect(0, 0, 200, 20));
    widget_->SetContentsView(button_);

    widget_->Show();
  }

  void CreateWidget() {
    DCHECK(!widget_);

    widget_ = new Widget;
    Widget::InitParams params =
        CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
    params.bounds = gfx::Rect(0, 0, 200, 200);
    widget_->Init(params);
  }

  Widget* widget_;
  MenuButton* button_;
};

class TestButtonListener : public ButtonListener {
 public:
  TestButtonListener()
      : last_sender_(NULL),
        last_sender_state_(Button::STATE_NORMAL),
        last_event_type_(ui::ET_UNKNOWN) {}
  virtual ~TestButtonListener() {}

  virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE {
    last_sender_ = sender;
    CustomButton* custom_button = CustomButton::AsCustomButton(sender);
    DCHECK(custom_button);
    last_sender_state_ = custom_button->state();
    last_event_type_ = event.type();
  }

  Button* last_sender() { return last_sender_; }
  Button::ButtonState last_sender_state() { return last_sender_state_; }
  ui::EventType last_event_type() { return last_event_type_; }

 private:
  Button* last_sender_;
  Button::ButtonState last_sender_state_;
  ui::EventType last_event_type_;

  DISALLOW_COPY_AND_ASSIGN(TestButtonListener);
};

class TestMenuButtonListener : public MenuButtonListener {
 public:
  TestMenuButtonListener() {}
  virtual ~TestMenuButtonListener() {}

  virtual void OnMenuButtonClicked(View* source,
                                   const gfx::Point& /*point*/) OVERRIDE {
    last_source_ = source;
    CustomButton* custom_button = CustomButton::AsCustomButton(source);
    DCHECK(custom_button);
    last_source_state_ = custom_button->state();
  }

  View* last_source() { return last_source_; }
  Button::ButtonState last_source_state() { return last_source_state_; }

 private:
  View* last_source_;
  Button::ButtonState last_source_state_;
};

// Tests if the listener is notified correctly, when a mouse click happens on a
// MenuButton that has a regular ButtonListener.
TEST_F(MenuButtonTest, ActivateNonDropDownOnMouseClick) {
  scoped_ptr<TestButtonListener> button_listener(new TestButtonListener);
  CreateMenuButtonWithButtonListener(button_listener.get());

  ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());

  generator.set_current_location(gfx::Point(10, 10));
  generator.ClickLeftButton();

  // Check that MenuButton has notified the listener on mouse-released event,
  // while it was in hovered state.
  EXPECT_EQ(button(), button_listener->last_sender());
  EXPECT_EQ(ui::ET_MOUSE_RELEASED, button_listener->last_event_type());
  EXPECT_EQ(Button::STATE_HOVERED, button_listener->last_sender_state());
}

// Tests if the listener is notified correctly when a gesture tap happens on a
// MenuButton that has a regular ButtonListener.
TEST_F(MenuButtonTest, ActivateNonDropDownOnGestureTap) {
  scoped_ptr<TestButtonListener> button_listener(new TestButtonListener);
  CreateMenuButtonWithButtonListener(button_listener.get());

  ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
  generator.GestureTapAt(gfx::Point(10, 10));

  // Check that MenuButton has notified the listener on gesture tap event, while
  // it was in hovered state.
  EXPECT_EQ(button(), button_listener->last_sender());
  EXPECT_EQ(ui::ET_GESTURE_TAP, button_listener->last_event_type());
  EXPECT_EQ(Button::STATE_HOVERED, button_listener->last_sender_state());
}

// Tests if the listener is notified correctly when a mouse click happens on a
// MenuButton that has a MenuButtonListener.
TEST_F(MenuButtonTest, ActivateDropDownOnMouseClick) {
  scoped_ptr<TestMenuButtonListener> menu_button_listener(
      new TestMenuButtonListener);
  CreateMenuButtonWithMenuButtonListener(menu_button_listener.get());

  ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());

  generator.set_current_location(gfx::Point(10, 10));
  generator.ClickLeftButton();

  // Check that MenuButton has notified the listener, while it was in pressed
  // state.
  EXPECT_EQ(button(), menu_button_listener->last_source());
  EXPECT_EQ(Button::STATE_PRESSED, menu_button_listener->last_source_state());
}

// Tests if the listener is notified correctly when a gesture tap happens on a
// MenuButton that has a MenuButtonListener.
TEST_F(MenuButtonTest, ActivateDropDownOnGestureTap) {
  scoped_ptr<TestMenuButtonListener> menu_button_listener(
      new TestMenuButtonListener);
  CreateMenuButtonWithMenuButtonListener(menu_button_listener.get());

  ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
  generator.GestureTapAt(gfx::Point(10, 10));

  // Check that MenuButton has notified the listener, while it was in pressed
  // state.
  EXPECT_EQ(button(), menu_button_listener->last_source());
  EXPECT_EQ(Button::STATE_PRESSED, menu_button_listener->last_source_state());
}

// Test that the MenuButton stays pressed while there are any PressedLocks.
TEST_F(MenuButtonTest, MenuButtonPressedLock) {
  CreateMenuButtonWithNoListener();

  // Move the mouse over the button; the button should be in a hovered state.
  ui::test::EventGenerator generator(GetContext(), widget()->GetNativeWindow());
  generator.MoveMouseTo(gfx::Point(10, 10));
  EXPECT_EQ(Button::STATE_HOVERED, button()->state());

  // Introduce a PressedLock, which should make the button pressed.
  scoped_ptr<MenuButton::PressedLock> pressed_lock1(
      new MenuButton::PressedLock(button()));
  EXPECT_EQ(Button::STATE_PRESSED, button()->state());

  // Even if we move the mouse outside of the button, it should remain pressed.
  generator.MoveMouseTo(gfx::Point(300, 10));
  EXPECT_EQ(Button::STATE_PRESSED, button()->state());

  // Creating a new lock should obviously keep the button pressed.
  scoped_ptr<MenuButton::PressedLock> pressed_lock2(
      new MenuButton::PressedLock(button()));
  EXPECT_EQ(Button::STATE_PRESSED, button()->state());

  // The button should remain pressed while any locks are active.
  pressed_lock1.reset();
  EXPECT_EQ(Button::STATE_PRESSED, button()->state());

  // Reseting the final lock should return the button's state to normal...
  pressed_lock2.reset();
  EXPECT_EQ(Button::STATE_NORMAL, button()->state());

  // ...And it should respond to mouse movement again.
  generator.MoveMouseTo(gfx::Point(10, 10));
  EXPECT_EQ(Button::STATE_HOVERED, button()->state());
}

}  // namespace views
