// 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 "ui/views/mus/screen_mus.h"

#include "base/command_line.h"
#include "base/test/scoped_task_environment.h"
#include "ui/display/display_switches.h"
#include "ui/display/screen.h"
#include "ui/views/test/views_test_base.h"

namespace views {
namespace {

std::vector<ws::mojom::WsDisplayPtr> ConvertDisplayToWsDisplays(
    const std::vector<display::Display>& displays) {
  std::vector<ws::mojom::WsDisplayPtr> results;
  for (const auto& display : displays) {
    ws::mojom::WsDisplayPtr display_ptr = ws::mojom::WsDisplay::New();
    display_ptr->display = display;
    display_ptr->frame_decoration_values =
        ws::mojom::FrameDecorationValues::New();
    results.push_back(std::move(display_ptr));
  }
  return results;
}

using ScreenMusTest = ViewsTestWithDesktopNativeWidget;

TEST_F(ScreenMusTest, PrimaryChangedToExisting) {
  ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());
  std::vector<display::Display> displays = screen->GetAllDisplays();
  ASSERT_FALSE(displays.empty());

  // Convert to a single display with a different primary id.
  displays.resize(1);
  displays[0].set_id(displays[0].id() + 1);
  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays),
                            displays[0].id(), 0, 0);
  ASSERT_EQ(1u, screen->GetAllDisplays().size());
  EXPECT_EQ(displays[0].id(), screen->GetAllDisplays()[0].id());
  EXPECT_EQ(displays[0].id(), screen->GetPrimaryDisplay().id());
}

TEST_F(ScreenMusTest, AddAndUpdate) {
  ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());
  std::vector<display::Display> displays = screen->GetAllDisplays();
  ASSERT_FALSE(displays.empty());

  // Update the bounds of display 1, and add a new display.
  displays.resize(1);
  gfx::Rect new_bounds = displays[0].bounds();
  new_bounds.set_height(new_bounds.height() + 1);
  displays[0].set_bounds(new_bounds);
  displays.push_back(displays[0]);
  displays[1].set_id(displays[0].id() + 1);
  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays),
                            displays[1].id(), 0, 0);
  ASSERT_EQ(2u, screen->GetAllDisplays().size());
  ASSERT_TRUE(screen->display_list().FindDisplayById(displays[0].id()) !=
              screen->display_list().displays().end());
  EXPECT_EQ(new_bounds.height(), screen->display_list()
                                     .FindDisplayById(displays[0].id())
                                     ->bounds()
                                     .height());
  ASSERT_TRUE(screen->display_list().FindDisplayById(displays[1].id()) !=
              screen->display_list().displays().end());
  EXPECT_EQ(displays[1].id(), screen->GetPrimaryDisplay().id());
}

TEST_F(ScreenMusTest, SetDisplayForNewWindows) {
  ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());

  // Set up 2 displays with display 1 as the display for new windows.
  constexpr int64_t kDisplayId1 = 111;
  constexpr int64_t kDisplayId2 = 222;
  std::vector<display::Display> displays = {display::Display(kDisplayId1),
                                            display::Display(kDisplayId2)};
  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
                            kDisplayId1,
                            kDisplayId1 /* display_id_for_new_windows */);
  EXPECT_EQ(kDisplayId1, screen->GetDisplayForNewWindows().id());

  // Set display 2 as the display for new windows.
  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
                            kDisplayId1,
                            kDisplayId2 /* display_id_for_new_windows */);
  EXPECT_EQ(kDisplayId2, screen->GetDisplayForNewWindows().id());

  // Set a bad display as the display for new windows. ScreenMus should fall
  // back to the primary display.
  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
                            kDisplayId1, 666 /* display_id_for_new_windows */);
  EXPECT_EQ(kDisplayId1, screen->GetDisplayForNewWindows().id());
}

class ScreenMusScaleFactorTest : public ScreenMusTest {
 public:
  ScreenMusScaleFactorTest() = default;
  ~ScreenMusScaleFactorTest() override = default;

  void SetUp() override {
    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
        switches::kForceDeviceScaleFactor, "2");
    ScreenMusTest::SetUp();
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(ScreenMusScaleFactorTest);
};

TEST_F(ScreenMusScaleFactorTest, ConsistentDisplayInHighDPI) {
  display::Screen* screen = display::Screen::GetScreen();
  std::vector<display::Display> displays = screen->GetAllDisplays();
  ASSERT_FALSE(displays.empty());
  for (const display::Display& display : displays) {
    EXPECT_EQ(2.f, display.device_scale_factor());
    EXPECT_EQ(display.work_area(), display.bounds());
  }
}

}  // namespace
}  // namespace views
