//
// Copyright (c) 2016 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.
//
// EmulateGLFragColorBroadcast_test.cpp:
//   Tests for gl_FragColor broadcast behavior emulation.
//

#include "angle_gl.h"
#include "gtest/gtest.h"
#include "GLSLANG/ShaderLang.h"
#include "tests/test_utils/compiler_test.h"

using namespace sh;

namespace
{

const int kMaxDrawBuffers = 2;

class EmulateGLFragColorBroadcastTest : public MatchOutputCodeTest
{
  public:
    EmulateGLFragColorBroadcastTest()
        : MatchOutputCodeTest(GL_FRAGMENT_SHADER,
                              0,  // compile options
                              SH_GLSL_COMPATIBILITY_OUTPUT)
    {
        getResources()->MaxDrawBuffers   = kMaxDrawBuffers;
        getResources()->EXT_draw_buffers = 1;
    }
};

// Verifies that without explicitly enabling GL_EXT_draw_buffers extension
// in the shader, no broadcast emulation.
TEST_F(EmulateGLFragColorBroadcastTest, FragColorNoBroadcast)
{
    const std::string shaderString =
        "void main()\n"
        "{\n"
        "    gl_FragColor = vec4(1, 0, 0, 0);\n"
        "}\n";
    compile(shaderString);
    EXPECT_TRUE(foundInCode("gl_FragColor"));
    EXPECT_FALSE(foundInCode("gl_FragData[0]"));
    EXPECT_FALSE(foundInCode("gl_FragData[1]"));
}

// Verifies that with explicitly enabling GL_EXT_draw_buffers extension
// in the shader, broadcast is emualted by replacing gl_FragColor with gl_FragData.
TEST_F(EmulateGLFragColorBroadcastTest, FragColorBroadcast)
{
    const std::string shaderString =
        "#extension GL_EXT_draw_buffers : require\n"
        "void main()\n"
        "{\n"
        "    gl_FragColor = vec4(1, 0, 0, 0);\n"
        "}\n";
    compile(shaderString);
    EXPECT_FALSE(foundInCode("gl_FragColor"));
    EXPECT_TRUE(foundInCode("gl_FragData[0]"));
    EXPECT_TRUE(foundInCode("gl_FragData[1]"));
}

// Verifies that with explicitly enabling GL_EXT_draw_buffers extension
// in the shader with an empty main(), anothing happens.
TEST_F(EmulateGLFragColorBroadcastTest, EmptyMain)
{
    const std::string shaderString =
        "#extension GL_EXT_draw_buffers : require\n"
        "void main()\n"
        "{\n"
        "}\n";
    compile(shaderString);
    EXPECT_FALSE(foundInCode("gl_FragColor"));
    EXPECT_FALSE(foundInCode("gl_FragData[0]"));
    EXPECT_FALSE(foundInCode("gl_FragData[1]"));
}

}  // namespace anonymous
