// Copyright 2013 The Flutter 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 <memory>
#include <optional>

#include "gtest/gtest.h"

#include "impeller/entity/contents/checkerboard_contents.h"
#include "impeller/entity/contents/clip_contents.h"
#include "impeller/entity/contents/content_context.h"
#include "impeller/entity/contents/contents.h"
#include "impeller/entity/contents/test/recording_render_pass.h"
#include "impeller/entity/entity.h"
#include "impeller/entity/entity_playground.h"
#include "impeller/renderer/render_target.h"

namespace impeller {
namespace testing {

using EntityTest = EntityPlayground;

TEST_P(EntityTest, ClipContentsOptimizesFullScreenIntersectClips) {
  if (!ContentContext::kEnableStencilThenCover) {
    GTEST_SKIP();
    return;
  }

  // Set up mock environment.

  auto content_context = GetContentContext();
  auto buffer = content_context->GetContext()->CreateCommandBuffer();
  auto render_target =
      GetContentContext()->GetRenderTargetCache()->CreateOffscreenMSAA(
          *content_context->GetContext(), {100, 100},
          /*mip_count=*/1);
  auto render_pass = buffer->CreateRenderPass(render_target);
  auto recording_pass = std::make_shared<RecordingRenderPass>(
      render_pass, GetContext(), render_target);

  // Set up clip contents.

  auto contents = std::make_shared<ClipContents>();
  contents->SetClipOperation(Entity::ClipOperation::kIntersect);
  contents->SetGeometry(Geometry::MakeCover());

  Entity entity;
  entity.SetContents(std::move(contents));

  // Render the clip contents.

  ASSERT_TRUE(recording_pass->GetCommands().empty());
  ASSERT_TRUE(entity.Render(*content_context, *recording_pass));
  ASSERT_FALSE(recording_pass->GetCommands().empty());
}

}  // namespace testing
}  // namespace impeller
