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