1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/gfx/display_change_notifier.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/gfx/display.h"
9 #include "ui/gfx/display_observer.h"
13 class MockDisplayObserver
: public DisplayObserver
{
19 latest_metrics_change_(DisplayObserver::DISPLAY_METRIC_NONE
)
22 ~MockDisplayObserver() override
{}
24 void OnDisplayAdded(const Display
& display
) override
{ display_added_
++; }
26 void OnDisplayRemoved(const Display
& display
) override
{ display_removed_
++; }
28 void OnDisplayMetricsChanged(const Display
& display
,
29 uint32_t metrics
) override
{
31 latest_metrics_change_
= metrics
;
34 int display_added() const {
35 return display_added_
;
38 int display_removed() const {
39 return display_removed_
;
42 int display_changed() const {
43 return display_changed_
;
46 uint32_t latest_metrics_change() const {
47 return latest_metrics_change_
;
54 uint32_t latest_metrics_change_
;
56 DISALLOW_COPY_AND_ASSIGN(MockDisplayObserver
);
59 TEST(DisplayChangeNotifierTest
, AddObserver_Smoke
) {
60 DisplayChangeNotifier change_notifier
;
61 MockDisplayObserver observer
;
63 change_notifier
.NotifyDisplaysChanged(
64 std::vector
<Display
>(), std::vector
<Display
>(1, Display()));
65 EXPECT_EQ(0, observer
.display_added());
67 change_notifier
.AddObserver(&observer
);
68 change_notifier
.NotifyDisplaysChanged(
69 std::vector
<Display
>(), std::vector
<Display
>(1, Display()));
70 EXPECT_EQ(1, observer
.display_added());
73 TEST(DisplayChangeNotifier
, RemoveObserver_Smoke
) {
74 DisplayChangeNotifier change_notifier
;
75 MockDisplayObserver observer
;
77 change_notifier
.NotifyDisplaysChanged(
78 std::vector
<Display
>(), std::vector
<Display
>(1, Display()));
79 EXPECT_EQ(0, observer
.display_added());
81 change_notifier
.AddObserver(&observer
);
82 change_notifier
.RemoveObserver(&observer
);
84 change_notifier
.NotifyDisplaysChanged(
85 std::vector
<Display
>(), std::vector
<Display
>(1, Display()));
86 EXPECT_EQ(0, observer
.display_added());
89 TEST(DisplayChangeNotifierTest
, RemoveObserver_Unknown
) {
90 DisplayChangeNotifier change_notifier
;
91 MockDisplayObserver observer
;
93 change_notifier
.RemoveObserver(&observer
);
97 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Removed
) {
98 DisplayChangeNotifier change_notifier
;
100 // If the previous display array is empty, no removal.
102 MockDisplayObserver observer
;
103 change_notifier
.AddObserver(&observer
);
105 std::vector
<Display
> old_displays
, new_displays
;
106 new_displays
.push_back(Display());
108 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
109 EXPECT_EQ(0, observer
.display_removed());
111 change_notifier
.RemoveObserver(&observer
);
114 // If the previous and new display array are empty, no removal.
116 MockDisplayObserver observer
;
117 change_notifier
.AddObserver(&observer
);
119 std::vector
<Display
> old_displays
, new_displays
;
121 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
122 EXPECT_EQ(0, observer
.display_removed());
124 change_notifier
.RemoveObserver(&observer
);
127 // If the new display array is empty, there are as many removal as old
130 MockDisplayObserver observer
;
131 change_notifier
.AddObserver(&observer
);
133 std::vector
<Display
> old_displays
, new_displays
;
134 old_displays
.push_back(Display());
135 old_displays
.push_back(Display());
136 old_displays
.push_back(Display());
138 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
139 EXPECT_EQ(3, observer
.display_removed());
141 change_notifier
.RemoveObserver(&observer
);
144 // If displays don't use ids, as long as the new display array has one
145 // element, there are no removals.
147 MockDisplayObserver observer
;
148 change_notifier
.AddObserver(&observer
);
150 std::vector
<Display
> old_displays
, new_displays
;
151 old_displays
.push_back(Display());
152 old_displays
.push_back(Display());
153 old_displays
.push_back(Display());
154 new_displays
.push_back(Display());
156 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
157 EXPECT_EQ(0, observer
.display_removed());
159 change_notifier
.RemoveObserver(&observer
);
162 // If displays use ids (and they are unique), ids not present in the new
163 // display array will be marked as removed.
165 MockDisplayObserver observer
;
166 change_notifier
.AddObserver(&observer
);
168 std::vector
<Display
> old_displays
, new_displays
;
169 old_displays
.push_back(Display(1));
170 old_displays
.push_back(Display(2));
171 old_displays
.push_back(Display(3));
172 new_displays
.push_back(Display(2));
174 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
175 EXPECT_EQ(2, observer
.display_removed());
177 change_notifier
.RemoveObserver(&observer
);
181 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Added
) {
182 DisplayChangeNotifier change_notifier
;
184 // If the new display array is empty, no addition.
186 MockDisplayObserver observer
;
187 change_notifier
.AddObserver(&observer
);
189 std::vector
<Display
> old_displays
, new_displays
;
190 old_displays
.push_back(Display());
192 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
193 EXPECT_EQ(0, observer
.display_added());
195 change_notifier
.RemoveObserver(&observer
);
198 // If the old and new display arrays are empty, no addition.
200 MockDisplayObserver observer
;
201 change_notifier
.AddObserver(&observer
);
203 std::vector
<Display
> old_displays
, new_displays
;
205 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
206 EXPECT_EQ(0, observer
.display_added());
208 change_notifier
.RemoveObserver(&observer
);
211 // If the old display array is empty, there are as many addition as new
214 MockDisplayObserver observer
;
215 change_notifier
.AddObserver(&observer
);
217 std::vector
<Display
> old_displays
, new_displays
;
218 new_displays
.push_back(Display());
219 new_displays
.push_back(Display());
220 new_displays
.push_back(Display());
222 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
223 EXPECT_EQ(3, observer
.display_added());
225 change_notifier
.RemoveObserver(&observer
);
228 // If displays don't use ids, as long as the old display array has one
229 // element, there are no additions.
231 MockDisplayObserver observer
;
232 change_notifier
.AddObserver(&observer
);
234 std::vector
<Display
> old_displays
, new_displays
;
235 old_displays
.push_back(Display());
236 new_displays
.push_back(Display());
237 new_displays
.push_back(Display());
238 new_displays
.push_back(Display());
240 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
241 EXPECT_EQ(0, observer
.display_added());
243 change_notifier
.RemoveObserver(&observer
);
246 // If displays use ids (and they are unique), ids not present in the old
247 // display array will be marked as added.
249 MockDisplayObserver observer
;
250 change_notifier
.AddObserver(&observer
);
252 std::vector
<Display
> old_displays
, new_displays
;
253 old_displays
.push_back(Display(1));
254 new_displays
.push_back(Display(1));
255 new_displays
.push_back(Display(2));
256 new_displays
.push_back(Display(3));
258 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
259 EXPECT_EQ(2, observer
.display_added());
261 change_notifier
.RemoveObserver(&observer
);
265 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_Smoke
) {
266 DisplayChangeNotifier change_notifier
;
268 // If the old display array is empty, no change.
270 MockDisplayObserver observer
;
271 change_notifier
.AddObserver(&observer
);
273 std::vector
<Display
> old_displays
, new_displays
;
274 new_displays
.push_back(Display());
276 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
277 EXPECT_EQ(0, observer
.display_changed());
279 change_notifier
.RemoveObserver(&observer
);
282 // If the new display array is empty, no change.
284 MockDisplayObserver observer
;
285 change_notifier
.AddObserver(&observer
);
287 std::vector
<Display
> old_displays
, new_displays
;
288 old_displays
.push_back(Display());
290 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
291 EXPECT_EQ(0, observer
.display_changed());
293 change_notifier
.RemoveObserver(&observer
);
296 // If the old and new display arrays are empty, no change.
298 MockDisplayObserver observer
;
299 change_notifier
.AddObserver(&observer
);
301 std::vector
<Display
> old_displays
, new_displays
;
303 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
304 EXPECT_EQ(0, observer
.display_changed());
306 change_notifier
.RemoveObserver(&observer
);
309 // If there is an intersection between old and new displays but there are no
310 // metrics changes, there is no display change.
312 MockDisplayObserver observer
;
313 change_notifier
.AddObserver(&observer
);
315 std::vector
<Display
> old_displays
, new_displays
;
316 old_displays
.push_back(Display(1));
317 new_displays
.push_back(Display(1));
318 new_displays
.push_back(Display(2));
319 new_displays
.push_back(Display(3));
321 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
322 EXPECT_EQ(0, observer
.display_changed());
324 change_notifier
.RemoveObserver(&observer
);
328 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_Bounds
) {
329 DisplayChangeNotifier change_notifier
;
332 MockDisplayObserver observer
;
333 change_notifier
.AddObserver(&observer
);
335 std::vector
<Display
> old_displays
, new_displays
;
336 old_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
337 new_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
339 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
340 EXPECT_EQ(0, observer
.display_changed());
342 change_notifier
.RemoveObserver(&observer
);
346 MockDisplayObserver observer
;
347 change_notifier
.AddObserver(&observer
);
349 std::vector
<Display
> old_displays
, new_displays
;
350 old_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
351 new_displays
.push_back(Display(1, Rect(10, 10, 300, 300)));
353 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
354 EXPECT_EQ(1, observer
.display_changed());
355 uint32_t metrics_change
= DisplayObserver::DISPLAY_METRIC_BOUNDS
|
356 DisplayObserver::DISPLAY_METRIC_WORK_AREA
;
357 EXPECT_EQ(metrics_change
, observer
.latest_metrics_change());
359 change_notifier
.RemoveObserver(&observer
);
363 MockDisplayObserver observer
;
364 change_notifier
.AddObserver(&observer
);
366 std::vector
<Display
> old_displays
, new_displays
;
367 old_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
368 new_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
369 new_displays
[0].set_bounds(Rect(10, 10, 300, 300));
371 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
372 EXPECT_EQ(1, observer
.display_changed());
373 EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_BOUNDS
,
374 observer
.latest_metrics_change());
376 change_notifier
.RemoveObserver(&observer
);
380 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_Rotation
) {
381 DisplayChangeNotifier change_notifier
;
382 MockDisplayObserver observer
;
383 change_notifier
.AddObserver(&observer
);
385 std::vector
<Display
> old_displays
, new_displays
;
386 old_displays
.push_back(Display(1));
387 old_displays
[0].SetRotationAsDegree(0);
388 new_displays
.push_back(Display(1));
389 new_displays
[0].SetRotationAsDegree(180);
391 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
392 EXPECT_EQ(1, observer
.display_changed());
393 EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_ROTATION
,
394 observer
.latest_metrics_change());
397 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_WorkArea
) {
398 DisplayChangeNotifier change_notifier
;
399 MockDisplayObserver observer
;
400 change_notifier
.AddObserver(&observer
);
402 std::vector
<Display
> old_displays
, new_displays
;
403 old_displays
.push_back(Display(1));
404 old_displays
[0].set_work_area(Rect(0, 0, 200, 200));
405 new_displays
.push_back(Display(1));
406 new_displays
[0].set_work_area(Rect(20, 20, 300, 300));
408 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
409 EXPECT_EQ(1, observer
.display_changed());
410 EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_WORK_AREA
,
411 observer
.latest_metrics_change());
414 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_DSF
) {
415 DisplayChangeNotifier change_notifier
;
416 MockDisplayObserver observer
;
417 change_notifier
.AddObserver(&observer
);
419 std::vector
<Display
> old_displays
, new_displays
;
420 old_displays
.push_back(Display(1));
421 old_displays
[0].set_device_scale_factor(1.f
);
422 new_displays
.push_back(Display(1));
423 new_displays
[0].set_device_scale_factor(2.f
);
425 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
426 EXPECT_EQ(1, observer
.display_changed());
427 EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR
,
428 observer
.latest_metrics_change());
431 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_Multi_Displays
) {
432 DisplayChangeNotifier change_notifier
;
433 MockDisplayObserver observer
;
434 change_notifier
.AddObserver(&observer
);
436 std::vector
<Display
> old_displays
, new_displays
;
437 old_displays
.push_back(Display(1));
438 old_displays
.push_back(Display(2));
439 old_displays
.push_back(Display(3));
440 new_displays
.push_back(Display(1));
441 new_displays
.push_back(Display(2));
442 new_displays
.push_back(Display(3));
444 old_displays
[0].set_device_scale_factor(1.f
);
445 new_displays
[0].set_device_scale_factor(2.f
);
447 old_displays
[1].set_bounds(Rect(0, 0, 200, 200));
448 new_displays
[1].set_bounds(Rect(0, 0, 400, 400));
450 old_displays
[2].SetRotationAsDegree(0);
451 new_displays
[2].SetRotationAsDegree(90);
453 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
454 EXPECT_EQ(3, observer
.display_changed());
457 TEST(DisplayChangeNotifierTest
, NotifyDisplaysChanged_Changed_Multi_Metrics
) {
458 DisplayChangeNotifier change_notifier
;
459 MockDisplayObserver observer
;
460 change_notifier
.AddObserver(&observer
);
462 std::vector
<Display
> old_displays
, new_displays
;
463 old_displays
.push_back(Display(1, Rect(0, 0, 200, 200)));
464 old_displays
[0].set_device_scale_factor(1.f
);
465 old_displays
[0].SetRotationAsDegree(0);
467 new_displays
.push_back(Display(1, Rect(100, 100, 200, 200)));
468 new_displays
[0].set_device_scale_factor(2.f
);
469 new_displays
[0].SetRotationAsDegree(90);
471 change_notifier
.NotifyDisplaysChanged(old_displays
, new_displays
);
472 EXPECT_EQ(1, observer
.display_changed());
473 uint32_t metrics
= DisplayObserver::DISPLAY_METRIC_BOUNDS
|
474 DisplayObserver::DISPLAY_METRIC_ROTATION
|
475 DisplayObserver::DISPLAY_METRIC_WORK_AREA
|
476 DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR
;
477 EXPECT_EQ(metrics
, observer
.latest_metrics_change());