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

// ClientStateEnable.cpp: Tests basic usage of gl(Enable|Disable)ClientState.

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

#include <vector>

using namespace angle;

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

    std::vector<GLenum> mClientStates = {
        GL_VERTEX_ARRAY,         GL_NORMAL_ARRAY,        GL_COLOR_ARRAY,
        GL_POINT_SIZE_ARRAY_OES, GL_TEXTURE_COORD_ARRAY,
    };
};

// Checks that all client vertex array states are disabled to start with.
TEST_P(ClientStateEnable, InitialState)
{
    for (auto clientState : mClientStates)
    {
        EXPECT_GL_FALSE(glIsEnabled(clientState));
        EXPECT_GL_NO_ERROR();
    }
}

// Checks that glEnableClientState sets the state to be enabled,
// and glDisableClientState sets the state to be disabled.
TEST_P(ClientStateEnable, EnableState)
{
    for (auto clientState : mClientStates)
    {
        EXPECT_GL_FALSE(glIsEnabled(clientState));
        glEnableClientState(clientState);
        EXPECT_GL_NO_ERROR();
        EXPECT_GL_TRUE(glIsEnabled(clientState));
        glDisableClientState(clientState);
        EXPECT_GL_NO_ERROR();
        EXPECT_GL_FALSE(glIsEnabled(clientState));
    }
}

// Negative test: Checks that invalid enums for client state generate the proper GL error.
TEST_P(ClientStateEnable, Negative)
{
    glEnableClientState(0);
    EXPECT_GL_ERROR(GL_INVALID_ENUM);
}

// Checks that enable/disable states are different if we are in different client texture unit
// states.
TEST_P(ClientStateEnable, TextureUnit)
{
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    // Spec minimum lets us assume 2 multitexturing units.
    glClientActiveTexture(GL_TEXTURE1);
    EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));

    glClientActiveTexture(GL_TEXTURE0);
    EXPECT_GL_TRUE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    EXPECT_GL_FALSE(glIsEnabled(GL_TEXTURE_COORD_ARRAY));
}

ANGLE_INSTANTIATE_TEST_ES1(ClientStateEnable);
