// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/browser_finder.h"

#include "ash/wm/desks/desk.h"
#include "ash/wm/desks/desks_controller.h"
#include "ash/wm/desks/desks_test_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/browser_test.h"

namespace {

class BrowserFinderWithDesksTest : public InProcessBrowserTest {
 public:
  BrowserFinderWithDesksTest() = default;

  BrowserFinderWithDesksTest(const BrowserFinderWithDesksTest&) = delete;
  BrowserFinderWithDesksTest& operator=(const BrowserFinderWithDesksTest&) =
      delete;

  ~BrowserFinderWithDesksTest() override = default;

  // InProcessBrowserTest:
  void SetUpOnMainThread() override {
    InProcessBrowserTest::SetUpOnMainThread();
    // Create three desks (two other than the default).
    auto* desks_controller = ash::DesksController::Get();
    desks_controller->NewDesk(ash::DesksCreationRemovalSource::kButton);
    desks_controller->NewDesk(ash::DesksCreationRemovalSource::kButton);
  }

  void ActivateBrowser(BrowserWindowInterface* browser) {
    browser->GetWindow()->Activate();
  }

  Browser* CreateTestBrowser() {
    Browser* new_browser = CreateBrowser(browser()->profile());
    new_browser->window()->Show();
    ActivateBrowser(new_browser);
    return new_browser;
  }
};

}  // namespace

IN_PROC_BROWSER_TEST_F(BrowserFinderWithDesksTest, FindAnyBrowser) {
  auto* desks_controller = ash::DesksController::Get();
  ASSERT_EQ(3u, desks_controller->desks().size());
  auto* desk_1 = desks_controller->desks()[0].get();
  auto* desk_2 = desks_controller->desks()[1].get();
  auto* desk_3 = desks_controller->desks()[2].get();

  BrowserWindowInterface* const browser_1 = CreateTestBrowser();
  CloseBrowserSynchronously(browser());
  SetBrowser(browser_1);
  auto* window_1 = browser_1->GetWindow()->GetNativeWindow();
  EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile()));
  EXPECT_TRUE(desk_1->is_active());
  EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1));
  EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true));

  // Switch to desk_2 and create a browser there.
  ash::ActivateDesk(desk_2);
  EXPECT_TRUE(desk_2->is_active());
  Browser* browser_2 = CreateTestBrowser();
  auto* window_2 = browser_2->window()->GetNativeWindow();
  EXPECT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
  EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_1));
  EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_2));

  // FindAnyBrowser should return the MRU browser, which is browser_2 in this
  // case.
  EXPECT_EQ(browser_2, chrome::FindAnyBrowser(browser()->profile(), true));

  // Switch to desk_3, no browsers on this desk, however, FindAnyBrowser should
  // still return browser_2.
  ash::ActivateDesk(desk_3);
  EXPECT_TRUE(desk_3->is_active());
  EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_1));
  EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_2));
  EXPECT_EQ(browser_2, chrome::FindAnyBrowser(browser()->profile(), true));

  // Switch to desk_1 by activating browser_1. When we switch back to desk_3,
  // FindAnyBrowser() will return browser_1 as the MRU browser.
  ash::DeskSwitchAnimationWaiter waiter;
  ActivateBrowser(browser_1);
  waiter.Wait();

  EXPECT_TRUE(desk_1->is_active());
  EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1));
  EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true));

  ash::ActivateDesk(desk_3);
  EXPECT_TRUE(desk_3->is_active());
  EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true));
}

IN_PROC_BROWSER_TEST_F(BrowserFinderWithDesksTest, FindTabbedBrowser) {
  auto* desks_controller = ash::DesksController::Get();
  ASSERT_EQ(3u, desks_controller->desks().size());
  auto* desk_1 = desks_controller->desks()[0].get();
  auto* desk_2 = desks_controller->desks()[1].get();
  auto* desk_3 = desks_controller->desks()[2].get();

  BrowserWindowInterface* const browser_1 = CreateTestBrowser();
  CloseBrowserSynchronously(browser());
  SetBrowser(browser_1);
  auto* window_1 = browser_1->GetWindow()->GetNativeWindow();
  EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile()));
  EXPECT_TRUE(desk_1->is_active());
  EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1));
  EXPECT_EQ(browser_1, chrome::FindTabbedBrowser(browser()->profile(), true));

  // Switch to desk_2, expect that FindTabbedBrowser() favors the current desk.
  ash::ActivateDesk(desk_2);
  EXPECT_TRUE(desk_2->is_active());
  EXPECT_FALSE(chrome::FindTabbedBrowser(browser()->profile(), true));

  // Create a browser on desk_2, and expect that FindTabbedBrowser() to find it.
  Browser* browser_2 = CreateTestBrowser();
  EXPECT_EQ(browser_2, chrome::FindTabbedBrowser(browser()->profile(), true));

  // Switch to desk_3, and expect there is no tabbed browser.
  ash::ActivateDesk(desk_3);
  EXPECT_TRUE(desk_3->is_active());
  EXPECT_FALSE(chrome::FindTabbedBrowser(browser()->profile(), true));

  // Create a browser on desk_3
  Browser* browser_3 = CreateTestBrowser();
  EXPECT_EQ(browser_3, chrome::FindTabbedBrowser(browser()->profile(), true,
                                                 display::kInvalidDisplayId));

  // Start closing the browser
  CloseBrowserAsynchronously(browser_3);

  // Since browser_3 is closing and has been scheduled for deletion at this
  // point, FindTabbedBrowser should return nullptr.
  EXPECT_EQ(nullptr, chrome::FindTabbedBrowser(browser()->profile(), true,
                                               display::kInvalidDisplayId));
}
