// Copyright 2017 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 "base/memory/ptr_util.h"
#include "base/values.h"
#include "headless/lib/browser/headless_devtools_manager_delegate.h"
#include "headless/lib/browser/headless_print_manager.h"
#include "printing/features/features.h"
#include "printing/units.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace headless {

TEST(ParsePrintSettingsTest, Landscape) {
  printing::HeadlessPrintSettings settings;
  EXPECT_FALSE(settings.landscape);

  auto params = base::MakeUnique<base::DictionaryValue>();
  params->SetBoolean("landscape", true);
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  EXPECT_TRUE(settings.landscape);
  EXPECT_EQ(nullptr, response);
}

TEST(ParsePrintSettingsTest, HeaderFooter) {
  printing::HeadlessPrintSettings settings;
  EXPECT_FALSE(settings.display_header_footer);

  auto params = base::MakeUnique<base::DictionaryValue>();
  params->SetBoolean("displayHeaderFooter", true);
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  EXPECT_TRUE(settings.display_header_footer);
  EXPECT_EQ(nullptr, response);
}

TEST(ParsePrintSettingsTest, PrintBackground) {
  printing::HeadlessPrintSettings settings;
  EXPECT_FALSE(settings.should_print_backgrounds);

  auto params = base::MakeUnique<base::DictionaryValue>();
  params->SetBoolean("printBackground", true);
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  EXPECT_TRUE(settings.should_print_backgrounds);
  EXPECT_EQ(nullptr, response);
}

TEST(ParsePrintSettingsTest, Scale) {
  printing::HeadlessPrintSettings settings;
  EXPECT_DOUBLE_EQ(1, settings.scale);

  auto params = base::MakeUnique<base::DictionaryValue>();
  params->SetDouble("scale", 0.5);
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  EXPECT_DOUBLE_EQ(0.5, settings.scale);
  EXPECT_EQ(nullptr, response);

  params->SetDouble("scale", -1);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_NE(nullptr, response);

  params->SetDouble("scale", 10);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_NE(nullptr, response);
}

TEST(ParsePrintSettingsTest, PageRanges) {
  printing::HeadlessPrintSettings settings;
  EXPECT_EQ("", settings.page_ranges);

  auto params = base::MakeUnique<base::DictionaryValue>();
  params->SetString("pageRanges", "abcd");
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  // Pass pageRanges text to settings directly and return no error, even if
  // it is invalid. The validation is deferred to HeadlessPrintMangager once the
  // total page count is available. See the PageRangeTextToPagesTest.
  EXPECT_EQ("abcd", settings.page_ranges);
  EXPECT_EQ(nullptr, response);
}

TEST(ParsePrintSettingsTest, Paper) {
  printing::HeadlessPrintSettings settings;

  auto params = base::MakeUnique<base::DictionaryValue>();
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  EXPECT_EQ(printing::kLetterWidthInch * printing::kPointsPerInch,
            settings.paper_size_in_points.width());
  EXPECT_EQ(printing::kLetterHeightInch * printing::kPointsPerInch,
            settings.paper_size_in_points.height());
  EXPECT_EQ(nullptr, response);

  params->SetDouble("paperWidth", 1);
  params->SetDouble("paperHeight", 2);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_EQ(1 * printing::kPointsPerInch,
            settings.paper_size_in_points.width());
  EXPECT_EQ(2 * printing::kPointsPerInch,
            settings.paper_size_in_points.height());
  EXPECT_EQ(nullptr, response);

  params->SetDouble("paperWidth", -1);
  params->SetDouble("paperHeight", 2);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_NE(nullptr, response);

  params->SetDouble("paperWidth", 1);
  params->SetDouble("paperHeight", -2);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_NE(nullptr, response);
}

TEST(ParsePrintSettingsTest, Margin) {
  printing::HeadlessPrintSettings settings;

  auto params = base::MakeUnique<base::DictionaryValue>();
  std::unique_ptr<base::DictionaryValue> response =
      ParsePrintSettings(0, params.get(), &settings);
  int default_margin =
      1000 * printing::kPointsPerInch / printing::kHundrethsMMPerInch;
  EXPECT_DOUBLE_EQ(default_margin, settings.margins_in_points.top);
  EXPECT_DOUBLE_EQ(default_margin, settings.margins_in_points.bottom);
  EXPECT_DOUBLE_EQ(default_margin, settings.margins_in_points.left);
  EXPECT_DOUBLE_EQ(default_margin, settings.margins_in_points.right);
  EXPECT_EQ(nullptr, response);

  params->SetDouble("marginTop", 1);
  params->SetDouble("marginBottom", 2);
  params->SetDouble("marginLeft", 3);
  params->SetDouble("marginRight", 4);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_DOUBLE_EQ(1 * printing::kPointsPerInch,
                   settings.margins_in_points.top);
  EXPECT_DOUBLE_EQ(2 * printing::kPointsPerInch,
                   settings.margins_in_points.bottom);
  EXPECT_DOUBLE_EQ(3 * printing::kPointsPerInch,
                   settings.margins_in_points.left);
  EXPECT_DOUBLE_EQ(4 * printing::kPointsPerInch,
                   settings.margins_in_points.right);
  EXPECT_EQ(nullptr, response);

  params->SetDouble("marginTop", -1);
  response = ParsePrintSettings(0, params.get(), &settings);
  EXPECT_NE(nullptr, response);
}

TEST(PageRangeTextToPagesTest, General) {
  using PM = printing::HeadlessPrintManager;
  std::vector<int> pages;
  std::vector<int> expected_pages;

  PM::PageRangeStatus status = PM::PageRangeTextToPages("-", 10, &pages);
  expected_pages = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  EXPECT_EQ(expected_pages, pages);
  EXPECT_EQ(PM::PRINT_NO_ERROR, status);

  status = PM::PageRangeTextToPages("-5", 10, &pages);
  expected_pages = {0, 1, 2, 3, 4};
  EXPECT_EQ(expected_pages, pages);
  EXPECT_EQ(PM::PRINT_NO_ERROR, status);

  status = PM::PageRangeTextToPages("5-", 10, &pages);
  expected_pages = {4, 5, 6, 7, 8, 9};
  EXPECT_EQ(expected_pages, pages);
  EXPECT_EQ(PM::PRINT_NO_ERROR, status);

  status = PM::PageRangeTextToPages("1-3,9-10,4-6", 10, &pages);
  expected_pages = {0, 1, 2, 3, 4, 5, 8, 9};
  EXPECT_EQ(expected_pages, pages);
  EXPECT_EQ(PM::PRINT_NO_ERROR, status);

  status = PM::PageRangeTextToPages("1- 3, 9-10,4 -6", 10, &pages);
  expected_pages = {0, 1, 2, 3, 4, 5, 8, 9};
  EXPECT_EQ(expected_pages, pages);
  EXPECT_EQ(PM::PRINT_NO_ERROR, status);

  status = PM::PageRangeTextToPages("1-3,9-10,4-6", 5, &pages);
  EXPECT_EQ(PM::LIMIT_ERROR, status);

  status = PM::PageRangeTextToPages("abcd", 10, &pages);
  EXPECT_EQ(PM::SYNTAX_ERROR, status);

  status = PM::PageRangeTextToPages("1-3,9-a10,4-6", 10, &pages);
  EXPECT_EQ(PM::SYNTAX_ERROR, status);
}

}  // namespace headless
