// 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/wallpaper/wallpaper_window_state_manager.h"

#include <memory>

#include "ash/test/ash_test_base.h"
#include "ash/wm/window_state.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "ui/aura/window.h"

namespace ash {
namespace {

constexpr char kTestAccount[] = "user@test.com";

std::string GetUserIdHash(const std::string& user_id) {
  return user_id + "-hash";
}

class WallpaperWindowStateManagerTest : public AshTestBase {
 public:
  WallpaperWindowStateManagerTest()
      : window_state_manager_(std::make_unique<WallpaperWindowStateManager>()) {
  }

  ~WallpaperWindowStateManagerTest() override = default;

 protected:
  std::unique_ptr<WallpaperWindowStateManager> window_state_manager_;

 private:
  DISALLOW_COPY_AND_ASSIGN(WallpaperWindowStateManagerTest);
};

TEST_F(WallpaperWindowStateManagerTest, HideAndRestoreWindows) {
  SimulateUserLogin(kTestAccount);
  std::unique_ptr<aura::Window> wallpaper_picker_window(
      CreateTestWindowInShellWithId(0));
  std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
  std::unique_ptr<aura::Window> window2(CreateTestWindowInShellWithId(2));
  std::unique_ptr<aura::Window> window3(CreateTestWindowInShellWithId(3));
  std::unique_ptr<aura::Window> window4(CreateTestWindowInShellWithId(4));

  wm::WindowState* wallpaper_picker_window_state =
      wm::GetWindowState(wallpaper_picker_window.get());
  wm::WindowState* window1_state = wm::GetWindowState(window1.get());
  wm::WindowState* window2_state = wm::GetWindowState(window2.get());
  wm::WindowState* window3_state = wm::GetWindowState(window3.get());
  wm::WindowState* window4_state = wm::GetWindowState(window4.get());

  // Window 1 starts maximized and window 3 starts minimized.
  window1_state->Maximize();
  window3_state->Minimize();
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_FALSE(window1_state->IsMinimized());
  EXPECT_FALSE(window2_state->IsMinimized());
  EXPECT_TRUE(window3_state->IsMinimized());
  EXPECT_FALSE(window4_state->IsMinimized());

  // Activates the wallpaper picker window and call the minimize function.
  wallpaper_picker_window_state->Activate();
  EXPECT_TRUE(wallpaper_picker_window_state->IsActive());
  window_state_manager_->MinimizeInactiveWindows(GetUserIdHash(kTestAccount));

  // All windows except the wallpaper picker should be minimized.
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_TRUE(window1_state->IsMinimized());
  EXPECT_TRUE(window2_state->IsMinimized());
  EXPECT_TRUE(window3_state->IsMinimized());
  EXPECT_TRUE(window4_state->IsMinimized());

  // Activates window 4 and then minimizes it.
  window4_state->Activate();
  window4_state->Minimize();

  // Destroy wallpaper picker window and call the restore function.
  wallpaper_picker_window.reset();
  window_state_manager_->RestoreMinimizedWindows(GetUserIdHash(kTestAccount));

  // Window 1 should be restored to maximized.
  EXPECT_TRUE(window1_state->IsMaximized());
  // Window 2 should be restored and is no longer minimized.
  EXPECT_FALSE(window2_state->IsMinimized());
  // Window 3 should remain minimized because it was minimized before wallpaper
  // picker was open.
  EXPECT_TRUE(window3_state->IsMinimized());
  // Window 4 should remain minimized since user interacted with it (i.e.
  // explicitly minimized it) while wallpaper picker was open.
  EXPECT_TRUE(window4_state->IsMinimized());
}

// Test for multiple calls to |MinimizeInactiveWindows| before calling
// |RestoreMinimizedWindows|:
// 1. If none of the windows changed their states, the following calls are
//    no-op.
// 2. If some windows are unminimized by user, the following call will minimize
//    the unminimized windows again.
TEST_F(WallpaperWindowStateManagerTest, HideAndManualUnminimizeWindows) {
  SimulateUserLogin(kTestAccount);
  std::unique_ptr<aura::Window> wallpaper_picker_window(
      CreateTestWindowInShellWithId(0));
  std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));

  wm::WindowState* wallpaper_picker_window_state =
      wm::GetWindowState(wallpaper_picker_window.get());
  wm::WindowState* window1_state = wm::GetWindowState(window1.get());

  // Activates the wallpaper picker window and call the minimize function.
  wallpaper_picker_window_state->Activate();
  EXPECT_TRUE(wallpaper_picker_window_state->IsActive());
  window_state_manager_->MinimizeInactiveWindows(GetUserIdHash(kTestAccount));

  // All windows except the wallpaper picker should be minimized.
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_TRUE(window1_state->IsMinimized());

  // Calling minimize function again should be an no-op if window state didn't
  // change.
  window_state_manager_->MinimizeInactiveWindows(GetUserIdHash(kTestAccount));
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_TRUE(window1_state->IsMinimized());

  // Manually unminimize window 1.
  window1_state->Unminimize();
  EXPECT_FALSE(window1_state->IsMinimized());

  // Call the minimize function and verify window 1 should be minimized again.
  wallpaper_picker_window_state->Activate();
  window_state_manager_->MinimizeInactiveWindows(GetUserIdHash(kTestAccount));
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_TRUE(window1_state->IsMinimized());

  // Destroy wallpaper picker window and call the restore function.
  wallpaper_picker_window.reset();
  window_state_manager_->RestoreMinimizedWindows(GetUserIdHash(kTestAccount));

  // Windows 1 should no longer be minimized.
  EXPECT_FALSE(window1_state->IsMinimized());
}

// Test that invisible windows (e.g. those belonging to an inactive user) should
// not be affected by |MinimizeInactiveWindows| or |RestoreMinimizedWindows|.
TEST_F(WallpaperWindowStateManagerTest, IgnoreInvisibleWindows) {
  SimulateUserLogin(kTestAccount);
  std::unique_ptr<aura::Window> wallpaper_picker_window(
      CreateTestWindowInShellWithId(0));
  std::unique_ptr<aura::Window> window1(CreateTestWindowInShellWithId(1));
  std::unique_ptr<aura::Window> window2(CreateTestWindowInShellWithId(2));

  wm::WindowState* wallpaper_picker_window_state =
      wm::GetWindowState(wallpaper_picker_window.get());
  wm::WindowState* window1_state = wm::GetWindowState(window1.get());
  wm::WindowState* window2_state = wm::GetWindowState(window2.get());

  window2->Hide();
  EXPECT_FALSE(window2->IsVisible());

  // Activates the wallpaper picker window and call the minimize function.
  wallpaper_picker_window_state->Activate();
  EXPECT_TRUE(wallpaper_picker_window_state->IsActive());
  window_state_manager_->MinimizeInactiveWindows(GetUserIdHash(kTestAccount));

  // The wallpaper picker window should not be minimized, and window 1 should be
  // minimized.
  EXPECT_FALSE(wallpaper_picker_window_state->IsMinimized());
  EXPECT_TRUE(window1_state->IsMinimized());
  // Window 2 should stay unminimized and invisible.
  EXPECT_FALSE(window2_state->IsMinimized());
  EXPECT_FALSE(window2->IsVisible());

  // Destroy wallpaper picker window and call the restore function.
  wallpaper_picker_window.reset();
  window_state_manager_->RestoreMinimizedWindows(GetUserIdHash(kTestAccount));

  // Windows 1 should no longer be minimized.
  EXPECT_FALSE(window1_state->IsMinimized());
  // Window 2 should stay unminimized and invisible.
  EXPECT_FALSE(window2_state->IsMinimized());
  EXPECT_FALSE(window2->IsVisible());
}

}  // namespace
}  // namespace ash
