//
// 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.
//
//    EGLDeviceCGLTest.cpp: tests for the EGL_ANGLE_device_cgl extension.
//

#include "test_utils/ANGLETest.h"
#include "util/EGLWindow.h"
#include "util/OSWindow.h"
#include "util/gles_loader_autogen.h"

using namespace angle;

class EGLDeviceCGLQueryTest : public ANGLETest
{
  protected:
    EGLDeviceCGLQueryTest() {}

    void testSetUp() override
    {
        const char *extensionString =
            static_cast<const char *>(eglQueryString(getEGLWindow()->getDisplay(), EGL_EXTENSIONS));

        if (!eglQueryDeviceStringEXT)
        {
            FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceStringEXT was not "
                      "found";
        }

        if (!eglQueryDisplayAttribEXT)
        {
            FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDisplayAttribEXT was "
                      "not found";
        }

        if (!eglQueryDeviceAttribEXT)
        {
            FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceAttribEXT was not "
                      "found";
        }

        EGLAttrib angleDevice = 0;
        EXPECT_EGL_TRUE(
            eglQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
        extensionString = static_cast<const char *>(
            eglQueryDeviceStringEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_EXTENSIONS));
        if (strstr(extensionString, "EGL_ANGLE_device_cgl") == nullptr)
        {
            FAIL() << "ANGLE extension EGL_ANGLE_device_cgl was not found";
        }
    }
};

// This test attempts to query the CGLContextObj and CGLPixelFormatObj from the
// EGLDevice associated with the display.
TEST_P(EGLDeviceCGLQueryTest, QueryDevice)
{
    EGLAttrib angleDevice = 0;
    EXPECT_EGL_TRUE(
        eglQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
    EGLAttrib contextAttrib     = 0;
    EGLAttrib pixelFormatAttrib = 0;
    EXPECT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice),
                                            EGL_CGL_CONTEXT_ANGLE, &contextAttrib));
    EXPECT_TRUE(contextAttrib != 0);
    EXPECT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice),
                                            EGL_CGL_PIXEL_FORMAT_ANGLE, &pixelFormatAttrib));
    EXPECT_TRUE(pixelFormatAttrib != 0);
}

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