// 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 "flutter/testing/testing.h"  // IWYU pragma: keep
#include "gtest/gtest.h"
#include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
#include "vulkan/vulkan_enums.hpp"

namespace impeller {
namespace testing {

TEST(MockVulkanContextTest, IsThreadSafe) {
  // In a typical app, there is a single ContextVK per app, shared b/w threads.
  //
  // This test ensures that the (mock) ContextVK is thread-safe.
  auto const context = MockVulkanContextBuilder().Build();

  // Spawn two threads, and have them create a CommandPoolVK each.
  std::thread thread1([&context]() {
    auto const pool = context->GetCommandPoolRecycler()->Get();
    EXPECT_TRUE(pool);
  });

  std::thread thread2([&context]() {
    auto const pool = context->GetCommandPoolRecycler()->Get();
    EXPECT_TRUE(pool);
  });

  thread1.join();
  thread2.join();

  context->Shutdown();
}

TEST(MockVulkanContextTest, DefaultFenceAlwaysReportsSuccess) {
  auto const context = MockVulkanContextBuilder().Build();
  auto const device = context->GetDevice();

  auto fence = device.createFenceUnique({}).value;
  EXPECT_EQ(vk::Result::eSuccess, device.getFenceStatus(*fence));
}

TEST(MockVulkanContextTest, MockedFenceReportsStatus) {
  auto const context = MockVulkanContextBuilder().Build();

  auto const device = context->GetDevice();
  auto fence = device.createFenceUnique({}).value;
  MockFence::SetStatus(fence, vk::Result::eNotReady);

  EXPECT_EQ(vk::Result::eNotReady, device.getFenceStatus(fence.get()));

  MockFence::SetStatus(fence, vk::Result::eSuccess);
  EXPECT_EQ(vk::Result::eSuccess, device.getFenceStatus(*fence));
}

}  // namespace testing
}  // namespace impeller
