// 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 "flutter/testing/testing.h"
#include "impeller/core/allocator.h"
#include "impeller/core/texture_descriptor.h"
#include "impeller/entity/render_target_cache.h"
#include "impeller/renderer/testing/mocks.h"

namespace impeller {
namespace testing {

class TestAllocator : public Allocator {
 public:
  TestAllocator() = default;

  ~TestAllocator() = default;

  ISize GetMaxTextureSizeSupported() const override {
    return ISize(1024, 1024);
  };

  std::shared_ptr<DeviceBuffer> OnCreateBuffer(
      const DeviceBufferDescriptor& desc) override {
    return std::make_shared<MockDeviceBuffer>(desc);
  };

  virtual std::shared_ptr<Texture> OnCreateTexture(
      const TextureDescriptor& desc) override {
    return std::make_shared<MockTexture>(desc);
  };
};

TEST(RenderTargetCacheTest, CachesUsedTexturesAcrossFrames) {
  auto allocator = std::make_shared<TestAllocator>();
  auto render_target_cache = RenderTargetCache(allocator);
  auto desc = TextureDescriptor{
      .format = PixelFormat::kR8G8B8A8UNormInt,
      .size = ISize(100, 100),
      .usage = static_cast<TextureUsageMask>(TextureUsage::kRenderTarget)};

  render_target_cache.Start();
  // Create two textures of the same exact size/shape. Both should be marked
  // as used this frame, so the cached data set will contain two.
  render_target_cache.CreateTexture(desc);
  render_target_cache.CreateTexture(desc);

  ASSERT_EQ(render_target_cache.CachedTextureCount(), 2u);

  render_target_cache.End();
  render_target_cache.Start();

  // Next frame, only create one texture. The set will still contain two,
  // but one will be removed at the end of the frame.
  render_target_cache.CreateTexture(desc);
  ASSERT_EQ(render_target_cache.CachedTextureCount(), 2u);

  render_target_cache.End();
  ASSERT_EQ(render_target_cache.CachedTextureCount(), 1u);
}

}  // namespace testing
}  // namespace impeller
