// Copyright 2018 The Fuchsia 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 "src/ui/lib/escher/renderer/frame.h"

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/ui/lib/escher/resources/resource.h"
#include "src/ui/lib/escher/resources/resource_manager.h"
#include "src/ui/lib/escher/test/gtest_escher.h"

namespace escher {

using FrameTest = test::TestWithVkValidationLayer;

VK_TEST_F(FrameTest, CreateDestroyFrame) {
  auto escher = test::GetEscher()->GetWeakPtr();
  {
    auto frame = escher->NewFrame("test_frame", 0, false);
    frame->EndFrame(SemaphorePtr(), [] {});
  }
}

VK_TEST_F(FrameTest, ValidCommandBufferTypes) {
  auto escher = test::GetEscher()->GetWeakPtr();

  auto graphics_frame = escher->NewFrame("test_frame", 0, false, CommandBuffer::Type::kGraphics);
  EXPECT_EQ(CommandBuffer::Type::kGraphics, graphics_frame->cmds()->type());

  auto compute_frame = escher->NewFrame("test_frame", 0, false, CommandBuffer::Type::kCompute);
  EXPECT_EQ(CommandBuffer::Type::kCompute, compute_frame->cmds()->type());

  auto transfer_frame = escher->NewFrame("test_frame", 0, false, CommandBuffer::Type::kTransfer);
  EXPECT_EQ(CommandBuffer::Type::kTransfer, transfer_frame->cmds()->type());

  // End frames to clean up properly.
  graphics_frame->EndFrame(SemaphorePtr(), [] {});
  compute_frame->EndFrame(SemaphorePtr(), [] {});
  transfer_frame->EndFrame(SemaphorePtr(), [] {});
}

VK_TEST_F(FrameTest, InvalidCommandBufferType) {
  auto escher = test::GetEscher()->GetWeakPtr();

  EXPECT_DEATH_IF_SUPPORTED(
      escher->NewFrame("test_frame", 0, false, CommandBuffer::Type::kEnumCount), "");
}

VK_TEST_F(FrameTest, SubmitPartialFrameCreatesCleanCommandBuffer) {
  auto escher = test::GetEscher()->GetWeakPtr();
  auto frame = escher->NewFrame("test_frame", 0, false, CommandBuffer::Type::kTransfer);
  EXPECT_EQ(CommandBuffer::Type::kTransfer, frame->cmds()->type());
  uint64_t command_buffer_sequence_number = frame->command_buffer_sequence_number();

  frame->SubmitPartialFrame(SemaphorePtr());

  EXPECT_EQ(CommandBuffer::Type::kTransfer, frame->cmds()->type());
  EXPECT_NE(command_buffer_sequence_number, frame->command_buffer_sequence_number());
  EXPECT_EQ(frame->command_buffer_sequence_number(), frame->cmds()->sequence_number());
  frame->EndFrame(SemaphorePtr(), [] {});
}

}  // namespace escher
