// Copyright 2019 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 "pdf/document_layout.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"

namespace chrome_pdf {

namespace {

class DocumentLayoutOptionsTest : public testing::Test {
 protected:
  DocumentLayout::Options options_;
};

TEST_F(DocumentLayoutOptionsTest, DefaultConstructor) {
  EXPECT_EQ(options_.default_page_orientation(), PageOrientation::kOriginal);
  EXPECT_EQ(options_.page_spread(), DocumentLayout::PageSpread::kOneUp);
}

TEST_F(DocumentLayoutOptionsTest, CopyConstructor) {
  options_.RotatePagesClockwise();
  options_.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);

  DocumentLayout::Options copy(options_);
  EXPECT_EQ(copy.default_page_orientation(), PageOrientation::kClockwise90);
  EXPECT_EQ(copy.page_spread(), DocumentLayout::PageSpread::kTwoUpOdd);

  options_.RotatePagesClockwise();
  options_.set_page_spread(DocumentLayout::PageSpread::kOneUp);
  EXPECT_EQ(copy.default_page_orientation(), PageOrientation::kClockwise90);
  EXPECT_EQ(copy.page_spread(), DocumentLayout::PageSpread::kTwoUpOdd);
}

TEST_F(DocumentLayoutOptionsTest, CopyAssignment) {
  options_.RotatePagesClockwise();
  options_.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);

  DocumentLayout::Options copy = options_;
  EXPECT_EQ(copy.default_page_orientation(), PageOrientation::kClockwise90);
  EXPECT_EQ(copy.page_spread(), DocumentLayout::PageSpread::kTwoUpOdd);

  options_.RotatePagesClockwise();
  options_.set_page_spread(DocumentLayout::PageSpread::kOneUp);
  EXPECT_EQ(copy.default_page_orientation(), PageOrientation::kClockwise90);
  EXPECT_EQ(copy.page_spread(), DocumentLayout::PageSpread::kTwoUpOdd);
}

TEST_F(DocumentLayoutOptionsTest, Equals) {
  EXPECT_TRUE(options_ == options_);

  DocumentLayout::Options copy;
  EXPECT_TRUE(copy == options_);

  options_.RotatePagesClockwise();
  EXPECT_FALSE(copy == options_);

  copy.RotatePagesClockwise();
  EXPECT_TRUE(copy == options_);

  options_.RotatePagesCounterclockwise();
  EXPECT_FALSE(copy == options_);

  copy.RotatePagesCounterclockwise();
  EXPECT_TRUE(copy == options_);

  options_.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);
  EXPECT_FALSE(copy == options_);

  copy.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);
  EXPECT_TRUE(copy == options_);

  options_.set_page_spread(DocumentLayout::PageSpread::kOneUp);
  EXPECT_FALSE(copy == options_);

  copy.set_page_spread(DocumentLayout::PageSpread::kOneUp);
  EXPECT_TRUE(copy == options_);
}

TEST_F(DocumentLayoutOptionsTest, NotEquals) {
  // Given that "!=" is defined as "!(==)", minimal tests should be sufficient
  // here.
  EXPECT_FALSE(options_ != options_);

  DocumentLayout::Options copy;
  EXPECT_FALSE(copy != options_);

  options_.RotatePagesClockwise();
  EXPECT_TRUE(copy != options_);

  copy.RotatePagesClockwise();
  EXPECT_FALSE(copy != options_);
}

TEST_F(DocumentLayoutOptionsTest, RotatePagesClockwise) {
  options_.RotatePagesClockwise();
  EXPECT_EQ(options_.default_page_orientation(), PageOrientation::kClockwise90);

  options_.RotatePagesClockwise();
  EXPECT_EQ(options_.default_page_orientation(),
            PageOrientation::kClockwise180);

  options_.RotatePagesClockwise();
  EXPECT_EQ(options_.default_page_orientation(),
            PageOrientation::kClockwise270);

  options_.RotatePagesClockwise();
  EXPECT_EQ(options_.default_page_orientation(), PageOrientation::kOriginal);
}

TEST_F(DocumentLayoutOptionsTest, RotatePagesCounterclockwise) {
  options_.RotatePagesCounterclockwise();
  EXPECT_EQ(options_.default_page_orientation(),
            PageOrientation::kClockwise270);

  options_.RotatePagesCounterclockwise();
  EXPECT_EQ(options_.default_page_orientation(),
            PageOrientation::kClockwise180);

  options_.RotatePagesCounterclockwise();
  EXPECT_EQ(options_.default_page_orientation(), PageOrientation::kClockwise90);

  options_.RotatePagesCounterclockwise();
  EXPECT_EQ(options_.default_page_orientation(), PageOrientation::kOriginal);
}

class DocumentLayoutTest : public testing::Test {
 protected:
  void SetPageSpread(DocumentLayout::PageSpread page_spread) {
    DocumentLayout::Options options;
    options.set_page_spread(page_spread);
    layout_.SetOptions(options);
  }

  DocumentLayout layout_;
};

TEST_F(DocumentLayoutTest, DefaultConstructor) {
  EXPECT_EQ(layout_.options().default_page_orientation(),
            PageOrientation::kOriginal);
  EXPECT_EQ(layout_.options().page_spread(),
            DocumentLayout::PageSpread::kOneUp);
  EXPECT_FALSE(layout_.dirty());
  EXPECT_EQ(layout_.size(), gfx::Size(0, 0));
  EXPECT_EQ(layout_.page_count(), 0u);
}

TEST_F(DocumentLayoutTest, SetOptionsDoesNotRecomputeLayout) {
  layout_.ComputeLayout({{100, 200}});
  EXPECT_EQ(layout_.size(), gfx::Size(100, 200));

  DocumentLayout::Options options;
  options.RotatePagesClockwise();
  layout_.SetOptions(options);
  EXPECT_EQ(layout_.options().default_page_orientation(),
            PageOrientation::kClockwise90);
  EXPECT_EQ(layout_.size(), gfx::Size(100, 200));
}

TEST_F(DocumentLayoutTest, DirtySetOnOptionsChange) {
  DocumentLayout::Options options;
  layout_.SetOptions(options);
  EXPECT_FALSE(layout_.dirty());

  options.RotatePagesClockwise();
  layout_.SetOptions(options);
  EXPECT_TRUE(layout_.dirty());

  layout_.clear_dirty();

  options.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);
  layout_.SetOptions(options);
  EXPECT_TRUE(layout_.dirty());
}

TEST_F(DocumentLayoutTest, DirtyNotSetOnSameOptions) {
  DocumentLayout::Options options;
  options.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);
  layout_.SetOptions(options);
  EXPECT_TRUE(layout_.dirty());

  layout_.clear_dirty();

  options.set_page_spread(DocumentLayout::PageSpread::kTwoUpOdd);
  layout_.SetOptions(options);
  EXPECT_FALSE(layout_.dirty());
}

TEST_F(DocumentLayoutTest, ComputeLayoutOneUp) {
  SetPageSpread(DocumentLayout::PageSpread::kOneUp);

  std::vector<gfx::Size> page_sizes{
      {300, 400}, {400, 500}, {300, 400}, {200, 300}};
  layout_.ComputeLayout(page_sizes);
  ASSERT_EQ(4u, layout_.page_count());
  EXPECT_EQ(gfx::Rect(50, 0, 300, 400), layout_.page_rect(0));
  EXPECT_EQ(gfx::Rect(0, 404, 400, 500), layout_.page_rect(1));
  EXPECT_EQ(gfx::Rect(50, 908, 300, 400), layout_.page_rect(2));
  EXPECT_EQ(gfx::Rect(100, 1312, 200, 300), layout_.page_rect(3));
  EXPECT_EQ(gfx::Rect(55, 3, 290, 390), layout_.page_bounds_rect(0));
  EXPECT_EQ(gfx::Rect(5, 407, 390, 490), layout_.page_bounds_rect(1));
  EXPECT_EQ(gfx::Rect(55, 911, 290, 390), layout_.page_bounds_rect(2));
  EXPECT_EQ(gfx::Rect(105, 1315, 190, 290), layout_.page_bounds_rect(3));
  EXPECT_EQ(gfx::Size(400, 1612), layout_.size());

  page_sizes = {{240, 300}, {320, 400}, {250, 360}, {300, 600}, {270, 555}};
  layout_.ComputeLayout(page_sizes);
  ASSERT_EQ(5u, layout_.page_count());
  EXPECT_EQ(gfx::Rect(40, 0, 240, 300), layout_.page_rect(0));
  EXPECT_EQ(gfx::Rect(0, 304, 320, 400), layout_.page_rect(1));
  EXPECT_EQ(gfx::Rect(35, 708, 250, 360), layout_.page_rect(2));
  EXPECT_EQ(gfx::Rect(10, 1072, 300, 600), layout_.page_rect(3));
  EXPECT_EQ(gfx::Rect(25, 1676, 270, 555), layout_.page_rect(4));
  EXPECT_EQ(gfx::Rect(45, 3, 230, 290), layout_.page_bounds_rect(0));
  EXPECT_EQ(gfx::Rect(5, 307, 310, 390), layout_.page_bounds_rect(1));
  EXPECT_EQ(gfx::Rect(40, 711, 240, 350), layout_.page_bounds_rect(2));
  EXPECT_EQ(gfx::Rect(15, 1075, 290, 590), layout_.page_bounds_rect(3));
  EXPECT_EQ(gfx::Rect(30, 1679, 260, 545), layout_.page_bounds_rect(4));
  EXPECT_EQ(gfx::Size(320, 2231), layout_.size());
}

TEST_F(DocumentLayoutTest, DirtySetOnLayoutInputChangeOneUp) {
  SetPageSpread(DocumentLayout::PageSpread::kOneUp);

  layout_.ComputeLayout({{100, 200}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();
  EXPECT_FALSE(layout_.dirty());

  layout_.ComputeLayout({{100, 200}});
  EXPECT_FALSE(layout_.dirty());

  layout_.ComputeLayout({{200, 100}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();

  layout_.ComputeLayout({{200, 100}, {300, 300}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();

  layout_.ComputeLayout({{200, 100}});
  EXPECT_TRUE(layout_.dirty());
}

TEST_F(DocumentLayoutTest, ComputeLayoutTwoUpOdd) {
  SetPageSpread(DocumentLayout::PageSpread::kTwoUpOdd);

  // Test case where the widest page is on the right.
  std::vector<gfx::Size> page_sizes{
      {826, 1066}, {1066, 826}, {826, 1066}, {826, 900}};
  layout_.ComputeLayout(page_sizes);
  ASSERT_EQ(4u, layout_.page_count());
  EXPECT_EQ(gfx::Rect(240, 0, 826, 1066), layout_.page_rect(0));
  EXPECT_EQ(gfx::Rect(1066, 0, 1066, 826), layout_.page_rect(1));
  EXPECT_EQ(gfx::Rect(240, 1066, 826, 1066), layout_.page_rect(2));
  EXPECT_EQ(gfx::Rect(1066, 1066, 826, 900), layout_.page_rect(3));
  EXPECT_EQ(gfx::Rect(245, 3, 820, 1056), layout_.page_bounds_rect(0));
  EXPECT_EQ(gfx::Rect(1067, 3, 1060, 816), layout_.page_bounds_rect(1));
  EXPECT_EQ(gfx::Rect(245, 1069, 820, 1056), layout_.page_bounds_rect(2));
  EXPECT_EQ(gfx::Rect(1067, 1069, 820, 890), layout_.page_bounds_rect(3));
  EXPECT_EQ(gfx::Size(2132, 2132), layout_.size());

  // Test case where the widest page is on the left.
  page_sizes = {{1066, 826}, {820, 1056}, {820, 890}, {826, 1066}};
  layout_.ComputeLayout(page_sizes);
  ASSERT_EQ(4u, layout_.page_count());
  EXPECT_EQ(gfx::Rect(0, 0, 1066, 826), layout_.page_rect(0));
  EXPECT_EQ(gfx::Rect(1066, 0, 820, 1056), layout_.page_rect(1));
  EXPECT_EQ(gfx::Rect(246, 1056, 820, 890), layout_.page_rect(2));
  EXPECT_EQ(gfx::Rect(1066, 1056, 826, 1066), layout_.page_rect(3));
  EXPECT_EQ(gfx::Rect(5, 3, 1060, 816), layout_.page_bounds_rect(0));
  EXPECT_EQ(gfx::Rect(1067, 3, 814, 1046), layout_.page_bounds_rect(1));
  EXPECT_EQ(gfx::Rect(251, 1059, 814, 880), layout_.page_bounds_rect(2));
  EXPECT_EQ(gfx::Rect(1067, 1059, 820, 1056), layout_.page_bounds_rect(3));
  EXPECT_EQ(gfx::Size(2132, 2122), layout_.size());

  // Test case where there's an odd # of pages.
  page_sizes = {{200, 300}, {400, 200}, {300, 600}, {250, 500}, {300, 400}};
  layout_.ComputeLayout(page_sizes);
  ASSERT_EQ(5u, layout_.page_count());
  EXPECT_EQ(gfx::Rect(200, 0, 200, 300), layout_.page_rect(0));
  EXPECT_EQ(gfx::Rect(400, 0, 400, 200), layout_.page_rect(1));
  EXPECT_EQ(gfx::Rect(100, 300, 300, 600), layout_.page_rect(2));
  EXPECT_EQ(gfx::Rect(400, 300, 250, 500), layout_.page_rect(3));
  EXPECT_EQ(gfx::Rect(100, 900, 300, 400), layout_.page_rect(4));
  EXPECT_EQ(gfx::Rect(205, 3, 194, 290), layout_.page_bounds_rect(0));
  EXPECT_EQ(gfx::Rect(401, 3, 394, 190), layout_.page_bounds_rect(1));
  EXPECT_EQ(gfx::Rect(105, 303, 294, 590), layout_.page_bounds_rect(2));
  EXPECT_EQ(gfx::Rect(401, 303, 244, 490), layout_.page_bounds_rect(3));
  EXPECT_EQ(gfx::Rect(105, 903, 290, 390), layout_.page_bounds_rect(4));
  EXPECT_EQ(gfx::Size(800, 1300), layout_.size());
}

TEST_F(DocumentLayoutTest, DirtySetOnLayoutInputChangeTwoUpOdd) {
  SetPageSpread(DocumentLayout::PageSpread::kTwoUpOdd);

  layout_.ComputeLayout({{100, 200}, {200, 100}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();
  EXPECT_FALSE(layout_.dirty());

  layout_.ComputeLayout({{100, 200}, {200, 100}});
  EXPECT_FALSE(layout_.dirty());

  layout_.ComputeLayout({{200, 100}, {100, 200}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();

  layout_.ComputeLayout({{200, 100}, {100, 200}, {300, 300}});
  EXPECT_TRUE(layout_.dirty());
  layout_.clear_dirty();

  layout_.ComputeLayout({{200, 100}, {100, 200}});
  EXPECT_TRUE(layout_.dirty());
}

}  // namespace

}  // namespace chrome_pdf
