// Copyright 2016 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/wm/screen_pinning_controller.h"

#include <vector>

#include "ash/accelerators/accelerator_controller.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/wm/screen_pinning_controller.h"
#include "ash/wm/window_state.h"
#include "ash/wm/window_util.h"
#include "ash/wm/wm_event.h"
#include "base/stl_util.h"
#include "ui/aura/window.h"

namespace ash {
namespace {

int FindIndex(const std::vector<aura::Window*>& windows,
              const aura::Window* target) {
  auto iter = std::find(windows.begin(), windows.end(), target);
  return iter != windows.end() ? iter - windows.begin() : -1;
}

}  // namespace

using ScreenPinningControllerTest = AshTestBase;

TEST_F(ScreenPinningControllerTest, IsPinned) {
  aura::Window* w1 = CreateTestWindowInShellWithId(0);
  wm::ActivateWindow(w1);

  wm::PinWindow(w1, /* trusted */ false);
  EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());
}

TEST_F(ScreenPinningControllerTest, OnlyOnePinnedWindow) {
  aura::Window* w1 = CreateTestWindowInShellWithId(0);
  aura::Window* w2 = CreateTestWindowInShellWithId(1);
  wm::ActivateWindow(w1);

  wm::PinWindow(w1, /* trusted */ false);
  EXPECT_TRUE(wm::GetWindowState(w1)->IsPinned());
  EXPECT_FALSE(wm::GetWindowState(w2)->IsPinned());

  // Prohibit to pin two (or more) windows.
  wm::PinWindow(w2, /* trusted */ false);
  EXPECT_TRUE(wm::GetWindowState(w1)->IsPinned());
  EXPECT_FALSE(wm::GetWindowState(w2)->IsPinned());
}

TEST_F(ScreenPinningControllerTest, FullscreenInPinnedMode) {
  aura::Window* w1 = CreateTestWindowInShellWithId(0);
  aura::Window* w2 = CreateTestWindowInShellWithId(1);
  wm::ActivateWindow(w1);

  wm::PinWindow(w1, /* trusted */ false);
  {
    // Window w1 should be in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index1, index2);
  }

  // Set w2 to fullscreen.
  {
    wm::ActivateWindow(w2);
    const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    wm::GetWindowState(w2)->OnWMEvent(&event);
  }
  {
    // Verify that w1 is still in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index1, index2);
  }

  // Unset w2's fullscreen.
  {
    wm::ActivateWindow(w2);
    const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    wm::GetWindowState(w2)->OnWMEvent(&event);
  }
  {
    // Verify that w1 is still in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index1, index2);
  }

  // Maximize w2.
  {
    wm::ActivateWindow(w2);
    const wm::WMEvent event(wm::WM_EVENT_TOGGLE_MAXIMIZE);
    wm::GetWindowState(w2)->OnWMEvent(&event);
  }
  {
    // Verify that w1 is still in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index1, index2);
  }

  // Unset w2's maximize.
  {
    wm::ActivateWindow(w2);
    const wm::WMEvent event(wm::WM_EVENT_TOGGLE_MAXIMIZE);
    wm::GetWindowState(w2)->OnWMEvent(&event);
  }
  {
    // Verify that w1 is still in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index1, index2);
  }

  // Restore w1.
  wm::GetWindowState(w1)->Restore();

  // Now, fullscreen-ize w2 should put it in front of w1.
  {
    wm::ActivateWindow(w2);
    const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
    wm::GetWindowState(w2)->OnWMEvent(&event);
  }
  {
    // Verify that w1 is still in front of w2.
    std::vector<aura::Window*> siblings = w1->parent()->children();
    int index1 = FindIndex(siblings, w1);
    int index2 = FindIndex(siblings, w2);
    EXPECT_NE(-1, index1);
    EXPECT_NE(-1, index2);
    EXPECT_GT(index2, index1);
  }
}

TEST_F(ScreenPinningControllerTest, TrustedPinnedWithAccelerator) {
  aura::Window* w1 = CreateTestWindowInShellWithId(0);
  wm::ActivateWindow(w1);

  wm::PinWindow(w1, /* trusted */ true);
  EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());

  Shell::Get()->accelerator_controller()->PerformActionIfEnabled(UNPIN);
  // The UNPIN accelerator key is disabled for trusted pinned and the window
  // must be still pinned.
  EXPECT_TRUE(Shell::Get()->screen_pinning_controller()->IsPinned());
}

}  // namespace ash
