//
// Copyright 2024 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.
//
// PruneNoOps_test.cpp:
//   Tests for pruning no-op statements.
//

#include "GLSLANG/ShaderLang.h"
#include "angle_gl.h"
#include "gtest/gtest.h"
#include "tests/test_utils/compiler_test.h"

using namespace sh;

namespace
{

class PruneNoOpsTest : public MatchOutputCodeTest
{
  public:
    PruneNoOpsTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_GLSL_150_CORE_OUTPUT) {}
};

// Test that a switch statement with a constant expression without a matching case is pruned.
TEST_F(PruneNoOpsTest, SwitchStatementWithConstantExpressionNoMatchingCase)
{
    const std::string shaderString = R"(#version 300 es
precision mediump float;
out vec4 color;

void main(void)
{
    switch (10)
    {
        case 0:
            color = vec4(0);
            break;
        case 1:
            color = vec4(1);
            break;
    }
})";
    compile(shaderString);
    ASSERT_TRUE(notFoundInCode("switch"));
    ASSERT_TRUE(notFoundInCode("case"));
}

// Test that a switch statement with a constant expression with a default is not pruned.
TEST_F(PruneNoOpsTest, SwitchStatementWithConstantExpressionWithDefault)
{
    const std::string shaderString = R"(#version 300 es
precision mediump float;
out vec4 color;

void main(void)
{
    switch (10)
    {
        case 0:
            color = vec4(0);
            break;
        case 1:
            color = vec4(1);
            break;
        default:
            color = vec4(0.5);
            break;
    }
})";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("switch"));
    ASSERT_TRUE(foundInCode("case"));
}

// Test that a switch statement with a constant expression with a matching case is not pruned.
TEST_F(PruneNoOpsTest, SwitchStatementWithConstantExpressionWithMatchingCase)
{
    const std::string shaderString = R"(#version 300 es
precision mediump float;
out vec4 color;

void main(void)
{
    switch (10)
    {
        case 0:
            color = vec4(0);
            break;
        case 10:
            color = vec4(1);
            break;
    }
})";
    compile(shaderString);
    ASSERT_TRUE(foundInCode("switch"));
    ASSERT_TRUE(foundInCode("case"));
}

}  // namespace
