//
// Copyright 2017 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.
//
// PrunePureLiteralStatements_test.cpp:
//   Tests for pruning literal statements.
//

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

using namespace sh;

namespace
{

class PrunePureLiteralStatementsTest : public MatchOutputCodeTest
{
  public:
    // The PrunePureLiteralStatements pass is used when outputting ESSL
    PrunePureLiteralStatementsTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) {}
};

// Most basic test for the pruning
TEST_F(PrunePureLiteralStatementsTest, FloatLiteralStatement)
{
    const std::string shaderString =
        R"(precision mediump float;
        void main()
        {
           float f = 41.0;
           42.0;
           gl_FragColor = vec4(f);
        })";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("41"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test the pruning works for constructed types too
TEST_F(PrunePureLiteralStatementsTest, ConstructorLiteralStatement)
{
    const std::string shaderString =
        R"(precision mediump float;
        void main()
        {
            vec2 f = vec2(41.0, 41.0);
            vec2(42.0, 42.0);
            gl_FragColor = vec4(f, 0.0, 0.0);
        })";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("41"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test the pruning works when the literal is a (non-trivial) expression
TEST_F(PrunePureLiteralStatementsTest, ExpressionLiteralStatement)
{
    const std::string shaderString =
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "   vec2(21.0, 21.0) + vec2(21.0, 21.0);\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("21"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test that the pruning happens in the for-loop expression too
TEST_F(PrunePureLiteralStatementsTest, ForLoopLiteralExpression)
{
    const std::string shaderString =
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "    for (;; vec2(42.0, 42.0)) {}\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test that the pruning correctly handles the pruning inside switch statements - for a switch with
// one empty case.
TEST_F(PrunePureLiteralStatementsTest, SwitchLiteralExpressionEmptyCase)
{
    const std::string shaderString =
        "#version 300 es\n"
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "    switch(1)\n"
        "    {\n"
        "      default:\n"
        "        42;\n"
        "    }\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("default"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test that the pruning correctly handles the pruning inside switch statements - for a switch with
// multiple cases.
TEST_F(PrunePureLiteralStatementsTest, SwitchLiteralExpressionEmptyCases)
{
    const std::string shaderString =
        "#version 300 es\n"
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "    switch(1)\n"
        "    {\n"
        "      case 1:\n"
        "      case 2:\n"
        "      default:\n"
        "        42;\n"
        "    }\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("default"));
    ASSERT_TRUE(notFoundInCode("case"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test that the pruning correctly handles the pruning inside switch statements - only cases at the
// end are deleted
TEST_F(PrunePureLiteralStatementsTest, SwitchLiteralExpressionOnlyLastCase)
{
    const std::string shaderString =
        "#version 300 es\n"
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "    switch(1)\n"
        "    {\n"
        "      case 1:\n"
        "      default:\n"
        "        42;\n"
        "        break;\n"
        "    }\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("default"));
    ASSERT_TRUE(foundInCode("case"));
    ASSERT_TRUE(notFoundInCode("42"));
}

// Test that the pruning correctly handles the pruning inside switch statements - pruning isn't
// stopped by literal statements
TEST_F(PrunePureLiteralStatementsTest, SwitchLiteralExpressionLiteralDoesntStop)
{
    const std::string shaderString =
        "#version 300 es\n"
        "precision mediump float;\n"
        "void main()\n"
        "{\n"
        "    switch(1)\n"
        "    {\n"
        "      case 1:\n"
        "        42;\n"
        "      case 2:\n"
        "        43;\n"
        "    }\n"
        "}\n";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("case"));
    ASSERT_TRUE(notFoundInCode("42"));
    ASSERT_TRUE(notFoundInCode("43"));
}

}  // namespace
