// 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/shell/platform/linux/fl_texture_gl_private.h"
#include "flutter/shell/platform/linux/fl_texture_private.h"
#include "flutter/shell/platform/linux/fl_texture_registrar_private.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_texture.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_texture_registrar.h"
#include "flutter/shell/platform/linux/testing/fl_test.h"
#include "gtest/gtest.h"

#include <epoxy/gl.h>

static constexpr uint32_t kBufferWidth = 4u;
static constexpr uint32_t kBufferHeight = 4u;
static constexpr uint32_t kRealBufferWidth = 2u;
static constexpr uint32_t kRealBufferHeight = 2u;

G_DECLARE_FINAL_TYPE(FlTestTexture,
                     fl_test_texture,
                     FL,
                     TEST_TEXTURE,
                     FlTextureGL)

/// A simple texture.
struct _FlTestTexture {
  FlTextureGL parent_instance;
};

G_DEFINE_TYPE(FlTestTexture, fl_test_texture, fl_texture_gl_get_type())

static gboolean fl_test_texture_populate(FlTextureGL* texture,
                                         uint32_t* target,
                                         uint32_t* name,
                                         uint32_t* width,
                                         uint32_t* height,
                                         GError** error) {
  EXPECT_TRUE(FL_IS_TEST_TEXTURE(texture));

  EXPECT_EQ(*width, kBufferWidth);
  EXPECT_EQ(*height, kBufferHeight);
  *target = GL_TEXTURE_2D;
  *name = 1;
  *width = kRealBufferWidth;
  *height = kRealBufferHeight;

  return TRUE;
}

static void fl_test_texture_class_init(FlTestTextureClass* klass) {
  FL_TEXTURE_GL_CLASS(klass)->populate = fl_test_texture_populate;
}

static void fl_test_texture_init(FlTestTexture* self) {}

static FlTestTexture* fl_test_texture_new() {
  return FL_TEST_TEXTURE(g_object_new(fl_test_texture_get_type(), nullptr));
}

// Test that getting the texture ID works.
TEST(FlTextureTest, TextureID) {
  // Texture ID is not assigned until the testure is populated.
  g_autoptr(FlTexture) texture = FL_TEXTURE(fl_test_texture_new());
  EXPECT_EQ(fl_texture_get_texture_id(texture),
            reinterpret_cast<int64_t>(texture));
}

// Test that populating an OpenGL texture works.
TEST(FlTextureTest, PopulateTexture) {
  g_autoptr(FlTextureGL) texture = FL_TEXTURE_GL(fl_test_texture_new());
  FlutterOpenGLTexture opengl_texture = {0};
  g_autoptr(GError) error = nullptr;
  EXPECT_TRUE(fl_texture_gl_populate(texture, kBufferWidth, kBufferHeight,
                                     &opengl_texture, &error));
  EXPECT_EQ(error, nullptr);
  EXPECT_EQ(opengl_texture.width, kRealBufferWidth);
  EXPECT_EQ(opengl_texture.height, kRealBufferHeight);
}
