#ifndef UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
#define UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
#include "base/memory/raw_ptr.h"
#include "base/strings/stringize_macros.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_display.h"
#include "ui/gl/gl_helper.h"
#include "ui/gl/gl_image.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_version_info.h"
#include "ui/gl/init/gl_factory.h"
#include "ui/gl/test/gl_test_helper.h"
#include "ui/gl/test/gl_test_support.h"
#if BUILDFLAG(IS_APPLE)
#include "base/mac/mac_util.h"
#endif
#ifdef LEAK_SANITIZER
#define MAYBE_Create DISABLED_Create
#else
#define MAYBE_Create Create
#endif
#define TYPED_TEST_P_WITH_EXPANSION(SuiteName, TestName) \
TYPED_TEST_P(SuiteName, TestName)
#define REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(SuiteName, ...) \
REGISTER_TYPED_TEST_SUITE_P(SuiteName, __VA_ARGS__)
namespace gl {
namespace internal {
void DrawTextureQuad(GLenum target, const gfx::Size& size);
}
class GLImageTestDelegateBase {
public:
virtual ~GLImageTestDelegateBase() {}
virtual void DidSetUp() {}
virtual void WillTearDown() {}
virtual absl::optional<GLImplementationParts> GetPreferedGLImplementation()
const;
virtual bool SkipTest(GLDisplay* display) const;
};
template <typename GLImageTestDelegate>
class GLImageTest : public testing::Test {
protected:
void SetUp() override {
auto prefered_impl = delegate_.GetPreferedGLImplementation();
display_ = GLTestSupport::InitializeGL(prefered_impl);
surface_ = gl::init::CreateOffscreenGLSurface(display_, gfx::Size());
context_ =
gl::init::CreateGLContext(nullptr, surface_.get(), GLContextAttribs());
context_->MakeCurrent(surface_.get());
delegate_.DidSetUp();
}
void TearDown() override {
delegate_.WillTearDown();
context_->ReleaseCurrent(surface_.get());
context_ = nullptr;
surface_ = nullptr;
GLTestSupport::CleanupGL(display_);
}
protected:
scoped_refptr<GLSurface> surface_;
scoped_refptr<GLContext> context_;
GLImageTestDelegate delegate_;
raw_ptr<GLDisplay> display_ = nullptr;
};
TYPED_TEST_SUITE_P(GLImageTest);
TYPED_TEST_P_WITH_EXPANSION(GLImageTest, MAYBE_Create) {
if (this->delegate_.SkipTest(this->display_))
GTEST_SKIP() << "Skip because GL initialization failed";
const gfx::Size small_image_size(128, 128);
const gfx::Size large_image_size(512, 512);
const uint8_t* image_color = this->delegate_.GetImageColor();
scoped_refptr<GLImage> small_image =
this->delegate_.CreateSolidColorImage(small_image_size, image_color);
ASSERT_TRUE(small_image);
scoped_refptr<GLImage> large_image =
this->delegate_.CreateSolidColorImage(large_image_size, image_color);
ASSERT_TRUE(large_image);
EXPECT_EQ(small_image->GetSizeForTesting().ToString(),
small_image_size.ToString());
EXPECT_EQ(large_image->GetSizeForTesting().ToString(),
large_image_size.ToString());
}
REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageTest, MAYBE_Create);
template <typename GLImageTestDelegate>
class GLImageOddSizeTest : public GLImageTest<GLImageTestDelegate> {};
TYPED_TEST_SUITE_P(GLImageOddSizeTest);
TYPED_TEST_P_WITH_EXPANSION(GLImageOddSizeTest, MAYBE_Create) {
if (this->delegate_.SkipTest(this->display_))
GTEST_SKIP() << "Skip because GL initialization failed";
const gfx::Size odd_image_size(17, 53);
const uint8_t* image_color = this->delegate_.GetImageColor();
scoped_refptr<GLImage> odd_image =
this->delegate_.CreateSolidColorImage(odd_image_size, image_color);
ASSERT_TRUE(odd_image);
EXPECT_EQ(odd_image->GetSizeForTesting().ToString(),
odd_image_size.ToString());
}
REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageOddSizeTest, MAYBE_Create);
}
#undef MAYBE_Create
#undef TYPED_TEST_P_WITH_EXPANSION
#undef REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION
#endif