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

// MaterialsTest.cpp: Tests basic usage of glMaterial*.

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

#include "util/random_utils.h"

#include <stdint.h>

#include <vector>

using namespace angle;

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

// Check that the initial material state is correct.
TEST_P(MaterialsTest, InitialState)
{
    const GLColor32F kAmbientInitial(0.2f, 0.2f, 0.2f, 1.0f);
    const GLColor32F kDiffuseInitial(0.8f, 0.8f, 0.8f, 1.0f);
    const GLColor32F kSpecularInitial(0.0f, 0.0f, 0.0f, 1.0f);
    const GLColor32F kEmissiveInitial(0.0f, 0.0f, 0.0f, 1.0f);
    const float kShininessInitial = 0.0f;

    GLColor32F actualColor;
    float actualShininess;

    std::vector<GLenum> pnames = {
        GL_AMBIENT,
        GL_DIFFUSE,
        GL_SPECULAR,
        GL_EMISSION,
    };

    std::vector<GLColor32F> colors = {
        kAmbientInitial,
        kDiffuseInitial,
        kSpecularInitial,
        kEmissiveInitial,
    };

    for (size_t i = 0; i < pnames.size(); i++)
    {
        glGetMaterialfv(GL_FRONT, pnames[i], &actualColor.R);
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(colors[i], actualColor);
    }

    glGetMaterialfv(GL_FRONT, GL_SHININESS, &actualShininess);
    EXPECT_GL_NO_ERROR();
    EXPECT_EQ(kShininessInitial, actualShininess);
}

// Check for invalid parameter names.
TEST_P(MaterialsTest, InvalidParameter)
{
    glGetMaterialfv(GL_FRONT, 0, nullptr);
    EXPECT_GL_ERROR(GL_INVALID_ENUM);

    glGetMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, nullptr);
    EXPECT_GL_ERROR(GL_INVALID_ENUM);

    glMaterialf(GL_FRONT_AND_BACK, GL_AMBIENT, 0.0f);
    EXPECT_GL_ERROR(GL_INVALID_ENUM);

    glMaterialfv(GL_FRONT, GL_AMBIENT, nullptr);
    EXPECT_GL_ERROR(GL_INVALID_ENUM);
}

// Check that material parameters can be set.
TEST_P(MaterialsTest, SetParameters)
{
    const GLColor32F kAmbientTestValue(1.0f, 1.0f, 1.0f, 1.0f);
    const GLColor32F kDiffuseTestValue(0.0f, 0.0f, 0.0f, 0.0f);
    const GLColor32F kSpecularTestValue(0.5f, 0.5f, 0.5f, 0.5f);
    const GLColor32F kEmissiveTestValue(0.4f, 0.4f, 0.4f, 0.4f);
    const float kShininessTestValue = 1.0f;

    std::vector<GLenum> pnames = {
        GL_AMBIENT,
        GL_DIFFUSE,
        GL_SPECULAR,
        GL_EMISSION,
    };

    std::vector<GLColor32F> colors = {
        kAmbientTestValue,
        kDiffuseTestValue,
        kSpecularTestValue,
        kEmissiveTestValue,
    };

    GLColor32F actualColor;
    float actualShininess;

    for (size_t i = 0; i < pnames.size(); i++)
    {
        glMaterialfv(GL_FRONT_AND_BACK, pnames[i], &colors[i].R);
        EXPECT_GL_NO_ERROR();
        glGetMaterialfv(GL_FRONT, pnames[i], &actualColor.R);
        EXPECT_GL_NO_ERROR();
        EXPECT_EQ(colors[i], actualColor);
    }

    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, kShininessTestValue);
    EXPECT_GL_NO_ERROR();
    glGetMaterialfv(GL_FRONT, GL_SHININESS, &actualShininess);
    EXPECT_GL_NO_ERROR();
    EXPECT_EQ(kShininessTestValue, actualShininess);
}

ANGLE_INSTANTIATE_TEST_ES1(MaterialsTest);
