Edit

kc3-lang/angle/src/tests/compiler_tests/PruneEmptyCases_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/PruneEmptyCases_test.cpp
  • //
    // 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.
    //
    // PruneEmptyCases_test.cpp:
    //   Tests for pruning empty cases and switch statements. This ensures that the translator doesn't
    //   produce switch statements where the last case statement is not followed by anything.
    //
    
    #include "GLSLANG/ShaderLang.h"
    #include "angle_gl.h"
    #include "gtest/gtest.h"
    #include "tests/test_utils/compiler_test.h"
    
    using namespace sh;
    
    namespace
    {
    
    class PruneEmptyCasesTest : public MatchOutputCodeTest
    {
      public:
        PruneEmptyCasesTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_GLSL_COMPATIBILITY_OUTPUT)
        {}
    };
    
    // Test that a switch statement that only contains no-ops is pruned entirely.
    TEST_F(PruneEmptyCasesTest, SwitchStatementWithOnlyNoOps)
    {
        const std::string shaderString =
            R"(#version 300 es
    
            uniform int ui;
    
            void main(void)
            {
                int i = ui;
                switch (i)
                {
                    case 0:
                    case 1:
                        { {} }
                        int j;
                        1;
                }
            })";
        compile(shaderString);
        ASSERT_TRUE(notFoundInCode("switch"));
        ASSERT_TRUE(notFoundInCode("case"));
    }
    
    // Test that a init statement that has a side effect is preserved even if the switch is pruned.
    TEST_F(PruneEmptyCasesTest, SwitchStatementWithOnlyNoOpsAndInitWithSideEffect)
    {
        const std::string shaderString =
            R"(#version 300 es
    
            precision mediump float;
            out vec4 my_FragColor;
    
            uniform int uni_i;
    
            void main(void)
            {
                int i = uni_i;
                switch (++i)
                {
                    case 0:
                    case 1:
                        { {} }
                        int j;
                        1;
                }
                my_FragColor = vec4(i);
            })";
        compile(shaderString);
        ASSERT_TRUE(notFoundInCode("switch"));
        ASSERT_TRUE(notFoundInCode("case"));
        ASSERT_TRUE(foundInCode("++_ui"));
    }
    
    // Test a switch statement where the last case only contains no-ops.
    TEST_F(PruneEmptyCasesTest, SwitchStatementLastCaseOnlyNoOps)
    {
        const std::string shaderString =
            R"(#version 300 es
    
            precision mediump float;
            out vec4 my_FragColor;
    
            uniform int ui;
    
            void main(void)
            {
                int i = ui;
                switch (i)
                {
                    case 0:
                        my_FragColor = vec4(0);
                        break;
                    case 1:
                    case 2:
                        { {} }
                        int j;
                        1;
                }
            })";
        compile(shaderString);
        ASSERT_TRUE(foundInCode("switch"));
        ASSERT_TRUE(foundInCode("case", 1));
    }
    
    }  // namespace