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