blob: 6a5e87554144c14c975e7a8477dac3f1798237db [file] [log] [blame]
// 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/scoped_views_test_helper.h"
#include "ui/views/test/views_test_base.h"
namespace views {
class ScreenMusTestApi {
public:
static void CallOnDisplaysChanged(
ScreenMus* screen,
std::vector<ui::mojom::WsDisplayPtr> ws_displays,
int64_t primary_display_id,
int64_t internal_display_id) {
screen->OnDisplaysChanged(std::move(ws_displays), primary_display_id,
internal_display_id);
}
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenMusTestApi);
};
namespace {
std::vector<ui::mojom::WsDisplayPtr> ConvertDisplayToWsDisplays(
const std::vector<display::Display>& displays) {
std::vector<ui::mojom::WsDisplayPtr> results;
for (const auto& display : displays) {
ui::mojom::WsDisplayPtr display_ptr = ui::mojom::WsDisplay::New();
display_ptr->display = display;
display_ptr->frame_decoration_values =
ui::mojom::FrameDecorationValues::New();
results.push_back(std::move(display_ptr));
}
return results;
}
TEST(ScreenMusTest, ConsistentDisplayInHighDPI) {
base::test::ScopedTaskEnvironment task_environment(
base::test::ScopedTaskEnvironment::MainThreadType::UI);
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kForceDeviceScaleFactor, "2");
ScopedViewsTestHelper test_helper;
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());
}
}
TEST(ScreenMusTest, PrimaryChangedToExisting) {
base::test::ScopedTaskEnvironment task_environment(
base::test::ScopedTaskEnvironment::MainThreadType::UI);
ScopedViewsTestHelper test_helper;
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);
ScreenMusTestApi::CallOnDisplaysChanged(
screen, ConvertDisplayToWsDisplays(displays), displays[0].id(), 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(ScreenMusTest, AddAndUpdate) {
base::test::ScopedTaskEnvironment task_environment(
base::test::ScopedTaskEnvironment::MainThreadType::UI);
ScopedViewsTestHelper test_helper;
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);
ScreenMusTestApi::CallOnDisplaysChanged(
screen, ConvertDisplayToWsDisplays(displays), displays[1].id(), 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());
}
} // namespace
} // namespace views