//
// Copyright 2019 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.
//

// SemaphoreTest.cpp : Tests of the GL_EXT_semaphore extension.

#ifdef UNSAFE_BUFFERS_BUILD
#    pragma allow_unsafe_buffers
#endif

#include "test_utils/ANGLETest.h"

#include "test_utils/gl_raii.h"

namespace angle
{

class SemaphoreTest : public ANGLETest<>
{
  protected:
    SemaphoreTest()
    {
        setWindowWidth(1);
        setWindowHeight(1);
        setConfigRedBits(8);
        setConfigGreenBits(8);
        setConfigBlueBits(8);
        setConfigAlphaBits(8);
    }
};

// glIsSemaphoreEXT must identify semaphores.
TEST_P(SemaphoreTest, SemaphoreShouldBeSemaphore)
{
    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_semaphore"));

    constexpr GLsizei kSemaphoreCount = 2;
    GLuint semaphores[kSemaphoreCount];
    glGenSemaphoresEXT(kSemaphoreCount, semaphores);

    EXPECT_FALSE(glIsSemaphoreEXT(0));

    for (GLsizei i = 0; i < kSemaphoreCount; ++i)
    {
        EXPECT_TRUE(glIsSemaphoreEXT(semaphores[i]));
    }

    glDeleteSemaphoresEXT(kSemaphoreCount, semaphores);

    EXPECT_GL_NO_ERROR();
}

// glImportSemaphoreFdEXT must fail for handle types that are not file descriptors.
TEST_P(SemaphoreTest, ShouldFailValidationOnImportFdUnsupportedHandleType)
{
    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_semaphore_fd"));

    {
        GLSemaphore semaphore;
        int fd = -1;
        glImportSemaphoreFdEXT(semaphore, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT, fd);
        EXPECT_GL_ERROR(GL_INVALID_ENUM);
    }

    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(SemaphoreTest);

}  // namespace angle
