Edit

kc3-lang/angle/src/tests/compiler_tests/PrunePureLiteralStatements_test.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2018-11-27 11:34:27
    Hash : b980c563
    Message : Reformat all cpp and h files. This applies git cl format --full to all ANGLE sources. Bug: angleproject:2986 Change-Id: Ib504e618c1589332a37e97696cdc3515d739308f Reviewed-on: https://chromium-review.googlesource.com/c/1351367 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/tests/compiler_tests/PrunePureLiteralStatements_test.cpp
  • //
    // Copyright (c) 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