//
// Copyright (c) 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.
//
// RewriteDoWhile_test.cpp:
//   Tests that the RewriteDoWhile AST transform works correctly.
//

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

using namespace sh;

class RewriteDoWhileCrashTest : public ShaderCompileTreeTest
{
  public:
    RewriteDoWhileCrashTest() {}

  protected:
    ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
    ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }

    void SetUp() override
    {
        mExtraCompileOptions |= SH_REWRITE_DO_WHILE_LOOPS;
        ShaderCompileTreeTest::SetUp();
    }
};

// Make sure that the RewriteDoWhile step doesn't crash due to creating temp symbols before calling
// nextTemporaryId(). Regression test.
TEST_F(RewriteDoWhileCrashTest, RunsSuccessfully)
{
    const std::string &shaderString =
        "#version 300 es\n"
        "precision mediump float;\n"
        "uniform int u;\n"
        "out vec4 my_FragColor;\n"
        "void main()\n"
        "{\n"
        "    int foo = 1;"
        "    do\n"
        "    {\n"
        "         foo *= u;\n"
        "    } while (foo < 8);\n"
        "    my_FragColor = vec4(foo) * 0.1;"
        "}\n";
    if (!compile(shaderString))
    {
        FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
    }
}
