//
// 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.
//
// PruneEmptyDeclarations_test.cpp:
//   Tests for pruning empty declarations.
//

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

using namespace sh;

namespace
{

class PruneEmptyDeclarationsTest : public MatchOutputCodeTest
{
  public:
    PruneEmptyDeclarationsTest()
        : MatchOutputCodeTest(GL_VERTEX_SHADER, 0, SH_GLSL_COMPATIBILITY_OUTPUT)
    {
    }
};

TEST_F(PruneEmptyDeclarationsTest, EmptyDeclarationStartsDeclaratorList)
{
    const std::string shaderString =
        "precision mediump float;\n"
        "uniform float u;\n"
        "void main()\n"
        "{\n"
        "   float, f;\n"
        "   gl_Position = vec4(u * f);\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("float f"));
    ASSERT_TRUE(notFoundInCode("float, f"));
}

TEST_F(PruneEmptyDeclarationsTest, EmptyStructDeclarationWithQualifiers)
{
    const std::string shaderString =
        "precision mediump float;\n"
        "const struct S { float f; };\n"
        "uniform S s;"
        "void main()\n"
        "{\n"
        "   gl_Position = vec4(s.f);\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("struct S"));
    ASSERT_TRUE(foundInCode("uniform S"));
    ASSERT_TRUE(notFoundInCode("const struct S"));
}

}  // namespace
