// Copyright 2020 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 "media/gpu/windows/d3d11_texture_wrapper.h"

#include <utility>

#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/single_thread_task_runner.h"
#include "base/test/task_environment.h"
#include "base/win/windows_version.h"
#include "media/gpu/test/fake_command_buffer_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_context_egl.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_image.h"
#include "ui/gl/gl_share_group.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/init/gl_factory.h"
#include "ui/gl/test/gl_surface_test_support.h"

using ::testing::_;
using ::testing::Bool;
using ::testing::Combine;
using ::testing::Return;
using ::testing::Values;

namespace media {

#define STOP_IF_WIN7()                                       \
  do {                                                       \
    if (base::win::GetVersion() <= base::win::Version::WIN7) \
      return;                                                \
  } while (0);

class D3D11TextureWrapperUnittest : public ::testing::Test {
 public:
  void SetUp() override {
    // Surface creation fails sometimes on win7, mostly.  Just skip the test.
    STOP_IF_WIN7();

    task_runner_ = task_environment_.GetMainThreadTaskRunner();

    gl::GLSurfaceTestSupport::InitializeOneOffImplementation(
        gl::GLImplementationParts(gl::ANGLEImplementation::kD3D11), false);
    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
    share_group_ = new gl::GLShareGroup();
    context_ = gl::init::CreateGLContext(share_group_.get(), surface_.get(),
                                         gl::GLContextAttribs());
    context_->MakeCurrent(surface_.get());

    // Create some objects that most tests want.
    fake_command_buffer_helper_ =
        base::MakeRefCounted<FakeCommandBufferHelper>(task_runner_);
    get_helper_cb_ = base::BindRepeating(
        [](scoped_refptr<CommandBufferHelper> helper) { return helper; },
        fake_command_buffer_helper_);
  }

  void TearDown() override {
    STOP_IF_WIN7();
    context_->ReleaseCurrent(surface_.get());
    context_ = nullptr;
    share_group_ = nullptr;
    surface_ = nullptr;
    gl::init::ShutdownGL(false);
  }

  base::test::TaskEnvironment task_environment_;
  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;

  scoped_refptr<gl::GLSurface> surface_;
  scoped_refptr<gl::GLShareGroup> share_group_;
  scoped_refptr<gl::GLContext> context_;

  // Made-up size for the images.
  const gfx::Size size_{100, 200};

  // CommandBufferHelper, and a callback that returns it.  Useful to initialize
  // a wrapper.
  scoped_refptr<FakeCommandBufferHelper> fake_command_buffer_helper_;
  GetCommandBufferHelperCB get_helper_cb_;
};

TEST_F(D3D11TextureWrapperUnittest, NV12InitSucceeds) {
  STOP_IF_WIN7();
  const DXGI_FORMAT dxgi_format = DXGI_FORMAT_NV12;

  auto wrapper = std::make_unique<DefaultTexture2DWrapper>(size_, dxgi_format);
  const Status init_result = wrapper->Init(
      task_runner_, get_helper_cb_, /*texture_d3d=*/nullptr, /*array_slice=*/0);
  EXPECT_TRUE(init_result.is_ok());

  // TODO: verify that ProcessTexture processes both textures.
}

TEST_F(D3D11TextureWrapperUnittest, BGRA8InitSucceeds) {
  STOP_IF_WIN7();
  const DXGI_FORMAT dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;

  auto wrapper = std::make_unique<DefaultTexture2DWrapper>(size_, dxgi_format);
  const Status init_result = wrapper->Init(
      task_runner_, get_helper_cb_, /*texture_d3d=*/nullptr, /*array_slice=*/0);
  EXPECT_TRUE(init_result.is_ok());
}

TEST_F(D3D11TextureWrapperUnittest, FP16InitSucceeds) {
  STOP_IF_WIN7();
  const DXGI_FORMAT dxgi_format = DXGI_FORMAT_R16G16B16A16_FLOAT;

  auto wrapper = std::make_unique<DefaultTexture2DWrapper>(size_, dxgi_format);
  const Status init_result = wrapper->Init(
      task_runner_, get_helper_cb_, /*texture_d3d=*/nullptr, /*array_slice=*/0);
  EXPECT_TRUE(init_result.is_ok());
}

TEST_F(D3D11TextureWrapperUnittest, P010InitSucceeds) {
  STOP_IF_WIN7();
  const DXGI_FORMAT dxgi_format = DXGI_FORMAT_P010;

  auto wrapper = std::make_unique<DefaultTexture2DWrapper>(size_, dxgi_format);
  const Status init_result = wrapper->Init(
      task_runner_, get_helper_cb_, /*texture_d3d=*/nullptr, /*array_slice=*/0);
  EXPECT_TRUE(init_result.is_ok());
}

TEST_F(D3D11TextureWrapperUnittest, UnknownInitFails) {
  STOP_IF_WIN7();
  const DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;

  auto wrapper = std::make_unique<DefaultTexture2DWrapper>(size_, dxgi_format);
  const Status init_result = wrapper->Init(
      task_runner_, get_helper_cb_, /*texture_d3d=*/nullptr, /*array_slice=*/0);
  EXPECT_FALSE(init_result.is_ok());
}

}  // namespace media
