// // Copyright 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