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

// MatrixStackTest.cpp: Tests basic usage of gl(Push|Pop)Matrix.

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

#include <vector>

using namespace angle;

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

// State query: Checks the initial state is correct; that there is only one matrix on the stack.
TEST_P(MatrixStackTest, InitialState)
{
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);

    glMatrixMode(GL_TEXTURE);
    glPopMatrix();
    EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);
}

// Tests that caps are greater than or equal to spec minimums and that we can actually push them
// that much.
TEST_P(MatrixStackTest, Limits)
{
    GLint modelviewMatrixMax;
    GLint projectionMatrixMax;
    GLint textureMatrixMax;
    GLint textureUnits;  // For iterating over texture matrices

    glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &modelviewMatrixMax);
    glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH, &projectionMatrixMax);
    glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &textureMatrixMax);
    glGetIntegerv(GL_MAX_TEXTURE_UNITS, &textureUnits);

    EXPECT_GE(modelviewMatrixMax, 16);
    EXPECT_GE(projectionMatrixMax, 2);
    EXPECT_GE(textureMatrixMax, 2);

    glMatrixMode(GL_MODELVIEW);

    for (int i = 0; i < modelviewMatrixMax; i++)
    {
        glPushMatrix();
        if (i == modelviewMatrixMax - 1)
        {
            EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
        }
        else
        {
            EXPECT_GL_NO_ERROR();
        }
    }

    glMatrixMode(GL_PROJECTION);

    for (int i = 0; i < projectionMatrixMax; i++)
    {
        glPushMatrix();
        if (i == projectionMatrixMax - 1)
        {
            EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
        }
        else
        {
            EXPECT_GL_NO_ERROR();
        }
    }

    glMatrixMode(GL_TEXTURE);

    for (int i = 0; i < textureUnits; i++)
    {
        glActiveTexture(GL_TEXTURE0 + i);
        for (int j = 0; j < textureMatrixMax; j++)
        {
            glPushMatrix();
            if (j == textureMatrixMax - 1)
            {
                EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
            }
            else
            {
                EXPECT_GL_NO_ERROR();
            }
        }
    }
}

ANGLE_INSTANTIATE_TEST_ES1(MatrixStackTest);
