| // Copyright 2016 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "ui/display/display.h" | 
 |  | 
 | #include <tuple> | 
 | #include <vector> | 
 |  | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 | #include "ui/display/display_layout.h" | 
 | #include "ui/display/display_layout_builder.h" | 
 |  | 
 | namespace display { | 
 |  | 
 | using Position = DisplayPlacement::Position; | 
 |  | 
 | TEST(DisplayLayoutTest, Empty) { | 
 |   Displays display_list; | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayout display_layout; | 
 |   display_layout.ApplyToDisplayList(&display_list, &updated_ids, 0); | 
 |  | 
 |   EXPECT_EQ(0u, updated_ids.size()); | 
 |   EXPECT_EQ(0u, display_list.size()); | 
 | } | 
 |  | 
 | TEST(DisplayLayoutTest, SingleDisplayNoPlacements) { | 
 |   Displays display_list; | 
 |   display_list.emplace_back(0, gfx::Rect(0, 0, 800, 600)); | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayout display_layout; | 
 |   display_layout.ApplyToDisplayList(&display_list, &updated_ids, 0); | 
 |  | 
 |   EXPECT_EQ(0u, updated_ids.size()); | 
 |   ASSERT_EQ(1u, display_list.size()); | 
 |   EXPECT_EQ(gfx::Rect(0, 0, 800, 600), display_list[0].bounds()); | 
 | } | 
 |  | 
 | TEST(DisplayLayoutTest, SingleDisplayNonRelevantPlacement) { | 
 |   Displays display_list; | 
 |   display_list.emplace_back(0, gfx::Rect(0, 0, 800, 600)); | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayoutBuilder builder(20); | 
 |   builder.AddDisplayPlacement(20, 40, DisplayPlacement::Position::LEFT, 150); | 
 |   std::unique_ptr<DisplayLayout> display_layout(builder.Build()); | 
 |   display_layout->ApplyToDisplayList(&display_list, &updated_ids, 0); | 
 |  | 
 |   EXPECT_EQ(0u, updated_ids.size()); | 
 |   ASSERT_EQ(1u, display_list.size()); | 
 |   EXPECT_EQ(gfx::Rect(0, 0, 800, 600), display_list[0].bounds()); | 
 | } | 
 |  | 
 | TEST(DisplayLayoutTest, SwapPrimaryDisplay) { | 
 |   std::unique_ptr<DisplayLayout> layout = | 
 |       DisplayLayoutBuilder(123) | 
 |           .AddDisplayPlacement(456, 123, Position::LEFT, 150) | 
 |           .Build(); | 
 |  | 
 |   // Initial layout will be 123 <-- 456 | 
 |   EXPECT_EQ(123, layout->primary_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(123, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::LEFT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(150, layout->placement_list[0].offset); | 
 |  | 
 |   // Swap layout to 123 --> 456. | 
 |   layout->SwapPrimaryDisplay(456); | 
 |   EXPECT_EQ(456, layout->primary_id); | 
 |   EXPECT_EQ(123, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::RIGHT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(-150, layout->placement_list[0].offset); | 
 |  | 
 |   // Swap layout back to 123 <-- 456. | 
 |   layout->SwapPrimaryDisplay(123); | 
 |   EXPECT_EQ(123, layout->primary_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(123, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::LEFT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(150, layout->placement_list[0].offset); | 
 | } | 
 |  | 
 | TEST(DisplayLayoutTest, SwapPrimaryDisplayThreeDisplays) { | 
 |   std::unique_ptr<DisplayLayout> layout = | 
 |       DisplayLayoutBuilder(456) | 
 |           .AddDisplayPlacement(123, 456, Position::LEFT, 0) | 
 |           .AddDisplayPlacement(789, 456, Position::RIGHT, 0) | 
 |           .Build(); | 
 |  | 
 |   // Note: Placement order is determined by least significant 8 bits of IDs. | 
 |   // Initial layout will be 123 (0x7B) --> 456 (0x1C8) <-- 789 (0x315). | 
 |   EXPECT_EQ(456, layout->primary_id); | 
 |   EXPECT_EQ(789, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::RIGHT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(123, layout->placement_list[1].display_id); | 
 |   EXPECT_EQ(456, layout->placement_list[1].parent_display_id); | 
 |   EXPECT_EQ(Position::LEFT, layout->placement_list[1].position); | 
 |  | 
 |   // Swap layout to 123 --> 456 --> 789. | 
 |   layout->SwapPrimaryDisplay(789); | 
 |   EXPECT_EQ(789, layout->primary_id); | 
 |   EXPECT_EQ(123, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::LEFT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(456, layout->placement_list[1].display_id); | 
 |   EXPECT_EQ(789, layout->placement_list[1].parent_display_id); | 
 |   EXPECT_EQ(Position::LEFT, layout->placement_list[1].position); | 
 |  | 
 |   // Swap layout to 123 <-- 456 <-- 789. | 
 |   layout->SwapPrimaryDisplay(123); | 
 |   EXPECT_EQ(123, layout->primary_id); | 
 |   EXPECT_EQ(789, layout->placement_list[0].display_id); | 
 |   EXPECT_EQ(456, layout->placement_list[0].parent_display_id); | 
 |   EXPECT_EQ(Position::RIGHT, layout->placement_list[0].position); | 
 |   EXPECT_EQ(456, layout->placement_list[1].display_id); | 
 |   EXPECT_EQ(123, layout->placement_list[1].parent_display_id); | 
 |   EXPECT_EQ(Position::RIGHT, layout->placement_list[1].position); | 
 | } | 
 |  | 
 | // Makes sure that only the least significant 8 bits of the display IDs in the | 
 | // placement lists are used to validate their sort order. | 
 | TEST(DisplayLayoutTest, PlacementSortOrder) { | 
 |   // Sorted placement lists by full IDs, but not sorted by the least significant | 
 |   // 8 bits of the IDs. | 
 |   std::unique_ptr<DisplayLayout> layout(new DisplayLayout); | 
 |   layout->primary_id = 456; | 
 |   layout->placement_list.emplace_back(0x0405, 456, Position::LEFT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   layout->placement_list.emplace_back(0x0506, 0x0405, Position::RIGHT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   layout->placement_list.emplace_back(0x0604, 0x0506, Position::RIGHT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   EXPECT_FALSE(DisplayLayout::Validate({456, 0x0405, 0x0506, 0x0604}, *layout)); | 
 |  | 
 |   // Full IDs not sorted, but least significant 8 bits of the IDs are sorted. | 
 |   layout->placement_list.clear(); | 
 |   layout->placement_list.emplace_back(0x0504, 456, Position::LEFT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   layout->placement_list.emplace_back(0x0605, 0x0504, Position::RIGHT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   layout->placement_list.emplace_back(0x0406, 0x0605, Position::RIGHT, 0, | 
 |                                       DisplayPlacement::TOP_LEFT); | 
 |   EXPECT_TRUE(DisplayLayout::Validate({456, 0x0504, 0x0605, 0x0406}, *layout)); | 
 | } | 
 |  | 
 | namespace { | 
 |  | 
 | class TwoDisplays | 
 |     : public testing::TestWithParam<std::tuple< | 
 |           // Primary Display Bounds | 
 |           gfx::Rect, | 
 |           // Secondary Display Bounds | 
 |           gfx::Rect, | 
 |           // Secondary Layout Position | 
 |           DisplayPlacement::Position, | 
 |           // Secondary Layout Offset | 
 |           int, | 
 |           // Minimum Offset Overlap | 
 |           int, | 
 |           // Expected Primary Display Bounds | 
 |           gfx::Rect, | 
 |           // Expected Secondary Display Bounds | 
 |           gfx::Rect>> { | 
 |  public: | 
 |   TwoDisplays() = default; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(TwoDisplays); | 
 | }; | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST_P(TwoDisplays, Placement) { | 
 |   gfx::Rect primary_display_bounds = std::get<0>(GetParam()); | 
 |   gfx::Rect secondary_display_bounds = std::get<1>(GetParam()); | 
 |   DisplayPlacement::Position position = std::get<2>(GetParam()); | 
 |   int offset = std::get<3>(GetParam()); | 
 |   int minimum_offset_overlap = std::get<4>(GetParam()); | 
 |   gfx::Rect expected_primary_display_bounds = std::get<5>(GetParam()); | 
 |   gfx::Rect expected_secondary_display_bounds = std::get<6>(GetParam()); | 
 |  | 
 |   Displays display_list; | 
 |   display_list.emplace_back(0, primary_display_bounds); | 
 |   display_list.emplace_back(1, secondary_display_bounds); | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayoutBuilder builder(0); | 
 |   builder.AddDisplayPlacement(1, 0, position, offset); | 
 |   std::unique_ptr<DisplayLayout> display_layout(builder.Build()); | 
 |   display_layout->ApplyToDisplayList( | 
 |       &display_list, &updated_ids, minimum_offset_overlap); | 
 |  | 
 |   ASSERT_EQ(1u, updated_ids.size()); | 
 |   EXPECT_EQ(1u, updated_ids[0]); | 
 |   ASSERT_EQ(2u, display_list.size()); | 
 |   EXPECT_EQ(expected_primary_display_bounds, display_list[0].bounds()); | 
 |   EXPECT_EQ(expected_secondary_display_bounds, display_list[1].bounds()); | 
 | } | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestZero, TwoDisplays, testing::Values( | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::LEFT, 0, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 0, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::TOP, 0, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, -768, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::RIGHT, 0, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 0, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::BOTTOM, 0, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 600, 1024, 768)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestOffset, TwoDisplays, testing::Values( | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::LEFT, 37, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 37, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::TOP, 37, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(37, -768, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::RIGHT, 37, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 37, 1024, 768)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |         DisplayPlacement::Position::BOTTOM, 37, 0, | 
 |         gfx::Rect(0, 0, 800, 600), gfx::Rect(37, 600, 1024, 768)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestCorner, TwoDisplays, testing::Values( | 
 |     // Top-Left | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::LEFT, -60, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -60, 30, 60)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::TOP, -30, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -60, 30, 60)), | 
 |     // Top-Right | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::RIGHT, -60, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -60, 30, 60)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::TOP, 20, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -60, 30, 60)), | 
 |     // Bottom-Right | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::RIGHT, 40, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 40, 30, 60)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::BOTTOM, 20, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 40, 30, 60)), | 
 |     // Bottom-Left | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::LEFT, 40, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 40, 30, 60)), | 
 |     std::make_tuple( | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |         DisplayPlacement::Position::BOTTOM, -30, 0, | 
 |         gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 40, 30, 60)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestZeroMinimumOverlap, TwoDisplays, | 
 |     testing::Values( | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::LEFT, 0, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 0, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::TOP, 0, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, -768, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::RIGHT, 0, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 0, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::BOTTOM, 0, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 600, 1024, 768)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestOffsetMinimumOverlap, TwoDisplays, | 
 |     testing::Values( | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::LEFT, 37, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 37, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::TOP, 37, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(37, -768, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::RIGHT, 37, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 37, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::BOTTOM, 37, 14, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(37, 600, 1024, 768)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestMinimumOverlap, TwoDisplays, | 
 |     testing::Values( | 
 |         // Top-Left | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::LEFT, -60, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -46, 30, 60)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::TOP, -30, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(-16, -60, 30, 60)), | 
 |         // Top-Right | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::RIGHT, -60, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -46, 30, 60)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::TOP, 20, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(6, -60, 30, 60)), | 
 |         // Bottom-Right | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::RIGHT, 40, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 26, 30, 60)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::BOTTOM, 20, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(6, 40, 30, 60)), | 
 |         // Bottom-Left | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::LEFT, 40, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 26, 30, 60)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60), | 
 |             DisplayPlacement::Position::BOTTOM, -30, 14, | 
 |             gfx::Rect(0, 0, 20, 40), gfx::Rect(-16, 40, 30, 60)))); | 
 |  | 
 | // Display Layout | 
 | //     [1]  [4] | 
 | //    [0][3]   [6] | 
 | // [2]  [5] | 
 | TEST(DisplayLayoutTest, MultipleDisplays) { | 
 |   Displays display_list; | 
 |   display_list.emplace_back(0, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(1, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(2, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(3, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(4, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(5, gfx::Rect(0, 0, 100, 100)); | 
 |   display_list.emplace_back(6, gfx::Rect(0, 0, 100, 100)); | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayoutBuilder builder(0); | 
 |   builder.AddDisplayPlacement(1, 0, DisplayPlacement::Position::TOP, 50); | 
 |   builder.AddDisplayPlacement(2, 0, DisplayPlacement::Position::LEFT, 100); | 
 |   builder.AddDisplayPlacement(3, 0, DisplayPlacement::Position::RIGHT, 0); | 
 |   builder.AddDisplayPlacement(4, 3, DisplayPlacement::Position::RIGHT, -100); | 
 |   builder.AddDisplayPlacement(5, 3, DisplayPlacement::Position::BOTTOM, -50); | 
 |   builder.AddDisplayPlacement(6, 4, DisplayPlacement::Position::BOTTOM, 100); | 
 |   std::unique_ptr<DisplayLayout> display_layout(builder.Build()); | 
 |   display_layout->ApplyToDisplayList(&display_list, &updated_ids, 0); | 
 |  | 
 |   ASSERT_EQ(6u, updated_ids.size()); | 
 |   std::sort(updated_ids.begin(), updated_ids.end()); | 
 |   EXPECT_EQ(1u, updated_ids[0]); | 
 |   EXPECT_EQ(2u, updated_ids[1]); | 
 |   EXPECT_EQ(3u, updated_ids[2]); | 
 |   EXPECT_EQ(4u, updated_ids[3]); | 
 |   EXPECT_EQ(5u, updated_ids[4]); | 
 |   EXPECT_EQ(6u, updated_ids[5]); | 
 |   EXPECT_EQ(gfx::Rect(0, 0, 100, 100), display_list[0].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(50, -100, 100, 100), display_list[1].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(-100, 100, 100, 100), display_list[2].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(100, 0, 100, 100), display_list[3].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(200, -100, 100, 100), display_list[4].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(50, 100, 100, 100), display_list[5].bounds()); | 
 |   EXPECT_EQ(gfx::Rect(300, 0, 100, 100), display_list[6].bounds()); | 
 | } | 
 |  | 
 | namespace { | 
 |  | 
 | class TwoDisplaysBottomRightReference | 
 |   : public testing::TestWithParam<std::tuple< | 
 |         // Primary Display Bounds | 
 |         gfx::Rect, | 
 |         // Secondary Display Bounds | 
 |         gfx::Rect, | 
 |         // Secondary Layout Position | 
 |         DisplayPlacement::Position, | 
 |         // Secondary Layout Offset | 
 |         int, | 
 |         // Minimum Offset Overlap | 
 |         int, | 
 |         // Expected Primary Display Bounds | 
 |         gfx::Rect, | 
 |         // Expected Secondary Display Bounds | 
 |         gfx::Rect>> { | 
 |  public: | 
 |   TwoDisplaysBottomRightReference() = default; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(TwoDisplaysBottomRightReference); | 
 | }; | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST_P(TwoDisplaysBottomRightReference, Placement) { | 
 |   gfx::Rect primary_display_bounds = std::get<0>(GetParam()); | 
 |   gfx::Rect secondary_display_bounds = std::get<1>(GetParam()); | 
 |   DisplayPlacement::Position position = std::get<2>(GetParam()); | 
 |   int offset = std::get<3>(GetParam()); | 
 |   int minimum_offset_overlap = std::get<4>(GetParam()); | 
 |   gfx::Rect expected_primary_display_bounds = std::get<5>(GetParam()); | 
 |   gfx::Rect expected_secondary_display_bounds = std::get<6>(GetParam()); | 
 |  | 
 |   Displays display_list; | 
 |   display_list.emplace_back(0, primary_display_bounds); | 
 |   display_list.emplace_back(1, secondary_display_bounds); | 
 |   std::vector<int64_t> updated_ids; | 
 |  | 
 |   DisplayLayoutBuilder builder(0); | 
 |   DisplayPlacement placement; | 
 |   placement.display_id = 1; | 
 |   placement.parent_display_id = 0; | 
 |   placement.position = position; | 
 |   placement.offset = offset; | 
 |   placement.offset_reference = DisplayPlacement::OffsetReference::BOTTOM_RIGHT; | 
 |   builder.AddDisplayPlacement(placement); | 
 |   std::unique_ptr<DisplayLayout> display_layout(builder.Build()); | 
 |   display_layout->ApplyToDisplayList( | 
 |       &display_list, &updated_ids, minimum_offset_overlap); | 
 |  | 
 |   ASSERT_EQ(1u, updated_ids.size()); | 
 |   EXPECT_EQ(1u, updated_ids[0]); | 
 |   ASSERT_EQ(2u, display_list.size()); | 
 |   EXPECT_EQ(expected_primary_display_bounds, display_list[0].bounds()); | 
 |   EXPECT_EQ(expected_secondary_display_bounds, display_list[1].bounds()); | 
 | } | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestZero, TwoDisplaysBottomRightReference, | 
 |     testing::Values( | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::LEFT, 0, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, -168, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::TOP, 0, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-224, -768, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::RIGHT, 0, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(800, -168, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::BOTTOM, 0, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-224, 600, 1024, 768)))); | 
 |  | 
 | INSTANTIATE_TEST_CASE_P(DisplayLayoutTestOffset, | 
 |     TwoDisplaysBottomRightReference, testing::Values( | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::LEFT, 7, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, -175, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::TOP, 7, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-231, -768, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::RIGHT, 7, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(800, -175, 1024, 768)), | 
 |         std::make_tuple( | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768), | 
 |             DisplayPlacement::Position::BOTTOM, 7, 0, | 
 |             gfx::Rect(0, 0, 800, 600), gfx::Rect(-231, 600, 1024, 768)))); | 
 |  | 
 | }  // namespace display |