15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/display_change_notifier.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/display.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/display_observer.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace gfx {
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MockDisplayObserver : public DisplayObserver {
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver()
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : display_added_(0),
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_removed_(0),
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_changed_(0),
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      latest_metrics_change_(DisplayObserver::DISPLAY_METRIC_NONE)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {}
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MockDisplayObserver() { }
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnDisplayAdded(const Display& display) OVERRIDE {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    display_added_++;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnDisplayRemoved(const Display& display) OVERRIDE {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    display_removed_++;
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnDisplayMetricsChanged(const Display& display,
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       uint32_t metrics) OVERRIDE {
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    display_changed_++;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    latest_metrics_change_ = metrics;
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_added() const {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return display_added_;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_removed() const {
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return display_removed_;
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_changed() const {
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return display_changed_;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  uint32_t latest_metrics_change() const {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return latest_metrics_change_;
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_added_;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_removed_;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_changed_;
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  uint32_t latest_metrics_change_;
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDisplayObserver);
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, AddObserver_Smoke) {
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display>(), std::vector<Display>(1, Display()));
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0, observer.display_added());
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display>(), std::vector<Display>(1, Display()));
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, observer.display_added());
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, AddObserver_Null) {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(NULL);
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Should not crash.
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifier, RemoveObserver_Smoke) {
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display>(), std::vector<Display>(1, Display()));
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0, observer.display_added());
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.RemoveObserver(&observer);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display>(), std::vector<Display>(1, Display()));
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0, observer.display_added());
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, RemoveObserver_Null) {
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.RemoveObserver(NULL);
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Should not crash.
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, RemoveObserver_Unknown) {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.RemoveObserver(&observer);
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Should not crash.
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Removed) {
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the previous display array is empty, no removal.
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_removed());
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the previous and new display array are empty, no removal.
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_removed());
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the new display array is empty, there are as many removal as old
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // displays.
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(3, observer.display_removed());
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If displays don't use ids, as long as the new display array has one
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // element, there are no removals.
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_removed());
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If displays use ids (and they are unique), ids not present in the new
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // display array will be marked as removed.
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1));
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(2));
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(3));
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(2));
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(2, observer.display_removed());
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Added) {
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the new display array is empty, no addition.
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_added());
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the old and new display arrays are empty, no addition.
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_added());
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the old display array is empty, there are as many addition as new
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // displays.
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(3, observer.display_added());
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If displays don't use ids, as long as the old display array has one
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // element, there are no additions.
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_added());
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If displays use ids (and they are unique), ids not present in the old
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // display array will be marked as added.
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1));
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(1));
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(2));
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(3));
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(2, observer.display_added());
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_Smoke) {
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the old display array is empty, no change.
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display());
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_changed());
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the new display array is empty, no change.
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display());
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_changed());
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the old and new display arrays are empty, no change.
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_changed());
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If there is an intersection between old and new displays but there are no
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // metrics changes, there is no display change.
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1));
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(1));
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(2));
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(3));
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_changed());
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_Bounds) {
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(0, observer.display_changed());
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(1, Rect(10, 10, 300, 300)));
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(1, observer.display_changed());
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    uint32_t metrics_change = DisplayObserver::DISPLAY_METRIC_BOUNDS |
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  DisplayObserver::DISPLAY_METRIC_WORK_AREA;
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(metrics_change, observer.latest_metrics_change());
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MockDisplayObserver observer;
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.AddObserver(&observer);
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<Display> old_displays, new_displays;
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_displays[0].set_bounds(Rect(10, 10, 300, 300));
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(1, observer.display_changed());
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_BOUNDS,
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              observer.latest_metrics_change());
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_notifier.RemoveObserver(&observer);
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_Rotation) {
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<Display> old_displays, new_displays;
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(1));
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].SetRotationAsDegree(0);
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(1));
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].SetRotationAsDegree(180);
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, observer.display_changed());
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_ROTATION,
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            observer.latest_metrics_change());
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_WorkArea) {
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<Display> old_displays, new_displays;
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(1));
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].set_work_area(Rect(0, 0, 200, 200));
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(1));
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].set_work_area(Rect(20, 20, 300, 300));
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, observer.display_changed());
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_WORK_AREA,
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            observer.latest_metrics_change());
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_DSF) {
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<Display> old_displays, new_displays;
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(1));
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].set_device_scale_factor(1.f);
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(1));
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].set_device_scale_factor(2.f);
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, observer.display_changed());
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR,
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            observer.latest_metrics_change());
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_Multi_Displays) {
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<Display> old_displays, new_displays;
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(1));
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(2));
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(3));
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(1));
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(2));
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(3));
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].set_device_scale_factor(1.f);
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].set_device_scale_factor(2.f);
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[1].set_bounds(Rect(0, 0, 200, 200));
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[1].set_bounds(Rect(0, 0, 400, 400));
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[2].SetRotationAsDegree(0);
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[2].SetRotationAsDegree(90);
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(3, observer.display_changed());
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(DisplayChangeNotifierTest, NotifyDisplaysChanged_Changed_Multi_Metrics) {
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayChangeNotifier change_notifier;
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockDisplayObserver observer;
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.AddObserver(&observer);
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<Display> old_displays, new_displays;
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays.push_back(Display(1, Rect(0, 0, 200, 200)));
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].set_device_scale_factor(1.f);
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  old_displays[0].SetRotationAsDegree(0);
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays.push_back(Display(1, Rect(100, 100, 200, 200)));
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].set_device_scale_factor(2.f);
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_displays[0].SetRotationAsDegree(90);
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  change_notifier.NotifyDisplaysChanged(old_displays, new_displays);
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1, observer.display_changed());
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  uint32_t metrics = DisplayObserver::DISPLAY_METRIC_BOUNDS |
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         DisplayObserver::DISPLAY_METRIC_ROTATION |
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         DisplayObserver::DISPLAY_METRIC_WORK_AREA |
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR;
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(metrics, observer.latest_metrics_change());
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace gfx
499