103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_display/display_info_provider.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/display/display_controller.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/display/display_manager.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/shell.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/test/ash_test_base.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/test/display_manager_test_api.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_display.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/display.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/rect.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace extensions {
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class DisplayInfoProviderChromeosTest : public ash::test::AshTestBase {
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisplayInfoProviderChromeosTest() {}
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~DisplayInfoProviderChromeosTest() {}
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void CallSetDisplayUnitInfo(
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& display_id,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const core_api::system_display::DisplayProperties& info,
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      bool* success,
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string* error) {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Reset error messsage.
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    (*error).clear();
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    *success = DisplayInfoProvider::Get()->SetInfo(display_id, info, error);
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool DisplayExists(int64 display_id) const {
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const gfx::Display& display =
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GetDisplayManager()->GetDisplayForId(display_id);
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return display.id() != gfx::Display::kInvalidDisplayID;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* GetDisplayManager() const {
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ash::Shell::GetInstance()->display_manager();
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ash::DisplayController* GetDisplayController() const {
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ash::Shell::GetInstance()->display_controller();
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string SystemInfoDisplayInsetsToString(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const core_api::system_display::Insets& insets) const {
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Order to match gfx::Insets::ToString().
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return base::StringPrintf(
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        "%d,%d,%d,%d", insets.top, insets.left, insets.bottom, insets.right);
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string SystemInfoDisplayBoundsToString(
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const core_api::system_display::Bounds& bounds) const {
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Order to match gfx::Rect::ToString().
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return base::StringPrintf(
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        "%d,%d %dx%d", bounds.left, bounds.top, bounds.width, bounds.height);
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayInfoProviderChromeosTest);
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetBasic) {
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("500x600,400x520");
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int64 display_id;
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id))
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[0]->id;
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found";
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[0]->overscan));
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, result[0]->rotation);
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[0]->is_primary);
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_x);
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_y);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[0]->mirroring_source_id.empty());
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[0]->is_enabled);
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id))
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[0]->id;
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found";
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(GetDisplayManager()->GetDisplayNameForId(display_id),
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            result[1]->name);
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The second display is positioned left of the primary display, whose width
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // is 500.
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("500,0 400x520",
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[1]->overscan));
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, result[1]->rotation);
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(result[1]->is_primary);
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[1]->dpi_x);
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[1]->dpi_y);
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[1]->mirroring_source_id.empty());
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[1]->is_enabled);
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetRotation) {
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("500x600/r");
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int64 display_id;
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id))
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[0]->id;
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found";
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds));
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(90, result[0]->rotation);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_270);
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id), result[0]->id);
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds));
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(270, result[0]->rotation);
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_180);
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id), result[0]->id);
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(180, result[0]->rotation);
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_0);
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id), result[0]->id);
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, result[0]->rotation);
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetHiDPI) {
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("500x600,400x520*2");
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisplayInfo result;
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_x);
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_y);
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("500,0 200x260",
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2 * 96, result[1]->dpi_x);
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2 * 96, result[1]->dpi_y);
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayController()->SwapPrimaryDisplay();
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("-500,0 500x600",
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[0]->bounds));
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_x);
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(96, result[0]->dpi_y);
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 200x260", SystemInfoDisplayBoundsToString(result[1]->bounds));
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2 * 96, result[1]->dpi_x);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2 * 96, result[1]->dpi_y);
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetVisibleArea) {
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("640x720*2/o, 400x520/o");
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisplayInfo result;
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int64 display_id;
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id))
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[1]->id;
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found";
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Default overscan is 5%.
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("304,0 380x494",
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("13,10,13,10",
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayInsetsToString(result[1]->overscan));
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetOverscanInsets(display_id,
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         gfx::Insets(20, 30, 50, 60));
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id), result[1]->id);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("304,0 310x450",
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("20,30,50,60",
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayInsetsToString(result[1]->overscan));
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Set insets for the primary screen. Note that it has 2x scale.
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id))
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[0]->id;
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found";
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 304x342", SystemInfoDisplayBoundsToString(result[0]->bounds));
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("9,8,9,8", SystemInfoDisplayInsetsToString(result[0]->overscan));
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetOverscanInsets(display_id,
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         gfx::Insets(10, 20, 30, 40));
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id), result[0]->id);
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 260x320", SystemInfoDisplayBoundsToString(result[0]->bounds));
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("10,20,30,40",
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayInsetsToString(result[0]->overscan));
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetMirroring) {
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("600x600, 400x520/o");
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisplayInfo result;
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int64 display_id_primary;
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id_primary))
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[0]->id;
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id_primary)) << display_id_primary
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 << " not found";
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int64 display_id_secondary;
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id_secondary))
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "Display id must be convertable to integer: " << result[1]->id;
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(DisplayExists(display_id_secondary)) << display_id_secondary
25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                   << " not found";
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(GetDisplayManager()->IsMirrored());
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[0]->mirroring_source_id.empty());
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[1]->mirroring_source_id.empty());
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetMirrorMode(true);
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(GetDisplayManager()->IsMirrored());
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(1u, result.size());
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id);
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id_secondary),
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            result[0]->mirroring_source_id);
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetDisplayManager()->SetMirrorMode(false);
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(GetDisplayManager()->IsMirrored());
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id);
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[0]->mirroring_source_id.empty());
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(base::Int64ToString(display_id_secondary), result[1]->id);
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(result[1]->mirroring_source_id.empty());
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, GetBounds) {
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("600x600, 400x520");
2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GetDisplayManager()->SetLayoutForCurrentDisplays(
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ash::DisplayLayout::FromInts(ash::DisplayLayout::LEFT, -40));
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("-400,-40 400x520",
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GetDisplayManager()->SetLayoutForCurrentDisplays(
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ash::DisplayLayout::FromInts(ash::DisplayLayout::TOP, 40));
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("40,-520 400x520",
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GetDisplayManager()->SetLayoutForCurrentDisplays(
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ash::DisplayLayout::FromInts(ash::DisplayLayout::BOTTOM, 80));
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  result = DisplayInfoProvider::Get()->GetAllDisplaysInfo();
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ(2u, result.size());
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds));
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("80,600 400x520",
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            SystemInfoDisplayBoundsToString(result[1]->bounds));
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftExact) {
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-520));
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(50));
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
330ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-520,50 520x400", secondary.bounds().ToString());
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginRightExact) {
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(1200));
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(100));
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
349ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString());
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopExact) {
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(1100));
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-400));
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
368ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1100,-400 520x400", secondary.bounds().ToString());
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginBottomExact) {
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-350));
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(600));
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
38103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
38203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-350,600 520x400", secondary.bounds().ToString());
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSameCenter) {
3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(340));
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(100));
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
406ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString());
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftOutside) {
4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-1040));
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(100));
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
425ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-520,100 520x400", secondary.bounds().ToString());
4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopOutside) {
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,520x400");
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-360));
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-301));
4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
43803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
444ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-360,-400 520x400", secondary.bounds().ToString());
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest,
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       SetBoundsOriginLeftButSharesBottomSide) {
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,1000x100");
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-650));
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(700));
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
45903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-650,600 1000x100", secondary.bounds().ToString());
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
46703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginRightButSharesTopSide) {
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,1000x100");
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(850));
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-150));
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
47703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
483ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("850,-100 1000x100", secondary.bounds().ToString());
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
48603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopButSharesLeftSide) {
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,1000x100/l");
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(-150));
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-650));
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
49603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
49703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
502ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("-100,-650 100x1000", secondary.bounds().ToString());
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest,
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       SetBoundsOriginBottomButSharesRightSide) {
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,1000x100/l");
5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(1350));
5127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(450));
5137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
51603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
5207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,450 100x1000", secondary.bounds().ToString());
5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginPrimaryHiDPI) {
5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600*2,500x500");
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(250));
5317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-100));
5327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
5347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
53503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
53603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
5377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
5397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
5407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
541ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("600,-100 500x500", secondary.bounds().ToString());
5427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSecondaryHiDPI) {
5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(450));
5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-100));
5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
55403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
55503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(error.empty());
5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
560ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("450,-500 300x500", secondary.bounds().ToString());
5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBounds) {
5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(0x200001));
5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-100));
5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
57303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
57403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ("Bounds origin x out of bounds.", error);
5787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
579ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBoundsNegative) {
5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(300));
5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(-0x200001));
5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
59203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
59303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ("Bounds origin y out of bounds.", error);
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
598ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginMaxValues) {
6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x4600,600x1000*2");
6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(200000));
6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_y.reset(new int(10));
6087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
61103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
61203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
6167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
617ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,10 300x500", secondary.bounds().ToString());
6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOnPrimary) {
6217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(300));
6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.is_primary.reset(new bool(true));
6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
63103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ("Bounds origin not allowed for the primary display.", error);
6357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
636ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The operation failed because the primary property would be set before
6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // setting bounds. The primary display shouldn't have been changed, though.
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id());
6407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginWithMirroring) {
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& primary = ash::Shell::GetScreen()->GetPrimaryDisplay();
6477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.bounds_origin_x.reset(new int(300));
6507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.mirroring_source_id.reset(
6517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new std::string(base::Int64ToString(primary.id())));
6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
65503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
65603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
6597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_EQ("No other parameter should be set alongside mirroringSourceId.",
6607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            error);
6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetRotation) {
6647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
6657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
6687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.rotation.reset(new int(90));
6697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
6717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
67203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
67303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
6767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
6777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString());
679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(gfx::Display::ROTATE_90, secondary.rotation());
6807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.rotation.reset(new int(270));
68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString());
689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(gfx::Display::ROTATE_270, secondary.rotation());
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.rotation.reset(new int(180));
6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Switch primary display.
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.is_primary.reset(new bool(true));
69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
6997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("0,0 300x500", secondary.bounds().ToString());
701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(gfx::Display::ROTATE_180, secondary.rotation());
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id());
7037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.rotation.reset(new int(0));
70503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
70603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
711ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("0,0 300x500", secondary.bounds().ToString());
712ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(gfx::Display::ROTATE_0, secondary.rotation());
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id());
7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetInvalidRotation) {
7177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
7187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.rotation.reset(new int(91));
7227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
7247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
72503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
72603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
7297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Invalid rotation.", error);
7307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetNegativeOverscan) {
7337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
7347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info.overscan.reset(new core_api::system_display::Insets);
73803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = -10;
7397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
74203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
74303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
7467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Negative overscan not allowed.", error);
7477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
748ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
75003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = 0;
7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->right = -200;
7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
75303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
75403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
7577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Negative overscan not allowed.", error);
7587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
759ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
7607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
76103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->right = 0;
7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = -300;
7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
76403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
76503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Negative overscan not allowed.", error);
7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
770ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
7717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->right = 0;
7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = -1000;
7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
77603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Negative overscan not allowed.", error);
7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
7827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
78303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->right = 0;
7847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = 0;
7857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
78603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
78703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
7887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
7907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
7917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString());
7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanHorizontalBounds) {
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info.overscan.reset(new core_api::system_display::Insets);
8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Horizontal overscan is 151, which would make the bounds width 149.
80203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = 50;
8037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = 10;
8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->right = 101;
8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->bottom = 20;
8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
8087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
80903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Horizontal overscan is more than half of the screen width.",
8147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            error);
8157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanVerticalBounds) {
8187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000");
8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info.overscan.reset(new core_api::system_display::Insets);
8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Vertical overscan is 501, which would make the bounds height 499.
82403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = 20;
8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = 250;
8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->right = 101;
8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->bottom = 251;
8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
83103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
83203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
83503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("Vertical overscan is more than half of the screen height.", error);
8367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetOverscan) {
8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay();
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info.overscan.reset(new core_api::system_display::Insets);
84403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = 20;
8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = 199;
8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->right = 130;
8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->bottom = 51;
8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
85103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
85203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(secondary.id()), info, &success, &error);
8537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(success);
8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(error.empty());
8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("1200,0 150x250", secondary.bounds().ToString());
8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gfx::Insets overscan =
859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetDisplayManager()->GetOverscanInsets(secondary.id());
8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(20, overscan.left());
8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(199, overscan.top());
8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(130, overscan.right());
8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(51, overscan.bottom());
8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayInfoProviderChromeosTest, SetOverscanForInternal) {
8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  UpdateDisplay("1200x600,600x1000*2");
8697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int64 internal_display_id =
87003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ash::test::DisplayManagerTestApi(GetDisplayManager())
87103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          .SetFirstDisplayAsInternalDisplay();
8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  core_api::system_display::DisplayProperties info;
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info.overscan.reset(new core_api::system_display::Insets);
8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Vertical overscan is 501, which would make the bounds height 499.
87603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  info.overscan->left = 20;
8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->top = 20;
8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->right = 20;
8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.overscan->bottom = 20;
8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool success = false;
8827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string error;
88303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallSetDisplayUnitInfo(
88403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Int64ToString(internal_display_id), info, &success, &error);
8857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(success);
88703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("Overscan changes not allowed for the internal monitor.", error);
8887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
8917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace extensions
892