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

#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
