//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// RequestExtensionTest:
//   Tests that extensions can be requested and are disabled by default when using
//   EGL_ANGLE_request_extension
//

#include "test_utils/ANGLETest.h"

#include "util/EGLWindow.h"

namespace angle
{

class RequestExtensionTest : public ANGLETest<>
{
  protected:
    RequestExtensionTest() { setExtensionsEnabled(false); }
};

// Test that a known requestable extension is disabled by default and make sure it can be requested
// if possible
TEST_P(RequestExtensionTest, ExtensionsDisabledByDefault)
{
    EXPECT_TRUE(IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(),
                                             "EGL_ANGLE_create_context_extensions_enabled"));
    EXPECT_FALSE(IsGLExtensionEnabled("GL_OES_rgb8_rgba8"));

    if (IsGLExtensionRequestable("GL_OES_rgb8_rgba8"))
    {
        glRequestExtensionANGLE("GL_OES_rgb8_rgba8");
        EXPECT_TRUE(IsGLExtensionEnabled("GL_OES_rgb8_rgba8"));
    }
}

// Test the queries for the requestable extension strings
TEST_P(RequestExtensionTest, Queries)
{
    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_request_extension"));

    const GLubyte *requestableExtString = glGetString(GL_REQUESTABLE_EXTENSIONS_ANGLE);
    EXPECT_GL_NO_ERROR();
    EXPECT_NE(nullptr, requestableExtString);

    if (getClientMajorVersion() >= 3)
    {
        GLint numExtensions = 0;
        glGetIntegerv(GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE, &numExtensions);
        EXPECT_GL_NO_ERROR();

        for (GLint extIdx = 0; extIdx < numExtensions; extIdx++)
        {
            const GLubyte *requestableExtIndexedString =
                glGetStringi(GL_REQUESTABLE_EXTENSIONS_ANGLE, extIdx);
            EXPECT_GL_NO_ERROR();
            EXPECT_NE(nullptr, requestableExtIndexedString);
        }

        // Request beyond the end of the array
        const GLubyte *requestableExtIndexedString =
            glGetStringi(GL_REQUESTABLE_EXTENSIONS_ANGLE, numExtensions);
        EXPECT_GL_ERROR(GL_INVALID_VALUE);
        EXPECT_EQ(nullptr, requestableExtIndexedString);
    }
}

// Test that capture/replay succeeds when requesting an extension marks textures as dirty
TEST_P(RequestExtensionTest, ReplayTextureInitState)
{
    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_request_extension"));

    // This extension is chosen because it's requestable and always supported.
    ASSERT_TRUE(IsGLExtensionRequestable("GL_OES_vertex_array_object"));

    // Do not use RAII so that the texture is not deleted.
    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    ASSERT_GL_NO_ERROR();

    // In the capture context created with extensions disabled, this command marks all textures
    // as dirty. If the replay context is created with extensions enabled, this command would
    // be skipped and the texture state at the end of the frame would not match.
    glRequestExtensionANGLE("GL_OES_vertex_array_object");
    EXPECT_GL_NO_ERROR();
}

// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(RequestExtensionTest);

}  // namespace angle
