blob: 410968dde47d66fef33d0b7025c6bab5ad1daebb [file] [log] [blame]
Avi Drissman3e1a26c2022-09-15 20:26:031// Copyright 2016 The Chromium Authors
sky7afbf7c2016-05-17 23:07:422// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
msw5e048a72016-09-07 18:55:305#include "ui/display/display_list.h"
sky7afbf7c2016-05-17 23:07:426
7#include <string>
8#include <vector>
9
10#include "base/strings/string_number_conversions.h"
Mike Wasserman11554ff92021-05-16 00:46:2611#include "base/test/gtest_util.h"
sky7afbf7c2016-05-17 23:07:4212#include "testing/gtest/include/gtest/gtest.h"
13#include "ui/display/display.h"
14#include "ui/display/display_observer.h"
15
msw5e048a72016-09-07 18:55:3016namespace display {
sky7afbf7c2016-05-17 23:07:4217namespace {
18
kylechar7a067ec2017-01-07 01:16:2819class DisplayObserverImpl : public DisplayObserver {
sky7afbf7c2016-05-17 23:07:4220 public:
21 DisplayObserverImpl() {}
Peter Boströmc8c12352021-09-21 23:37:1522
23 DisplayObserverImpl(const DisplayObserverImpl&) = delete;
24 DisplayObserverImpl& operator=(const DisplayObserverImpl&) = delete;
25
sky7afbf7c2016-05-17 23:07:4226 ~DisplayObserverImpl() override {}
27
28 std::string GetAndClearChanges() {
29 std::string changes;
30 std::swap(changes, changes_);
31 return changes;
32 }
33
34 private:
35 static void AddPartChange(uint32_t changed,
36 uint32_t part,
37 const std::string& description,
38 std::string* changed_string) {
39 if ((changed & part) != part)
40 return;
41
42 *changed_string += " ";
43 *changed_string += description;
44 }
45
46 void AddChange(const std::string& change) {
47 if (!changes_.empty())
48 changes_ += "\n";
49 changes_ += change;
50 }
51
52 void OnDisplayAdded(const Display& new_display) override {
Raul Tambreffa3ec12019-03-26 19:32:4553 AddChange("Added id=" + base::NumberToString(new_display.id()));
sky7afbf7c2016-05-17 23:07:4254 }
55 void OnDisplayRemoved(const Display& old_display) override {
Raul Tambreffa3ec12019-03-26 19:32:4556 AddChange("Removed id=" + base::NumberToString(old_display.id()));
sky7afbf7c2016-05-17 23:07:4257 }
58 void OnDisplayMetricsChanged(const Display& display,
59 uint32_t changed_metrics) override {
60 std::string parts;
61 AddPartChange(changed_metrics, DISPLAY_METRIC_BOUNDS, "bounds", &parts);
62 AddPartChange(changed_metrics, DISPLAY_METRIC_WORK_AREA, "work_area",
63 &parts);
64 AddPartChange(changed_metrics, DISPLAY_METRIC_DEVICE_SCALE_FACTOR,
65 "scale_factor", &parts);
66 AddPartChange(changed_metrics, DISPLAY_METRIC_ROTATION, "rotation", &parts);
67 AddPartChange(changed_metrics, DISPLAY_METRIC_PRIMARY, "primary", &parts);
Brad Triebwasser38d866c2022-07-07 18:11:1468 AddPartChange(changed_metrics, DISPLAY_METRIC_LABEL, "label", &parts);
sky7afbf7c2016-05-17 23:07:4269
Raul Tambreffa3ec12019-03-26 19:32:4570 AddChange("Changed id=" + base::NumberToString(display.id()) + parts);
sky7afbf7c2016-05-17 23:07:4271 }
72
73 std::string changes_;
sky7afbf7c2016-05-17 23:07:4274};
75
sky56172f6d2016-05-19 16:42:5176TEST(DisplayListTest, AddUpdateRemove) {
sky7afbf7c2016-05-17 23:07:4277 DisplayList display_list;
78 DisplayObserverImpl observer;
79 display_list.AddObserver(&observer);
kylechar7a067ec2017-01-07 01:16:2880 display_list.AddDisplay(Display(2, gfx::Rect(0, 0, 801, 802)),
sky7afbf7c2016-05-17 23:07:4281 DisplayList::Type::PRIMARY);
82 EXPECT_EQ("Added id=2", observer.GetAndClearChanges());
83
84 // Update the bounds.
85 {
kylechar7a067ec2017-01-07 01:16:2886 Display updated_display = *(display_list.displays().begin());
sky7afbf7c2016-05-17 23:07:4287 updated_display.set_bounds(gfx::Rect(0, 0, 803, 802));
88 display_list.UpdateDisplay(updated_display, DisplayList::Type::PRIMARY);
89 EXPECT_EQ("Changed id=2 bounds", observer.GetAndClearChanges());
90 }
91
Brad Triebwasser38d866c2022-07-07 18:11:1492 // Update the label.
93 {
94 Display updated_display = *(display_list.displays().begin());
95 updated_display.set_label("new_label");
96 display_list.UpdateDisplay(updated_display, DisplayList::Type::PRIMARY);
97 EXPECT_EQ("Changed id=2 label", observer.GetAndClearChanges());
98 EXPECT_EQ("new_label", display_list.FindDisplayById(2)->label());
99 }
100
sky7afbf7c2016-05-17 23:07:42101 // Add another.
kylechar7a067ec2017-01-07 01:16:28102 display_list.AddDisplay(Display(3, gfx::Rect(0, 0, 809, 802)),
sky7afbf7c2016-05-17 23:07:42103 DisplayList::Type::NOT_PRIMARY);
104 EXPECT_EQ("Added id=3", observer.GetAndClearChanges());
105 ASSERT_EQ(2u, display_list.displays().size());
106 EXPECT_EQ(2, display_list.displays()[0].id());
107 EXPECT_EQ(3, display_list.displays()[1].id());
Adrienne Walker23690d952021-09-29 20:19:18108 EXPECT_EQ(2, display_list.GetPrimaryDisplayIterator()->id());
sky7afbf7c2016-05-17 23:07:42109
110 // Make the second the primary.
111 display_list.UpdateDisplay(display_list.displays()[1],
112 DisplayList::Type::PRIMARY);
113 EXPECT_EQ("Changed id=3 primary", observer.GetAndClearChanges());
Adrienne Walker23690d952021-09-29 20:19:18114 EXPECT_EQ(3, display_list.GetPrimaryDisplayIterator()->id());
sky7afbf7c2016-05-17 23:07:42115
116 // Delete the first.
117 display_list.RemoveDisplay(2);
118 ASSERT_EQ(1u, display_list.displays().size());
119 EXPECT_EQ("Removed id=2", observer.GetAndClearChanges());
Adrienne Walker23690d952021-09-29 20:19:18120 EXPECT_EQ(3, display_list.GetPrimaryDisplayIterator()->id());
sky7afbf7c2016-05-17 23:07:42121}
122
Mike Wasserman11554ff92021-05-16 00:46:26123TEST(DisplayListTest, EmptyIsValid) {
124 DisplayList display_list;
Adrienne Walker23690d952021-09-29 20:19:18125 EXPECT_TRUE(display_list.IsValid());
Mike Wasserman11554ff92021-05-16 00:46:26126}
127
Adrienne Walker23690d952021-09-29 20:19:18128TEST(DisplayListTest, FirstDisplayAddedMustBePrimary) {
Mike Wasserman11554ff92021-05-16 00:46:26129 DisplayList display_list;
Mike Wasserman11554ff92021-05-16 00:46:26130 EXPECT_DCHECK_DEATH(
Adrienne Walker23690d952021-09-29 20:19:18131 display_list.AddDisplay(Display(1), DisplayList::Type::NOT_PRIMARY));
Mike Wasserman11554ff92021-05-16 00:46:26132}
133
134TEST(DisplayListTest, DisplaysIdsMustBeUnique) {
Adrienne Walker23690d952021-09-29 20:19:18135 DisplayList display_list;
136 display_list.AddDisplay(Display(1), DisplayList::Type::PRIMARY);
Jayson Adams1ba49822021-06-24 00:20:29137 EXPECT_DCHECK_DEATH(
Adrienne Walker23690d952021-09-29 20:19:18138 display_list.AddDisplay(Display(1), DisplayList::Type::PRIMARY));
Mike Wasserman1e8ee6c2021-05-20 18:34:52139}
140
141TEST(DisplayListTest, GetPrimaryDisplayEmpty) {
142 DisplayList display_list;
143 EXPECT_EQ(display_list.displays().end(),
Adrienne Walker23690d952021-09-29 20:19:18144 display_list.GetPrimaryDisplayIterator());
Mike Wasserman1e8ee6c2021-05-20 18:34:52145}
146
147TEST(DisplayListTest, GetPrimaryDisplayOk) {
Mike Wasserman1e8ee6c2021-05-20 18:34:52148 DisplayList display_list;
Adrienne Walker23690d952021-09-29 20:19:18149 display_list.AddDisplay(Display(1), DisplayList::Type::PRIMARY);
Mike Wasserman1e8ee6c2021-05-20 18:34:52150 EXPECT_NE(display_list.displays().end(),
Adrienne Walker23690d952021-09-29 20:19:18151 display_list.GetPrimaryDisplayIterator());
152 EXPECT_EQ(1, display_list.GetPrimaryDisplayIterator()->id());
Mike Wasserman1e8ee6c2021-05-20 18:34:52153}
154
sky7afbf7c2016-05-17 23:07:42155} // namespace
msw5e048a72016-09-07 18:55:30156} // namespace display