//
// Copyright (c) 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.
//
// GlFragDataNotModified_test.cpp:
//   Test that the properties of built-in gl_FragData are not modified when a shader is compiled
//   multiple times.
//

#include "tests/test_utils/ShaderCompileTreeTest.h"

namespace
{

class GlFragDataNotModifiedTest : public sh::ShaderCompileTreeTest
{
  public:
    GlFragDataNotModifiedTest() {}

  protected:
    void initResources(ShBuiltInResources *resources) override
    {
        resources->MaxDrawBuffers   = 4;
        resources->EXT_draw_buffers = 1;
    }

    ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
    ShShaderSpec getShaderSpec() const override { return SH_GLES2_SPEC; }
};

// Test a bug where we could modify the value of a builtin variable.
TEST_F(GlFragDataNotModifiedTest, BuiltinRewritingBug)
{
    const std::string &shaderString =
        "#extension GL_EXT_draw_buffers : require\n"
        "precision mediump float;\n"
        "void main() {\n"
        "    gl_FragData[gl_MaxDrawBuffers] = vec4(0.0);\n"
        "}";

    if (compile(shaderString))
    {
        FAIL() << "Shader compilation succeeded, expecting failure\n";
    }
    if (compile(shaderString))
    {
        FAIL() << "Shader compilation succeeded, expecting failure\n";
    }
}

}  // anonymous namespace
