// Copyright 2018 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 "ash/login/ui/login_user_menu_view.h"
#include "ash/login/ui/login_button.h"
#include "ash/login/ui/login_test_base.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/strings/utf_string_conversions.h"
#include "components/user_manager/user_type.h"
#include "ui/events/test/event_generator.h"
#include "ui/views/animation/test/ink_drop_host_view_test_api.h"
#include "ui/views/layout/box_layout.h"

namespace ash {

namespace {
constexpr int kBubbleAnchorViewSizeDp = 100;
}  // namespace

using LoginUserMenuViewTest = LoginTestBase;

TEST_F(LoginUserMenuViewTest, RemoveUserRequiresTwoActivations) {
  auto* anchor = new views::View;
  anchor->SetLayoutManager(
      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
  SetWidget(CreateWidgetWithContent(anchor));

  bool remove_warning_called = false;
  bool remove_called = false;

  auto* bubble = new LoginUserMenuView(
      base::string16(), base::string16(), user_manager::USER_TYPE_REGULAR,
      false /*is_owner*/, anchor, nullptr /*bubble_opener*/,
      true /*show_remove_user*/,
      base::BindRepeating([](bool* warning_called) { *warning_called = true; },
                          &remove_warning_called),
      base::BindRepeating([](bool* remove_called) { *remove_called = true; },
                          &remove_called));
  bubble->Show();

  EXPECT_TRUE(bubble->IsVisible());

  // Focus the remove user button (the menu should forward focus to the remove
  // button).
  bubble->RequestFocus();

  GetEventGenerator()->PressKey(ui::KeyboardCode::VKEY_RETURN, 0);

  // First click calls remove warning only
  EXPECT_TRUE(remove_warning_called);
  EXPECT_FALSE(remove_called);
  remove_warning_called = false;

  // Second click calls remove only
  GetEventGenerator()->PressKey(ui::KeyboardCode::VKEY_RETURN, 0);
  EXPECT_FALSE(remove_warning_called);
  EXPECT_TRUE(remove_called);
}

TEST_F(LoginUserMenuViewTest, LongUserNameAndEmailLaidOutCorrectly) {
  auto* anchor = new views::View;
  anchor->SetLayoutManager(
      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
  SetWidget(CreateWidgetWithContent(anchor));

  auto* bubble = new LoginUserMenuView(
      base::UTF8ToUTF16("NedHasAReallyLongName StarkHasAReallyLongName"),
      base::UTF8ToUTF16("reallyreallyextralonggaianame@gmail.com"),
      user_manager::USER_TYPE_REGULAR, false /*is_owner*/, anchor,
      nullptr /*bubble_opener*/, true /*show_remove_user*/, base::DoNothing(),
      base::DoNothing());

  bubble->Show();

  EXPECT_TRUE(bubble->IsVisible());

  LoginUserMenuView::TestApi test_api(bubble);
  views::View* remove_user_button = test_api.remove_user_button();
  views::View* remove_user_confirm_data = test_api.remove_user_confirm_data();
  views::View* username_label = test_api.username_label();

  EXPECT_TRUE(bubble->GetBoundsInScreen().Contains(
      remove_user_button->GetBoundsInScreen()));
  EXPECT_FALSE(remove_user_confirm_data->visible());
  EXPECT_TRUE(username_label->visible());

  bubble->RequestFocus();
  EXPECT_TRUE(remove_user_button->HasFocus());

  GetEventGenerator()->PressKey(ui::KeyboardCode::VKEY_RETURN, 0);
  EXPECT_TRUE(username_label->visible());
  EXPECT_TRUE(remove_user_confirm_data->visible());
  EXPECT_TRUE(remove_user_button->GetBoundsInScreen().y() >=
              remove_user_confirm_data->GetBoundsInScreen().y() +
                  remove_user_confirm_data->GetBoundsInScreen().height());
  EXPECT_TRUE(bubble->GetBoundsInScreen().Contains(
      remove_user_button->GetBoundsInScreen()));
}

TEST_F(LoginUserMenuViewTest, LoginButtonRipple) {
  auto* container = new views::View();
  container->SetLayoutManager(
      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));

  LoginButton* bubble_opener = new LoginButton(nullptr /*listener*/);
  bubble_opener->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
  bubble_opener->SetPreferredSize(
      gfx::Size(kBubbleAnchorViewSizeDp, kBubbleAnchorViewSizeDp));

  container->AddChildView(bubble_opener);
  SetWidget(CreateWidgetWithContent(container));

  views::test::InkDropHostViewTestApi ink_drop_api(bubble_opener);
  EXPECT_EQ(ink_drop_api.ink_drop_mode(),
            views::InkDropHostView::InkDropMode::ON);
  EXPECT_TRUE(ink_drop_api.HasInkDrop());

  auto* bubble = new LoginUserMenuView(
      base::string16(), base::string16(), user_manager::USER_TYPE_REGULAR,
      false /*is_owner*/, container /*anchor*/, bubble_opener,
      true /*show_remove_user*/, base::DoNothing(), base::DoNothing());

  bubble->Show();
  EXPECT_TRUE(bubble->IsVisible());
  EXPECT_TRUE(ink_drop_api.HasInkDrop());
  EXPECT_EQ(ink_drop_api.GetInkDrop()->GetTargetInkDropState(),
            views::InkDropState::ACTIVATED);
  EXPECT_TRUE(ink_drop_api.GetInkDrop()->IsHighlightFadingInOrVisible());

  bubble->Hide();
  EXPECT_FALSE(bubble->IsVisible());
  EXPECT_EQ(ink_drop_api.GetInkDrop()->GetTargetInkDropState(),
            views::InkDropState::HIDDEN);
  EXPECT_FALSE(ink_drop_api.GetInkDrop()->IsHighlightFadingInOrVisible());
}

}  // namespace ash
