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

// TextureTargetEnableTest.cpp: Tests basic usage of built-in vertex attributes of GLES1.

#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"

using namespace angle;

class TextureTargetEnableTest : public ANGLETest
{
  protected:
    TextureTargetEnableTest()
    {
        setWindowWidth(32);
        setWindowHeight(32);
        setConfigRedBits(8);
        setConfigGreenBits(8);
        setConfigBlueBits(8);
        setConfigAlphaBits(8);
        setConfigDepthBits(24);
    }
};

// Checks that 2D/Cube targets are disabled initially.
TEST_P(TextureTargetEnableTest, InitialState)
{
    EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_2D));
    EXPECT_GL_NO_ERROR();
    EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_CUBE_MAP));
    EXPECT_GL_NO_ERROR();
}

// Checks that 2D/cube targets can be set to enabled or disabled.
TEST_P(TextureTargetEnableTest, Set)
{
    glEnable(GL_TEXTURE_2D);
    EXPECT_GL_NO_ERROR();
    EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_2D));

    glEnable(GL_TEXTURE_CUBE_MAP);
    EXPECT_GL_NO_ERROR();
    EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_CUBE_MAP));
}

// Checks that targets can be set to enabled or disabled and it does not affect the setting of
// other texture units.
TEST_P(TextureTargetEnableTest, SetSeparateUnits)
{
    GLint units;
    glGetIntegerv(GL_MAX_TEXTURE_UNITS, &units);

    for (int i = 0; i < units; i++)
    {

        glActiveTexture(GL_TEXTURE0 + i);
        EXPECT_GL_NO_ERROR();

        EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_2D));
        EXPECT_GL_NO_ERROR();

        EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_CUBE_MAP));
        EXPECT_GL_NO_ERROR();

        glEnable(GL_TEXTURE_2D);
        EXPECT_GL_NO_ERROR();
        EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_2D));

        glEnable(GL_TEXTURE_CUBE_MAP);
        EXPECT_GL_NO_ERROR();
        EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_CUBE_MAP));
    }
}

ANGLE_INSTANTIATE_TEST(TextureTargetEnableTest,
                       ES1_D3D11(),
                       ES1_OPENGL(),
                       ES1_OPENGLES(),
                       ES1_VULKAN());
