diff --git a/src/plugins/clangcodemodel/CMakeLists.txt b/src/plugins/clangcodemodel/CMakeLists.txt index 5fe46c44097..31533298c69 100644 --- a/src/plugins/clangcodemodel/CMakeLists.txt +++ b/src/plugins/clangcodemodel/CMakeLists.txt @@ -47,6 +47,7 @@ extend_qtc_plugin(ClangCodeModel SOURCES test/clangbatchfileprocessor.cpp test/clangbatchfileprocessor.h test/clangdtests.cpp test/clangdtests.h + test/clangfixittest.cpp test/clangfixittest.h test/data/clangtestdata.qrc ) diff --git a/src/plugins/clangcodemodel/clangcodemodel.qbs b/src/plugins/clangcodemodel/clangcodemodel.qbs index eec97a45257..48f4ae846d4 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.qbs +++ b/src/plugins/clangcodemodel/clangcodemodel.qbs @@ -101,6 +101,8 @@ QtcPlugin { "clangbatchfileprocessor.h", "clangdtests.cpp", "clangdtests.h", + "clangfixittest.cpp", + "clangfixittest.h", "data/clangtestdata.qrc", ] } diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index f0ccd9ea9e7..46761fc2353 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -32,6 +32,7 @@ #ifdef WITH_TESTS # include "test/clangbatchfileprocessor.h" # include "test/clangdtests.h" +# include "test/clangfixittest.h" #endif #include @@ -215,6 +216,7 @@ QVector ClangCodeModelPlugin::createTestObjects() const new Tests::ClangdTestHighlighting, new Tests::ClangdTestLocalReferences, new Tests::ClangdTestTooltips, + new Tests::ClangFixItTest, }; } #endif diff --git a/src/plugins/clangcodemodel/test/clangfixittest.cpp b/src/plugins/clangcodemodel/test/clangfixittest.cpp new file mode 100644 index 00000000000..a9297bce328 --- /dev/null +++ b/src/plugins/clangcodemodel/test/clangfixittest.cpp @@ -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 +#include + +#include +#include +#include + +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 diff --git a/src/plugins/clangcodemodel/test/clangfixittest.h b/src/plugins/clangcodemodel/test/clangfixittest.h new file mode 100644 index 00000000000..c0695c3be11 --- /dev/null +++ b/src/plugins/clangcodemodel/test/clangfixittest.h @@ -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 + +#include +#include +#include + +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 m_dataDir; +}; + +} // namespace ClangCodeModel::Internal::Tests diff --git a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc index 9dcc3fbae15..1ee4bdee92c 100644 --- a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc +++ b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc @@ -55,5 +55,10 @@ completion/preprocessorKeywordsCompletion3.cpp completion/privateFuncDefCompletion.cpp highlighting/highlightingmarks.h + fixits/diagnostic_comparison_fixit_expected1.cpp + fixits/diagnostic_comparison_fixit_expected2.cpp + fixits/diagnostic_comparison_fixit.cpp + fixits/diagnostic_semicolon_fixit_expected.cpp + fixits/diagnostic_semicolon_fixit.cpp diff --git a/tests/unit/unittest/data/diagnostic_comparison_fixit.cpp b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit.cpp similarity index 100% rename from tests/unit/unittest/data/diagnostic_comparison_fixit.cpp rename to src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit.cpp diff --git a/tests/unit/unittest/data/diagnostic_comparison_fixit_expected1.cpp b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit_expected1.cpp similarity index 100% rename from tests/unit/unittest/data/diagnostic_comparison_fixit_expected1.cpp rename to src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit_expected1.cpp diff --git a/tests/unit/unittest/data/diagnostic_comparison_fixit_expected2.cpp b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit_expected2.cpp similarity index 100% rename from tests/unit/unittest/data/diagnostic_comparison_fixit_expected2.cpp rename to src/plugins/clangcodemodel/test/data/fixits/diagnostic_comparison_fixit_expected2.cpp diff --git a/src/plugins/clangcodemodel/test/data/fixits/diagnostic_semicolon_fixit.cpp b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_semicolon_fixit.cpp new file mode 100644 index 00000000000..8b7eb2c657c --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_semicolon_fixit.cpp @@ -0,0 +1,4 @@ +int function() +{ + return 3 +} diff --git a/tests/unit/unittest/data/diagnostic_semicolon_fixit_expected.cpp b/src/plugins/clangcodemodel/test/data/fixits/diagnostic_semicolon_fixit_expected.cpp similarity index 100% rename from tests/unit/unittest/data/diagnostic_semicolon_fixit_expected.cpp rename to src/plugins/clangcodemodel/test/data/fixits/diagnostic_semicolon_fixit_expected.cpp diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 649dd3fa036..67213941a42 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -185,7 +185,6 @@ extend_qtc_test(unittest clangdocuments-test.cpp clangdocumentsuspenderresumer-test.cpp clangdocument-test.cpp - clangfixitoperation-test.cpp clangfollowsymbol-test.cpp clangjobqueue-test.cpp clangjobs-test.cpp @@ -413,7 +412,6 @@ extend_qtc_test(unittest SOURCES_PREFIX ../../../src/plugins/clangcodemodel SOURCES clangactivationsequenceprocessor.cpp clangactivationsequenceprocessor.h - clangfixitoperation.cpp clangfixitoperation.h clanguiheaderondiskmanager.cpp clanguiheaderondiskmanager.h ) diff --git a/tests/unit/unittest/clangfixitoperation-test.cpp b/tests/unit/unittest/clangfixitoperation-test.cpp deleted file mode 100644 index e8fa178014b..00000000000 --- a/tests/unit/unittest/clangfixitoperation-test.cpp +++ /dev/null @@ -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 -#include - -#include - -#include -#include - -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))); -} - -} diff --git a/tests/unit/unittest/unittest.qbs b/tests/unit/unittest/unittest.qbs index 32db4b010dc..d45103fdbac 100644 --- a/tests/unit/unittest/unittest.qbs +++ b/tests/unit/unittest/unittest.qbs @@ -206,7 +206,6 @@ Project { "clangdocumentprocessor-test.cpp", "clangdocumentprocessors-test.cpp", "clangdocuments-test.cpp", - "clangfixitoperation-test.cpp", "clangfollowsymbol-test.cpp", "clangjobqueue-test.cpp", "clangjobs-test.cpp", @@ -391,8 +390,6 @@ Project { files: [ "clangactivationsequenceprocessor.cpp", "clangactivationsequenceprocessor.h", - "clangfixitoperation.cpp", - "clangfixitoperation.h", "clanguiheaderondiskmanager.cpp", "clanguiheaderondiskmanager.h", ]