// 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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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
