// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "printing/printing_utils.h"

#include <stddef.h>

#include <limits>
#include <string>

#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "printing/buildflags/buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/size.h"

#if BUILDFLAG(IS_WIN)
#include "base/win/scoped_hdc.h"
#include "printing/backend/printing_info_win.h"
#include "printing/backend/win_helper.h"
#include "printing/printing_test.h"
#include "ui/gfx/geometry/rect.h"
#endif

namespace printing {

namespace {

constexpr size_t kTestLength = 8;

#if BUILDFLAG(USE_CUPS) && !BUILDFLAG(IS_CHROMEOS)
constexpr gfx::Size kIsoA4Microns(210000, 297000);
constexpr gfx::Size kNaLetterMicrons(216000, 279000);
#endif

std::string Simplify(const std::string& title) {
  return base::UTF16ToUTF8(
      SimplifyDocumentTitleWithLength(base::UTF8ToUTF16(title), kTestLength));
}

std::string Format(const std::string& owner, const std::string& title) {
  return base::UTF16ToUTF8(FormatDocumentTitleWithOwnerAndLength(
      base::UTF8ToUTF16(owner), base::UTF8ToUTF16(title), kTestLength));
}

#if BUILDFLAG(IS_WIN)
// This test is automatically disabled if no printer is available.
class PrintingUtilsWinTest : public PrintingTest<testing::Test> {};
#endif  // BUILDFLAG(IS_WIN)

}  // namespace

TEST(PrintingUtilsTest, SimplifyDocumentTitle) {
  EXPECT_EQ("", Simplify(""));
  EXPECT_EQ("abcdefgh", Simplify("abcdefgh"));
  EXPECT_EQ("abc...ij", Simplify("abcdefghij"));
  EXPECT_EQ("Controls", Simplify("C\ron\nt\15rols"));
  EXPECT_EQ("C__foo_", Simplify("C:\\foo\\"));
  EXPECT_EQ("C__foo_", Simplify("C:/foo/"));
  EXPECT_EQ("a_b_c", Simplify("a<b\"c"));
  EXPECT_EQ("d_e_f_", Simplify("d*e?f~"));
  EXPECT_EQ("", Simplify("\n\r\n\r\t\r"));
}

TEST(PrintingUtilsTest, FormatDocumentTitleWithOwner) {
  EXPECT_EQ(": ", Format("", ""));
  EXPECT_EQ("abc: ", Format("abc", ""));
  EXPECT_EQ(": 123", Format("", "123"));
  EXPECT_EQ("abc: 123", Format("abc", "123"));
  EXPECT_EQ("abc: 0.9", Format("abc", "0123456789"));
  EXPECT_EQ("ab...j: ", Format("abcdefghij", "123"));
  EXPECT_EQ("xyz: _.o", Format("xyz", "\\f\\oo"));
  EXPECT_EQ("ab...j: ", Format("abcdefghij", "0123456789"));
}

#if BUILDFLAG(USE_CUPS) && !BUILDFLAG(IS_CHROMEOS)
TEST(PrintingUtilsTest, GetDefaultPaperSizeFromLocaleMicrons) {
  // Valid locales
  EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("en-US"));
  EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("en_US"));
  EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("fr-CA"));
  EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("es-CL"));
  EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons("en_UK"));
  EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons("fa-IR"));

  // Empty locale
  EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons(""));

  // Non-existing locale
  EXPECT_EQ(kIsoA4Microns,
            GetDefaultPaperSizeFromLocaleMicrons("locale-does-not-exist"));
}

TEST(PrintingUtilsTest, SizesEqualWithinEpsilon) {
  constexpr int kMaxInt = std::numeric_limits<int>::max();

  // Large sizes
  EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt),
                                      gfx::Size(kMaxInt - 1, kMaxInt - 1), 1));
  EXPECT_FALSE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt),
                                       gfx::Size(kMaxInt - 1, kMaxInt - 2), 1));
  EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt),
                                      gfx::Size(0, 0), kMaxInt));
  EXPECT_FALSE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt),
                                       gfx::Size(0, 0), kMaxInt - 1));

  // Empty sizes
  EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(0, 0), gfx::Size(0, 0), 0));
  EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(1, 0), gfx::Size(0, 2), 0));
  EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(1, -2), gfx::Size(-1, 2), 0));

  // Common paper sizes
  EXPECT_FALSE(SizesEqualWithinEpsilon(kNaLetterMicrons, kIsoA4Microns, 1000));
  EXPECT_TRUE(SizesEqualWithinEpsilon(kNaLetterMicrons,
                                      gfx::Size(215900, 279400), 500));
  EXPECT_TRUE(
      SizesEqualWithinEpsilon(kIsoA4Microns, gfx::Size(210500, 296500), 500));
}
#endif  // BUILDFLAG(USE_CUPS) && !BUILDFLAG(IS_CHROMEOS)

#if BUILDFLAG(IS_WIN)
TEST(PrintingUtilsTest, GetCenteredPageContentRect) {
  gfx::Rect page_content;

  // No centering.
  gfx::Size page_size = gfx::Size(1200, 1200);
  gfx::Rect page_content_rect = gfx::Rect(0, 0, 400, 1100);
  page_content = GetCenteredPageContentRect(gfx::Size(1000, 1000), page_size,
                                            page_content_rect);
  EXPECT_EQ(0, page_content.x());
  EXPECT_EQ(0, page_content.y());
  EXPECT_EQ(400, page_content.width());
  EXPECT_EQ(1100, page_content.height());

  // X centered.
  page_size = gfx::Size(500, 1200);
  page_content = GetCenteredPageContentRect(gfx::Size(1000, 1000), page_size,
                                            page_content_rect);
  EXPECT_EQ(250, page_content.x());
  EXPECT_EQ(0, page_content.y());
  EXPECT_EQ(400, page_content.width());
  EXPECT_EQ(1100, page_content.height());

  // Y centered.
  page_size = gfx::Size(1200, 500);
  page_content = GetCenteredPageContentRect(gfx::Size(1000, 1000), page_size,
                                            page_content_rect);
  EXPECT_EQ(0, page_content.x());
  EXPECT_EQ(250, page_content.y());
  EXPECT_EQ(400, page_content.width());
  EXPECT_EQ(1100, page_content.height());

  // Both X and Y centered.
  page_size = gfx::Size(500, 500),
  page_content = GetCenteredPageContentRect(gfx::Size(1000, 1000), page_size,
                                            page_content_rect);
  EXPECT_EQ(250, page_content.x());
  EXPECT_EQ(250, page_content.y());
  EXPECT_EQ(400, page_content.width());
  EXPECT_EQ(1100, page_content.height());
}

// Disabled - see crbug.com/1231528 for context.
TEST_F(PrintingUtilsWinTest, DISABLED_GetPrintableAreaDeviceUnits) {
  if (IsTestCaseDisabled()) {
    return;
  }

  std::wstring printer_name = GetDefaultPrinter();
  ScopedPrinterHandle printer;
  ASSERT_TRUE(printer.OpenPrinterWithName(printer_name.c_str()));

  const DEVMODE* dev_mode = nullptr;
  PrinterInfo2 info_2;
  if (info_2.Init(printer.Get())) {
    dev_mode = info_2.get()->pDevMode;
  }
  ASSERT_TRUE(dev_mode);

  base::win::ScopedCreateDC hdc(
      CreateDC(L"WINSPOOL", printer_name.c_str(), nullptr, dev_mode));
  ASSERT_TRUE(hdc.Get());

  // Check that getting printable area is successful and the resulting area is
  // non-empty.
  gfx::Rect output = GetPrintableAreaDeviceUnits(hdc.Get());
  EXPECT_FALSE(output.IsEmpty());
}
#endif  // BUILDFLAG(IS_WIN)

}  // namespace printing
