// 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/fake_display_snapshot.h"

#include <memory>

#include "base/macros.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/display/test/display_matchers.h"
#include "ui/display/types/display_snapshot.h"

using DisplayModeList = ui::DisplaySnapshot::DisplayModeList;
using testing::SizeIs;

namespace display {

namespace {

std::unique_ptr<ui::DisplaySnapshot> CreateSnapshot(const std::string& str) {
  return FakeDisplaySnapshot::CreateFromSpec(1, str);
}

}  // namespace

TEST(FakeDisplaySnapshotTest, SizeOnly) {
  auto display = CreateSnapshot("1024x768");

  ASSERT_THAT(display->modes(), SizeIs(1));
  EXPECT_THAT(*display->native_mode(), IsDisplayMode(1024, 768));
}

TEST(FakeDisplaySnapshotTest, DefaultTypeIsUnknown) {
  auto display = CreateSnapshot("1024x768");

  ASSERT_THAT(display->modes(), SizeIs(1));
  EXPECT_EQ(ui::DISPLAY_CONNECTION_TYPE_UNKNOWN, display->type());
}

TEST(FakeDisplaySnapshotTest, FullNativeMode) {
  auto display = CreateSnapshot("1024x768%120");

  ASSERT_THAT(display->modes(), SizeIs(1));
  EXPECT_THAT(*display->native_mode(), IsDisplayMode(1024, 768, 120.0f));
}

TEST(FakeDisplaySnapshotTest, FullNativeModeWithDPI) {
  auto display = CreateSnapshot("1000x1000%120^300");

  ASSERT_THAT(display->modes(), SizeIs(1));
  EXPECT_THAT(*display->native_mode(), IsDisplayMode(1000, 1000, 120.0f));
  EXPECT_EQ(85, display->physical_size().width());
  EXPECT_EQ(85, display->physical_size().height());
}

TEST(FakeDisplaySnapshotTest, InternalDisplayWithSize) {
  auto display = CreateSnapshot("1600x900/i");

  ASSERT_THAT(display->modes(), SizeIs(1));
  EXPECT_THAT(*display->native_mode(), IsDisplayMode(1600, 900));
  EXPECT_EQ(ui::DISPLAY_CONNECTION_TYPE_INTERNAL, display->type());
}

TEST(FakeDisplaySnapshotTest, MultipleOptions) {
  auto display = CreateSnapshot("1600x900/aci");

  EXPECT_EQ(ui::DISPLAY_CONNECTION_TYPE_INTERNAL, display->type());
  EXPECT_TRUE(display->has_color_correction_matrix());
  EXPECT_TRUE(display->is_aspect_preserving_scaling());
}

TEST(FakeDisplaySnapshotTest, AlternateDisplayModes) {
  auto display = CreateSnapshot("1920x1080#1600x900:1280x720/i");
  const DisplayModeList& modes = display->modes();

  ASSERT_THAT(display->modes(), SizeIs(3));
  EXPECT_THAT(*modes[0], IsDisplayMode(1920, 1080));
  EXPECT_THAT(*modes[1], IsDisplayMode(1600, 900));
  EXPECT_THAT(*modes[2], IsDisplayMode(1280, 720));
  EXPECT_EQ(ui::DISPLAY_CONNECTION_TYPE_INTERNAL, display->type());
}

TEST(FakeDisplaySnapshotTest, ComplicatedSpecString) {
  auto display =
      CreateSnapshot("1920x1080%59.99#1600x900%90:1280x720%120^300/i");
  const DisplayModeList& modes = display->modes();

  ASSERT_THAT(display->modes(), SizeIs(3));
  EXPECT_THAT(*modes[0], IsDisplayMode(1920, 1080, 59.99f));
  EXPECT_THAT(*modes[1], IsDisplayMode(1600, 900, 90.0f));
  EXPECT_THAT(*modes[2], IsDisplayMode(1280, 720, 120.0f));
  EXPECT_EQ(163, display->physical_size().width());
  EXPECT_EQ(91, display->physical_size().height());
  EXPECT_EQ(ui::DISPLAY_CONNECTION_TYPE_INTERNAL, display->type());
}

TEST(FakeDisplaySnapshotTest, BadDisplayMode) {
  // Need width and height.
  EXPECT_EQ(nullptr, CreateSnapshot("1024"));
  // Display height and width should be separated by 'x' not ','.
  EXPECT_EQ(nullptr, CreateSnapshot("1024,768"));
  // Random 'a' before spec starts.
  EXPECT_EQ(nullptr, CreateSnapshot("a1024,768"));
  // Need to provide a refresh rate after '%'.
  EXPECT_EQ(nullptr, CreateSnapshot("1024,768%"));
  EXPECT_EQ(nullptr, CreateSnapshot("1024,768%a"));
  // Refresh rate should come before DPI.
  EXPECT_EQ(nullptr, CreateSnapshot("1000x1000^300%120"));
}

TEST(FakeDisplaySnapshotTest, BadDPI) {
  // DPI should be an integer value.
  EXPECT_EQ(nullptr, CreateSnapshot("1024x768^a"));
  EXPECT_EQ(nullptr, CreateSnapshot("1024x768^300d"));
}

TEST(FakeDisplaySnapshotTest, BadOptions) {
  // Need a '/' before options.
  EXPECT_EQ(nullptr, CreateSnapshot("1024x768i"));
  // Character 'z' is not a valid option.
  EXPECT_EQ(nullptr, CreateSnapshot("1600x900/z"));
  EXPECT_EQ(nullptr, CreateSnapshot("1600x900/iz"));
  // DPI should come before options.
  EXPECT_EQ(nullptr, CreateSnapshot("1600x900/i^300"));
}

TEST(FakeDisplaySnapshotTest, BadOrderOptionsAndModes) {
  // Options should come after alternate display modes.
  auto display = CreateSnapshot("1920x1080/i#1600x900:1280x720");
  EXPECT_EQ(nullptr, display);
}

TEST(FakeDisplaySnapshotTest, BadOrderModeSeparator) {
  // Reverse the '#' and ':' delimiters for alternate display modes.
  auto display = CreateSnapshot("1920x1080:1600x900#1280x720");
  EXPECT_EQ(nullptr, display);
}

}  // namespace display
