// Copyright 2014 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 "cc/quads/render_pass.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/surface_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/common/mailbox_holder.h"
#include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
#include "mojo/services/public/cpp/surfaces/surfaces_type_converters.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkXfermode.h"

namespace mojo {
namespace {

TEST(SurfaceLibTest, SurfaceIdConverterNullId) {
  cc::SurfaceId null_id;
  cc::SurfaceId round_trip = SurfaceId::From(null_id).To<cc::SurfaceId>();
  EXPECT_TRUE(round_trip.is_null());
}

TEST(SurfaceLibTest, SurfaceIdConverterValidId) {
  cc::SurfaceId valid_id(7);
  cc::SurfaceId round_trip = SurfaceId::From(valid_id).To<cc::SurfaceId>();
  EXPECT_FALSE(round_trip.is_null());
  EXPECT_EQ(valid_id, round_trip);
}

TEST(SurfaceLibTest, Color) {
  SkColor arbitrary_color = SK_ColorMAGENTA;
  SkColor round_trip = Color::From(arbitrary_color).To<SkColor>();
  EXPECT_EQ(arbitrary_color, round_trip);
}

class SurfaceLibQuadTest : public testing::Test {
 public:
  SurfaceLibQuadTest()
      : rect(5, 7, 13, 19),
        opaque_rect(rect),
        visible_rect(9, 11, 5, 7),
        needs_blending(false) {
    pass = cc::RenderPass::Create();
    sqs = pass->CreateAndAppendSharedQuadState();
  }

 protected:
  gfx::Rect rect;
  gfx::Rect opaque_rect;
  gfx::Rect visible_rect;
  bool needs_blending;
  scoped_ptr<cc::RenderPass> pass;
  cc::SharedQuadState* sqs;
};

TEST_F(SurfaceLibQuadTest, ColorQuad) {
  cc::SolidColorDrawQuad* color_quad =
      pass->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>();
  SkColor arbitrary_color = SK_ColorGREEN;
  bool force_anti_aliasing_off = true;
  color_quad->SetAll(sqs,
                     rect,
                     opaque_rect,
                     visible_rect,
                     needs_blending,
                     arbitrary_color,
                     force_anti_aliasing_off);

  QuadPtr mojo_quad = Quad::From<cc::DrawQuad>(*color_quad);
  ASSERT_FALSE(mojo_quad.is_null());
  EXPECT_EQ(MATERIAL_SOLID_COLOR, mojo_quad->material);
  EXPECT_EQ(Rect::From(rect), mojo_quad->rect);
  EXPECT_EQ(Rect::From(opaque_rect), mojo_quad->opaque_rect);
  EXPECT_EQ(Rect::From(visible_rect), mojo_quad->visible_rect);
  EXPECT_EQ(needs_blending, mojo_quad->needs_blending);
  ASSERT_TRUE(mojo_quad->solid_color_quad_state);
  SolidColorQuadStatePtr& mojo_color_state = mojo_quad->solid_color_quad_state;
  EXPECT_EQ(Color::From(arbitrary_color), mojo_color_state->color);
  EXPECT_EQ(force_anti_aliasing_off, mojo_color_state->force_anti_aliasing_off);
}

TEST_F(SurfaceLibQuadTest, SurfaceQuad) {
  cc::SurfaceDrawQuad* surface_quad =
      pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
  cc::SurfaceId arbitrary_id(5);
  surface_quad->SetAll(
      sqs, rect, opaque_rect, visible_rect, needs_blending, arbitrary_id);

  QuadPtr mojo_quad = Quad::From<cc::DrawQuad>(*surface_quad);
  ASSERT_FALSE(mojo_quad.is_null());
  EXPECT_EQ(MATERIAL_SURFACE_CONTENT, mojo_quad->material);
  ASSERT_TRUE(mojo_quad->surface_quad_state);
  SurfaceQuadStatePtr& mojo_surface_state = mojo_quad->surface_quad_state;
  EXPECT_EQ(SurfaceId::From(arbitrary_id),
            mojo_surface_state->surface);
}

TEST_F(SurfaceLibQuadTest, TextureQuad) {
  cc::TextureDrawQuad* texture_quad =
      pass->CreateAndAppendDrawQuad<cc::TextureDrawQuad>();
  unsigned resource_id = 9;
  bool premultiplied_alpha = true;
  gfx::PointF uv_top_left(1.7f, 2.1f);
  gfx::PointF uv_bottom_right(-7.f, 16.3f);
  SkColor background_color = SK_ColorYELLOW;
  float vertex_opacity[4] = {0.1f, 0.5f, 0.4f, 0.8f};
  bool flipped = false;
  texture_quad->SetAll(sqs,
                       rect,
                       opaque_rect,
                       visible_rect,
                       needs_blending,
                       resource_id,
                       premultiplied_alpha,
                       uv_top_left,
                       uv_bottom_right,
                       background_color,
                       vertex_opacity,
                       flipped);

  QuadPtr mojo_quad = Quad::From<cc::DrawQuad>(*texture_quad);
  ASSERT_FALSE(mojo_quad.is_null());
  EXPECT_EQ(MATERIAL_TEXTURE_CONTENT, mojo_quad->material);
  ASSERT_TRUE(mojo_quad->texture_quad_state);
  TextureQuadStatePtr& mojo_texture_state = mojo_quad->texture_quad_state;
  EXPECT_EQ(resource_id, mojo_texture_state->resource_id);
  EXPECT_EQ(premultiplied_alpha, mojo_texture_state->premultiplied_alpha);
  EXPECT_EQ(PointF::From(uv_top_left), mojo_texture_state->uv_top_left);
  EXPECT_EQ(PointF::From(uv_bottom_right), mojo_texture_state->uv_bottom_right);
  EXPECT_EQ(Color::From(background_color),
            mojo_texture_state->background_color);
  for (size_t i = 0; i < 4; ++i) {
    EXPECT_EQ(vertex_opacity[i], mojo_texture_state->vertex_opacity[i]) << i;
  }
  EXPECT_EQ(flipped, mojo_texture_state->flipped);
}

TEST_F(SurfaceLibQuadTest, TextureQuadEmptyVertexOpacity) {
  QuadPtr mojo_texture_quad = Quad::New();
  mojo_texture_quad->material = MATERIAL_TEXTURE_CONTENT;
  TextureQuadStatePtr mojo_texture_state = TextureQuadState::New();
  mojo_texture_state->background_color = Color::New();
  mojo_texture_quad->texture_quad_state = mojo_texture_state.Pass();
  PassPtr mojo_pass = Pass::New();
  mojo_pass->quads.push_back(mojo_texture_quad.Pass());
  SharedQuadStatePtr mojo_sqs = SharedQuadState::New();
  mojo_pass->shared_quad_states.push_back(mojo_sqs.Pass());

  scoped_ptr<cc::RenderPass> pass = mojo_pass.To<scoped_ptr<cc::RenderPass> >();

  EXPECT_FALSE(pass);
}

TEST_F(SurfaceLibQuadTest, TextureQuadEmptyBackgroundColor) {
  QuadPtr mojo_texture_quad = Quad::New();
  mojo_texture_quad->material = MATERIAL_TEXTURE_CONTENT;
  TextureQuadStatePtr mojo_texture_state = TextureQuadState::New();
  mojo_texture_state->vertex_opacity = mojo::Array<float>::New(4);
  mojo_texture_quad->texture_quad_state = mojo_texture_state.Pass();
  PassPtr mojo_pass = Pass::New();
  mojo_pass->quads.push_back(mojo_texture_quad.Pass());
  SharedQuadStatePtr mojo_sqs = SharedQuadState::New();
  mojo_pass->shared_quad_states.push_back(mojo_sqs.Pass());

  scoped_ptr<cc::RenderPass> pass = mojo_pass.To<scoped_ptr<cc::RenderPass> >();
  EXPECT_FALSE(pass);
}

TEST(SurfaceLibTest, SharedQuadState) {
  gfx::Transform content_to_target_transform;
  content_to_target_transform.Scale3d(0.3f, 0.7f, 0.9f);
  gfx::Size content_bounds(57, 39);
  gfx::Rect visible_content_rect(3, 7, 28, 42);
  gfx::Rect clip_rect(9, 12, 21, 31);
  bool is_clipped = true;
  float opacity = 0.65f;
  int sorting_context_id = 13;
  ::SkXfermode::Mode blend_mode = ::SkXfermode::kSrcOver_Mode;
  scoped_ptr<cc::RenderPass> pass = cc::RenderPass::Create();
  cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
  sqs->SetAll(content_to_target_transform,
              content_bounds,
              visible_content_rect,
              clip_rect,
              is_clipped,
              opacity,
              blend_mode,
              sorting_context_id);

  SharedQuadStatePtr mojo_sqs = SharedQuadState::From(*sqs);
  ASSERT_FALSE(mojo_sqs.is_null());
  EXPECT_EQ(Transform::From(content_to_target_transform),
            mojo_sqs->content_to_target_transform);
  EXPECT_EQ(Size::From(content_bounds), mojo_sqs->content_bounds);
  EXPECT_EQ(Rect::From(visible_content_rect), mojo_sqs->visible_content_rect);
  EXPECT_EQ(Rect::From(clip_rect), mojo_sqs->clip_rect);
  EXPECT_EQ(is_clipped, mojo_sqs->is_clipped);
  EXPECT_EQ(opacity, mojo_sqs->opacity);
  EXPECT_EQ(sorting_context_id, mojo_sqs->sorting_context_id);
}

TEST(SurfaceLibTest, RenderPass) {
  scoped_ptr<cc::RenderPass> pass = cc::RenderPass::Create();
  cc::RenderPassId pass_id(1, 6);
  gfx::Rect output_rect(4, 9, 13, 71);
  gfx::Rect damage_rect(9, 17, 41, 45);
  gfx::Transform transform_to_root_target;
  transform_to_root_target.SkewY(43.0);
  bool has_transparent_background = false;
  pass->SetAll(pass_id,
               output_rect,
               damage_rect,
               transform_to_root_target,
               has_transparent_background);

  gfx::Transform content_to_target_transform;
  content_to_target_transform.Scale3d(0.3f, 0.7f, 0.9f);
  gfx::Size content_bounds(57, 39);
  gfx::Rect visible_content_rect(3, 7, 28, 42);
  gfx::Rect clip_rect(9, 12, 21, 31);
  bool is_clipped = true;
  float opacity = 0.65f;
  int sorting_context_id = 13;
  ::SkXfermode::Mode blend_mode = ::SkXfermode::kSrcOver_Mode;
  cc::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
  sqs->SetAll(content_to_target_transform,
              content_bounds,
              visible_content_rect,
              clip_rect,
              is_clipped,
              opacity,
              blend_mode,
              sorting_context_id);

  gfx::Rect rect(5, 7, 13, 19);
  gfx::Rect opaque_rect(rect);
  gfx::Rect visible_rect(9, 11, 5, 7);
  bool needs_blending = false;

  cc::SolidColorDrawQuad* color_quad =
      pass->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>();
  SkColor arbitrary_color = SK_ColorGREEN;
  bool force_anti_aliasing_off = true;
  color_quad->SetAll(pass->shared_quad_state_list.back(),
                     rect,
                     opaque_rect,
                     visible_rect,
                     needs_blending,
                     arbitrary_color,
                     force_anti_aliasing_off);

  cc::SurfaceDrawQuad* surface_quad =
      pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
  cc::SurfaceId arbitrary_id(5);
  surface_quad->SetAll(
      sqs, rect, opaque_rect, visible_rect, needs_blending, arbitrary_id);

  cc::TextureDrawQuad* texture_quad =
      pass->CreateAndAppendDrawQuad<cc::TextureDrawQuad>();
  unsigned resource_id = 9;
  bool premultiplied_alpha = true;
  gfx::PointF uv_top_left(1.7f, 2.1f);
  gfx::PointF uv_bottom_right(-7.f, 16.3f);
  SkColor background_color = SK_ColorYELLOW;
  float vertex_opacity[4] = {0.1f, 0.5f, 0.4f, 0.8f};
  bool flipped = false;
  texture_quad->SetAll(sqs,
                       rect,
                       opaque_rect,
                       visible_rect,
                       needs_blending,
                       resource_id,
                       premultiplied_alpha,
                       uv_top_left,
                       uv_bottom_right,
                       background_color,
                       vertex_opacity,
                       flipped);

  PassPtr mojo_pass = Pass::From(*pass);
  ASSERT_FALSE(mojo_pass.is_null());
  EXPECT_EQ(6, mojo_pass->id);
  EXPECT_EQ(Rect::From(output_rect), mojo_pass->output_rect);
  EXPECT_EQ(Rect::From(damage_rect), mojo_pass->damage_rect);
  EXPECT_EQ(Transform::From(transform_to_root_target),
            mojo_pass->transform_to_root_target);
  EXPECT_EQ(has_transparent_background, mojo_pass->has_transparent_background);
  ASSERT_EQ(1u, mojo_pass->shared_quad_states.size());
  ASSERT_EQ(3u, mojo_pass->quads.size());
  EXPECT_EQ(0u, mojo_pass->quads[0]->shared_quad_state_index);

  scoped_ptr<cc::RenderPass> round_trip_pass =
      mojo_pass.To<scoped_ptr<cc::RenderPass> >();
  EXPECT_EQ(pass_id, round_trip_pass->id);
  EXPECT_EQ(output_rect, round_trip_pass->output_rect);
  EXPECT_EQ(damage_rect, round_trip_pass->damage_rect);
  EXPECT_EQ(transform_to_root_target,
            round_trip_pass->transform_to_root_target);
  EXPECT_EQ(has_transparent_background,
            round_trip_pass->has_transparent_background);
  ASSERT_EQ(1u, round_trip_pass->shared_quad_state_list.size());
  ASSERT_EQ(3u, round_trip_pass->quad_list.size());
  EXPECT_EQ(round_trip_pass->shared_quad_state_list.front(),
            round_trip_pass->quad_list.front()->shared_quad_state);

  cc::SharedQuadState* round_trip_sqs =
      round_trip_pass->shared_quad_state_list.front();
  EXPECT_EQ(content_to_target_transform,
            round_trip_sqs->content_to_target_transform);
  EXPECT_EQ(content_bounds, round_trip_sqs->content_bounds);
  EXPECT_EQ(visible_content_rect, round_trip_sqs->visible_content_rect);
  EXPECT_EQ(clip_rect, round_trip_sqs->clip_rect);
  EXPECT_EQ(is_clipped, round_trip_sqs->is_clipped);
  EXPECT_EQ(opacity, round_trip_sqs->opacity);
  EXPECT_EQ(sorting_context_id, round_trip_sqs->sorting_context_id);

  cc::QuadList::Iterator dq_iter = round_trip_pass->quad_list.begin();
  // First is solid color quad.
  ASSERT_EQ(cc::DrawQuad::SOLID_COLOR, dq_iter->material);
  EXPECT_EQ(rect, dq_iter->rect);
  EXPECT_EQ(opaque_rect, dq_iter->opaque_rect);
  EXPECT_EQ(visible_rect, dq_iter->visible_rect);
  EXPECT_EQ(needs_blending, dq_iter->needs_blending);
  const cc::SolidColorDrawQuad* round_trip_color_quad =
      cc::SolidColorDrawQuad::MaterialCast(&*dq_iter);
  EXPECT_EQ(arbitrary_color, round_trip_color_quad->color);
  EXPECT_EQ(force_anti_aliasing_off,
            round_trip_color_quad->force_anti_aliasing_off);

  ++dq_iter;
  // Second is surface quad.
  ASSERT_EQ(cc::DrawQuad::SURFACE_CONTENT, dq_iter->material);
  const cc::SurfaceDrawQuad* round_trip_surface_quad =
      cc::SurfaceDrawQuad::MaterialCast(&*dq_iter);
  EXPECT_EQ(arbitrary_id, round_trip_surface_quad->surface_id);

  ++dq_iter;
  // Third is texture quad.
  ASSERT_EQ(cc::DrawQuad::TEXTURE_CONTENT, dq_iter->material);
  const cc::TextureDrawQuad* round_trip_texture_quad =
      cc::TextureDrawQuad::MaterialCast(&*dq_iter);
  EXPECT_EQ(resource_id, round_trip_texture_quad->resource_id);
  EXPECT_EQ(premultiplied_alpha, round_trip_texture_quad->premultiplied_alpha);
  EXPECT_EQ(uv_top_left, round_trip_texture_quad->uv_top_left);
  EXPECT_EQ(uv_bottom_right, round_trip_texture_quad->uv_bottom_right);
  EXPECT_EQ(background_color, round_trip_texture_quad->background_color);
  for (size_t i = 0; i < 4; ++i) {
    EXPECT_EQ(vertex_opacity[i], round_trip_texture_quad->vertex_opacity[i])
        << i;
  }
  EXPECT_EQ(flipped, round_trip_texture_quad->flipped);
}

TEST(SurfaceLibTest, Mailbox) {
  gpu::Mailbox mailbox;
  mailbox.Generate();

  MailboxPtr mojo_mailbox = Mailbox::From(mailbox);
  EXPECT_EQ(0, memcmp(mailbox.name, &mojo_mailbox->name.storage()[0], 64));

  gpu::Mailbox round_trip_mailbox = mojo_mailbox.To<gpu::Mailbox>();
  EXPECT_EQ(mailbox, round_trip_mailbox);
}

TEST(SurfaceLibTest, MailboxEmptyName) {
  MailboxPtr mojo_mailbox = Mailbox::New();

  gpu::Mailbox converted_mailbox = mojo_mailbox.To<gpu::Mailbox>();
  EXPECT_TRUE(converted_mailbox.IsZero());
}

TEST(SurfaceLibTest, MailboxHolder) {
  gpu::Mailbox mailbox;
  mailbox.Generate();
  uint32_t texture_target = GL_TEXTURE_2D;
  uint32_t sync_point = 7u;
  gpu::MailboxHolder holder(mailbox, texture_target, sync_point);

  MailboxHolderPtr mojo_holder = MailboxHolder::From(holder);
  EXPECT_EQ(texture_target, mojo_holder->texture_target);
  EXPECT_EQ(sync_point, mojo_holder->sync_point);

  gpu::MailboxHolder round_trip_holder = mojo_holder.To<gpu::MailboxHolder>();
  EXPECT_EQ(mailbox, round_trip_holder.mailbox);
  EXPECT_EQ(texture_target, round_trip_holder.texture_target);
  EXPECT_EQ(sync_point, round_trip_holder.sync_point);
}

TEST(SurfaceLibTest, TransferableResource) {
  uint32_t id = 7u;
  cc::ResourceFormat format = cc::BGRA_8888;
  uint32_t filter = 123u;
  gfx::Size size(17, 18);
  gpu::MailboxHolder mailbox_holder;
  bool is_repeated = false;
  ;
  bool is_software = false;
  cc::TransferableResource resource;
  resource.id = id;
  resource.format = format;
  resource.filter = filter;
  resource.size = size;
  resource.mailbox_holder = mailbox_holder;
  resource.is_repeated = is_repeated;
  resource.is_software = is_software;

  TransferableResourcePtr mojo_resource = TransferableResource::From(resource);
  EXPECT_EQ(id, mojo_resource->id);
  EXPECT_EQ(static_cast<ResourceFormat>(format),
            mojo_resource->format);
  EXPECT_EQ(filter, mojo_resource->filter);
  EXPECT_EQ(Size::From(size), mojo_resource->size);
  EXPECT_EQ(is_repeated, mojo_resource->is_repeated);
  EXPECT_EQ(is_software, mojo_resource->is_software);

  cc::TransferableResource round_trip_resource =
      mojo_resource.To<cc::TransferableResource>();
  EXPECT_EQ(id, round_trip_resource.id);
  EXPECT_EQ(format, round_trip_resource.format);
  EXPECT_EQ(filter, round_trip_resource.filter);
  EXPECT_EQ(size, round_trip_resource.size);
  EXPECT_EQ(mailbox_holder.mailbox, round_trip_resource.mailbox_holder.mailbox);
  EXPECT_EQ(mailbox_holder.texture_target,
            round_trip_resource.mailbox_holder.texture_target);
  EXPECT_EQ(mailbox_holder.sync_point,
            round_trip_resource.mailbox_holder.sync_point);
  EXPECT_EQ(is_repeated, round_trip_resource.is_repeated);
  EXPECT_EQ(is_software, round_trip_resource.is_software);
}

TEST(SurfaceLibTest, ReturnedResource) {
  uint32_t id = 5u;
  uint32_t sync_point = 24u;
  int count = 2;
  bool lost = false;
  cc::ReturnedResource resource;
  resource.id = id;
  resource.sync_point = sync_point;
  resource.count = count;
  resource.lost = lost;

  ReturnedResourcePtr mojo_resource = ReturnedResource::From(resource);
  EXPECT_EQ(id, mojo_resource->id);
  EXPECT_EQ(sync_point, mojo_resource->sync_point);
  EXPECT_EQ(count, mojo_resource->count);
  EXPECT_EQ(lost, mojo_resource->lost);

  cc::ReturnedResource round_trip_resource =
      mojo_resource.To<cc::ReturnedResource>();
  EXPECT_EQ(id, round_trip_resource.id);
  EXPECT_EQ(sync_point, round_trip_resource.sync_point);
  EXPECT_EQ(count, round_trip_resource.count);
  EXPECT_EQ(lost, round_trip_resource.lost);
}

}  // namespace
}  // namespace mojo
