ClangCodeModel: Move fix-it tests into plugin

Change-Id: If53df602a42d8c1ffde5db6c8cb1e7fc269bb272
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2022-05-02 14:03:03 +02:00
parent d79b34d39a
commit 4b0b3e9e35
14 changed files with 190 additions and 135 deletions

View File

@@ -47,6 +47,7 @@ extend_qtc_plugin(ClangCodeModel
SOURCES SOURCES
test/clangbatchfileprocessor.cpp test/clangbatchfileprocessor.h test/clangbatchfileprocessor.cpp test/clangbatchfileprocessor.h
test/clangdtests.cpp test/clangdtests.h test/clangdtests.cpp test/clangdtests.h
test/clangfixittest.cpp test/clangfixittest.h
test/data/clangtestdata.qrc test/data/clangtestdata.qrc
) )

View File

@@ -101,6 +101,8 @@ QtcPlugin {
"clangbatchfileprocessor.h", "clangbatchfileprocessor.h",
"clangdtests.cpp", "clangdtests.cpp",
"clangdtests.h", "clangdtests.h",
"clangfixittest.cpp",
"clangfixittest.h",
"data/clangtestdata.qrc", "data/clangtestdata.qrc",
] ]
} }

View File

@@ -32,6 +32,7 @@
#ifdef WITH_TESTS #ifdef WITH_TESTS
# include "test/clangbatchfileprocessor.h" # include "test/clangbatchfileprocessor.h"
# include "test/clangdtests.h" # include "test/clangdtests.h"
# include "test/clangfixittest.h"
#endif #endif
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
@@ -215,6 +216,7 @@ QVector<QObject *> ClangCodeModelPlugin::createTestObjects() const
new Tests::ClangdTestHighlighting, new Tests::ClangdTestHighlighting,
new Tests::ClangdTestLocalReferences, new Tests::ClangdTestLocalReferences,
new Tests::ClangdTestTooltips, new Tests::ClangdTestTooltips,
new Tests::ClangFixItTest,
}; };
} }
#endif #endif

View File

@@ -0,0 +1,116 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "clangfixittest.h"
#include "../clangfixitoperation.h"
#include <clangsupport/fixitcontainer.h>
#include <utils/changeset.h>
#include <QFile>
#include <QtTest>
#include <QVector>
using ClangBackEnd::FixItContainer;
namespace ClangCodeModel::Internal::Tests {
static QString qrcPath(const QString &relativeFilePath)
{
return QLatin1String(":/unittests/ClangCodeModel/") + relativeFilePath;
}
static QString diagnosticText() { return QString("expected ';' at end of declaration"); }
void ClangFixItTest::testDescription()
{
ClangFixItOperation operation(diagnosticText(), {semicolonFixIt()});
QCOMPARE(operation.description(),
QLatin1String("Apply Fix: expected ';' at end of declaration"));
}
QString ClangFixItTest::semicolonFilePath() const
{
return m_dataDir->absolutePath("diagnostic_semicolon_fixit.cpp");
}
QString ClangFixItTest::compareFilePath() const
{
return m_dataDir->absolutePath("diagnostic_comparison_fixit.cpp");
}
QString ClangFixItTest::fileContent(const QByteArray &relFilePath) const
{
QFile file(m_dataDir->absolutePath(relFilePath));
const bool isOpen = file.open(QFile::ReadOnly | QFile::Text);
if (!isOpen)
qDebug() << "File with the unsaved content cannot be opened!";
return QString::fromUtf8(file.readAll());
}
FixItContainer ClangFixItTest::semicolonFixIt() const
{
return {Utf8StringLiteral(";"), {{semicolonFilePath(), 3u, 13u},
{semicolonFilePath(), 3u, 13u}}};
}
void ClangFixItTest::init()
{
m_dataDir.reset(new CppEditor::Tests::TemporaryCopiedDir(qrcPath("fixits")));
}
void ClangFixItTest::testAppendSemicolon()
{
ClangFixItOperation operation(diagnosticText(), {semicolonFixIt()});
operation.perform();
QCOMPARE(operation.firstRefactoringFileContent_forTestOnly(),
fileContent("diagnostic_semicolon_fixit_expected.cpp"));
}
void ClangFixItTest::testComparisonVersusAssignmentChooseComparison()
{
const FixItContainer compareFixIt{Utf8StringLiteral("=="), {{compareFilePath(), 4u, 11u},
{compareFilePath(), 4u, 12u}}};
ClangFixItOperation operation(diagnosticText(), {compareFixIt});
operation.perform();
QCOMPARE(operation.firstRefactoringFileContent_forTestOnly(),
fileContent("diagnostic_comparison_fixit_expected1.cpp"));
}
void ClangFixItTest::testComparisonVersusAssignmentChooseParentheses()
{
const FixItContainer assignmentFixItParenLeft{Utf8StringLiteral("("),
{{compareFilePath(), 4u, 9u}, {compareFilePath(), 4u, 9u}}};
const FixItContainer assignmentFixItParenRight{Utf8StringLiteral(")"),
{{compareFilePath(), 4u, 14u}, {compareFilePath(), 4u, 14u}}};
ClangFixItOperation operation(diagnosticText(), {assignmentFixItParenLeft,
assignmentFixItParenRight});
operation.perform();
QCOMPARE(operation.firstRefactoringFileContent_forTestOnly(),
fileContent("diagnostic_comparison_fixit_expected2.cpp"));
}
} // namespace ClangCodeModel::Internal::Tests

View File

@@ -0,0 +1,60 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include <cppeditor/cpptoolstestcase.h>
#include <QObject>
#include <QScopedPointer>
#include <QString>
namespace ClangBackEnd { class FixItContainer; }
namespace ClangCodeModel::Internal::Tests {
class ClangFixItTest : public QObject
{
Q_OBJECT
private slots:
void init();
void testAppendSemicolon();
void testComparisonVersusAssignmentChooseComparison();
void testComparisonVersusAssignmentChooseParentheses();
void testDescription();
private:
QString semicolonFilePath() const;
QString compareFilePath() const;
QString fileContent(const QByteArray &relFilePath) const;
ClangBackEnd::FixItContainer semicolonFixIt() const;
private:
QScopedPointer<CppEditor::Tests::TemporaryCopiedDir> m_dataDir;
};
} // namespace ClangCodeModel::Internal::Tests

View File

@@ -55,5 +55,10 @@
<file>completion/preprocessorKeywordsCompletion3.cpp</file> <file>completion/preprocessorKeywordsCompletion3.cpp</file>
<file>completion/privateFuncDefCompletion.cpp</file> <file>completion/privateFuncDefCompletion.cpp</file>
<file>highlighting/highlightingmarks.h</file> <file>highlighting/highlightingmarks.h</file>
<file>fixits/diagnostic_comparison_fixit_expected1.cpp</file>
<file>fixits/diagnostic_comparison_fixit_expected2.cpp</file>
<file>fixits/diagnostic_comparison_fixit.cpp</file>
<file>fixits/diagnostic_semicolon_fixit_expected.cpp</file>
<file>fixits/diagnostic_semicolon_fixit.cpp</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -0,0 +1,4 @@
int function()
{
return 3
}

View File

@@ -185,7 +185,6 @@ extend_qtc_test(unittest
clangdocuments-test.cpp clangdocuments-test.cpp
clangdocumentsuspenderresumer-test.cpp clangdocumentsuspenderresumer-test.cpp
clangdocument-test.cpp clangdocument-test.cpp
clangfixitoperation-test.cpp
clangfollowsymbol-test.cpp clangfollowsymbol-test.cpp
clangjobqueue-test.cpp clangjobqueue-test.cpp
clangjobs-test.cpp clangjobs-test.cpp
@@ -413,7 +412,6 @@ extend_qtc_test(unittest
SOURCES_PREFIX ../../../src/plugins/clangcodemodel SOURCES_PREFIX ../../../src/plugins/clangcodemodel
SOURCES SOURCES
clangactivationsequenceprocessor.cpp clangactivationsequenceprocessor.h clangactivationsequenceprocessor.cpp clangactivationsequenceprocessor.h
clangfixitoperation.cpp clangfixitoperation.h
clanguiheaderondiskmanager.cpp clanguiheaderondiskmanager.h clanguiheaderondiskmanager.cpp clanguiheaderondiskmanager.h
) )

View File

@@ -1,130 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "googletest.h"
#include <clangfixitoperation.h>
#include <fixitcontainer.h>
#include <utils/changeset.h>
#include <QFile>
#include <QVector>
using ClangBackEnd::FixItContainer;
using ClangCodeModel::Internal::ClangFixItOperation;
using ::testing::PrintToString;
namespace {
QString unsavedFileContent(const QString &unsavedFilePath)
{
QFile unsavedFileContentFile(unsavedFilePath);
const bool isOpen = unsavedFileContentFile.open(QFile::ReadOnly | QFile::Text);
if (!isOpen)
ADD_FAILURE() << "File with the unsaved content cannot be opened!";
return QString::fromUtf8(unsavedFileContentFile.readAll());
}
MATCHER_P(MatchText, expectedText,
std::string(negation ? "hasn't" : "has")
+ " expected text:\n" + PrintToString(expectedText))
{
const ::ClangFixItOperation &operation = arg;
QString resultText = operation.firstRefactoringFileContent_forTestOnly();
if (resultText != expectedText) {
*result_listener << "\n" << resultText.toUtf8().constData();
return false;
}
return true;
}
class ClangFixItOperation : public ::testing::Test
{
protected:
Utf8String semicolonFilePath{TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp", -1};
Utf8String compareFilePath{TESTDATA_DIR"/diagnostic_comparison_fixit.cpp", -1};
Utf8String diagnosticText{Utf8StringLiteral("expected ';' at end of declaration")};
FixItContainer semicolonFixItContainer{Utf8StringLiteral(";"),
{{semicolonFilePath, 3u, 13u},
{semicolonFilePath, 3u, 13u}}};
QString semicolonErrorFile{semicolonFilePath.toString()};
QString semicolonExpectedFile{QString::fromUtf8(TESTDATA_DIR"/diagnostic_semicolon_fixit_expected.cpp")};
QString compareWarningFile{compareFilePath.toString()};
QString compareExpected1File{QString::fromUtf8(TESTDATA_DIR"/diagnostic_comparison_fixit_expected1.cpp")};
QString compareExpected2File{QString::fromUtf8(TESTDATA_DIR"/diagnostic_comparison_fixit_expected2.cpp")};
FixItContainer compareFixItContainer{Utf8StringLiteral("=="),
{{compareFilePath, 4u, 11u},
{compareFilePath, 4u, 12u}}};
FixItContainer assignmentFixItContainerParenLeft{Utf8StringLiteral("("),
{{compareFilePath, 4u, 9u},
{compareFilePath, 4u, 9u}}};
FixItContainer assignmentFixItContainerParenRight{Utf8StringLiteral(")"),
{{compareFilePath, 4u, 14u},
{compareFilePath, 4u, 14u}}};
};
TEST_F(ClangFixItOperation, Description)
{
::ClangFixItOperation operation(diagnosticText, {semicolonFixItContainer});
ASSERT_THAT(operation.description(),
QStringLiteral("Apply Fix: expected ';' at end of declaration"));
}
TEST_F(ClangFixItOperation, AppendSemicolon)
{
::ClangFixItOperation operation(diagnosticText, {semicolonFixItContainer});
operation.perform();
ASSERT_THAT(operation, MatchText(unsavedFileContent(semicolonExpectedFile)));
}
TEST_F(ClangFixItOperation, ComparisonVersusAssignmentChooseComparison)
{
::ClangFixItOperation operation(diagnosticText, {compareFixItContainer});
operation.perform();
ASSERT_THAT(operation, MatchText(unsavedFileContent(compareExpected1File)));
}
TEST_F(ClangFixItOperation, ComparisonVersusAssignmentChooseParentheses)
{
::ClangFixItOperation operation(diagnosticText,
{assignmentFixItContainerParenLeft,
assignmentFixItContainerParenRight});
operation.perform();
ASSERT_THAT(operation, MatchText(unsavedFileContent(compareExpected2File)));
}
}

View File

@@ -206,7 +206,6 @@ Project {
"clangdocumentprocessor-test.cpp", "clangdocumentprocessor-test.cpp",
"clangdocumentprocessors-test.cpp", "clangdocumentprocessors-test.cpp",
"clangdocuments-test.cpp", "clangdocuments-test.cpp",
"clangfixitoperation-test.cpp",
"clangfollowsymbol-test.cpp", "clangfollowsymbol-test.cpp",
"clangjobqueue-test.cpp", "clangjobqueue-test.cpp",
"clangjobs-test.cpp", "clangjobs-test.cpp",
@@ -391,8 +390,6 @@ Project {
files: [ files: [
"clangactivationsequenceprocessor.cpp", "clangactivationsequenceprocessor.cpp",
"clangactivationsequenceprocessor.h", "clangactivationsequenceprocessor.h",
"clangfixitoperation.cpp",
"clangfixitoperation.h",
"clanguiheaderondiskmanager.cpp", "clanguiheaderondiskmanager.cpp",
"clanguiheaderondiskmanager.h", "clanguiheaderondiskmanager.h",
] ]