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

// CurrentNormalTest.cpp: Tests basic usage of glNormal3(f|x).

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

#include "util/random_utils.h"

#include "common/vector_utils.h"

#include <stdint.h>

using namespace angle;

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

// State query: Checks the initial state is correct.
TEST_P(CurrentNormalTest, InitialState)
{
    const angle::Vector3 kUp(0.0f, 0.0f, 1.0f);
    angle::Vector3 actualNormal;
    glGetFloatv(GL_CURRENT_NORMAL, actualNormal.data());
    EXPECT_GL_NO_ERROR();
    EXPECT_EQ(kUp, actualNormal);
}

// Set test: Checks that the current normal is properly set and retrieved.
TEST_P(CurrentNormalTest, Set)
{
    glNormal3f(0.1f, 0.2f, 0.3f);
    EXPECT_GL_NO_ERROR();

    angle::Vector3 actualNormal;

    glGetFloatv(GL_CURRENT_NORMAL, actualNormal.data());
    EXPECT_GL_NO_ERROR();
    EXPECT_EQ(angle::Vector3(0.1f, 0.2f, 0.3f), actualNormal);

    float epsilon = 0.00001f;

    glNormal3x(0x10000, 0x3333, 0x5555);
    EXPECT_GL_NO_ERROR();

    glGetFloatv(GL_CURRENT_NORMAL, actualNormal.data());
    EXPECT_GL_NO_ERROR();
    EXPECT_NEAR(1.0f, actualNormal[0], epsilon);
    EXPECT_NEAR(0.2f, actualNormal[1], epsilon);
    EXPECT_NEAR(1.0f / 3.0f, actualNormal[2], epsilon);
}

ANGLE_INSTANTIATE_TEST_ES1(CurrentNormalTest);
