Edit

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

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2018-01-31 11:46:52
    Hash : 1776fd08
    Message : Make use of CreateBoolNode in traversers This is just refactoring to clean up some duplicate code. A new test is added to make sure this doesn't break UnfoldShortCircuitAST. BUG=angleproject:1490 TEST=angle_unittests Change-Id: I108e646f71ba631cbd5dad2055b64e6a30159742 Reviewed-on: https://chromium-review.googlesource.com/894207 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>

  • src/tests/compiler_tests/UnfoldShortCircuitAST_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.
    //
    // UnfoldShortCircuitAST_test.cpp:
    //  Tests shader compilation with SH_UNFOLD_SHORT_CIRCUIT workaround on.
    
    #include "GLSLANG/ShaderLang.h"
    #include "angle_gl.h"
    #include "gtest/gtest.h"
    #include "tests/test_utils/compiler_test.h"
    
    using namespace sh;
    
    class UnfoldShortCircuitASTTest : public MatchOutputCodeTest
    {
      public:
        UnfoldShortCircuitASTTest()
            : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_UNFOLD_SHORT_CIRCUIT, SH_GLSL_330_CORE_OUTPUT)
        {
        }
    };
    
    // Test unfolding the && operator.
    TEST_F(UnfoldShortCircuitASTTest, UnfoldAnd)
    {
        const std::string &shaderString =
            R"(#version 300 es
            precision highp float;
    
            out vec4 color;
            uniform bool b;
            uniform bool b2;
    
            void main()
            {
                color = vec4(0, 0, 0, 1);
                if (b && b2)
                {
                    color = vec4(0, 1, 0, 1);
                }
            })";
        compile(shaderString);
        ASSERT_TRUE(foundInCode("(_ub) ? (_ub2) : (false)"));
    }
    
    // Test unfolding the || operator.
    TEST_F(UnfoldShortCircuitASTTest, UnfoldOr)
    {
        const std::string &shaderString =
            R"(#version 300 es
            precision highp float;
    
            out vec4 color;
            uniform bool b;
            uniform bool b2;
    
            void main()
            {
                color = vec4(0, 0, 0, 1);
                if (b || b2)
                {
                    color = vec4(0, 1, 0, 1);
                }
            })";
        compile(shaderString);
        ASSERT_TRUE(foundInCode("(_ub) ? (true) : (_ub2)"));
    }
    
    // Test unfolding nested && and || operators. Both should be unfolded.
    TEST_F(UnfoldShortCircuitASTTest, UnfoldNested)
    {
        const std::string &shaderString =
            R"(#version 300 es
            precision highp float;
    
            out vec4 color;
            uniform bool b;
            uniform bool b2;
            uniform bool b3;
    
            void main()
            {
                color = vec4(0, 0, 0, 1);
                if (b && (b2 || b3))
                {
                    color = vec4(0, 1, 0, 1);
                }
            })";
        compile(shaderString);
        ASSERT_TRUE(foundInCode("(_ub) ? (((_ub2) ? (true) : (_ub3))) : (false)"));
    }