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

#include "PreprocessorTest.h"
#include "compiler/preprocessor/Token.h"

namespace angle
{

void SimplePreprocessorTest::preprocess(const char *input,
                                        std::stringstream *output,
                                        pp::Preprocessor *preprocessor)
{
    ASSERT_TRUE(preprocessor->init(1, &input, nullptr));

    int line = 1;
    pp::Token token;
    do
    {
        preprocessor->lex(&token);
        if (output)
        {
            for (; line < token.location.line; ++line)
            {
                *output << "\n";
            }
            *output << token;
        }
    } while (token.type != pp::Token::LAST);
}

void SimplePreprocessorTest::preprocess(const char *input, const pp::PreprocessorSettings &settings)
{
    pp::Preprocessor preprocessor(&mDiagnostics, &mDirectiveHandler, settings);
    preprocess(input, nullptr, &preprocessor);
}

void SimplePreprocessorTest::preprocess(const char *input)
{
    preprocess(input, pp::PreprocessorSettings(SH_GLES2_SPEC,
                                               pp::WebGLExtensionDisableBehavior::Standard));
}

void SimplePreprocessorTest::preprocess(const char *input, const char *expected)
{
    preprocess(input, expected, SH_GLES2_SPEC);
}

void SimplePreprocessorTest::preprocess(const char *input, const char *expected, ShShaderSpec spec)
{
    pp::Preprocessor preprocessor(
        &mDiagnostics, &mDirectiveHandler,
        pp::PreprocessorSettings(spec, pp::WebGLExtensionDisableBehavior::Standard));
    std::stringstream output;
    preprocess(input, &output, &preprocessor);

    std::string actual = output.str();
    EXPECT_STREQ(expected, actual.c_str());
}

void SimplePreprocessorTest::lexSingleToken(const char *input, pp::Token *token)
{
    pp::Preprocessor preprocessor(
        &mDiagnostics, &mDirectiveHandler,
        pp::PreprocessorSettings(SH_GLES2_SPEC, pp::WebGLExtensionDisableBehavior::Standard));
    ASSERT_TRUE(preprocessor.init(1, &input, nullptr));
    preprocessor.lex(token);
}

void SimplePreprocessorTest::lexSingleToken(size_t count,
                                            const char *const input[],
                                            pp::Token *token)
{
    pp::Preprocessor preprocessor(
        &mDiagnostics, &mDirectiveHandler,
        pp::PreprocessorSettings(SH_GLES2_SPEC, pp::WebGLExtensionDisableBehavior::Standard));
    ASSERT_TRUE(preprocessor.init(count, input, nullptr));
    preprocessor.lex(token);
}

}  // namespace angle
