// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0

#pragma once

#include "googletest.h"

using testing::PrintToString;

namespace {

MATCHER_P5(HasDiagnosticMessage, errorTypeText, startLine, startColumn, endLine, endColumn,
           std::string(negation ? "isn't " : "is ")
           + "{" + PrintToString(errorTypeText)
           + ": (" + PrintToString(startLine)
           + ", " + PrintToString(startColumn)
           + "), (" + PrintToString(endLine)
           + ", " + PrintToString(endColumn)
           + ")}"
           )
{
    if (!arg.empty() && arg.front().messages.empty()) {
        *result_listener << "no messages";
        return  false;
    }

    auto message = arg.front().messages.front();
    auto sourceRange = message.sourceRange;

    return message.errorTypeText() == errorTypeText
        && sourceRange.start.line == uint(startLine)
        && sourceRange.start.column == uint(startColumn)
        && sourceRange.end.line == uint(endLine)
        && sourceRange.end.column == uint(endColumn);
}

MATCHER_P5(HasDiagnosticContext, contextTypeText, startLine, startColumn, endLine, endColumn,
           std::string(negation ? "isn't " : "is ")
            + "{" + PrintToString(contextTypeText)
           + ": (" + PrintToString(startLine)
           + ", " + PrintToString(startColumn)
           + "), (" + PrintToString(endLine)
           + ", " + PrintToString(endColumn)
           + ")}"
           )
{
    if (!arg.empty() && arg.front().messages.empty()) {
        *result_listener << "no context";
        return  false;
    }

    auto context = arg.front().contexts.front();
    auto sourceRange = context.sourceRange;

    return context.contextTypeText() == contextTypeText
        && sourceRange.start.line == uint(startLine)
        && sourceRange.start.column == uint(startColumn)
        && sourceRange.end.line == uint(endLine)
        && sourceRange.end.column == uint(endColumn);
}

}
