From 446d79ad679203ffb3998eff82b86ade7beff8cd Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 12 Jan 2024 12:52:29 +0100 Subject: [PATCH] CMake: Split big plugin tests into smaller pieces ... which can then live closer to the tested code. Change-Id: Icd975a76424ea2258c1bb93afdbaabdf1959340a Reviewed-by: Jarek Kobus --- .../cmakeprojectmanager/CMakeLists.txt | 2 +- .../cmakeprojectmanager/cmakeconfigitem.cpp | 30 +++-- .../cmakeprojectmanager/cmakeconfigitem.h | 5 + .../cmakeprojectmanager/cmakeparser.cpp | 25 +++- src/plugins/cmakeprojectmanager/cmakeparser.h | 4 + .../cmakeprojectimporter.cpp | 35 ++++-- .../cmakeprojectimporter.h | 6 +- .../cmakeprojectmanager.qbs | 1 - .../cmakeprojectplugin.cpp | 111 ++++++++++-------- .../cmakeprojectmanager/cmakeprojectplugin.h | 44 ------- 10 files changed, 144 insertions(+), 119 deletions(-) delete mode 100644 src/plugins/cmakeprojectmanager/cmakeprojectplugin.h diff --git a/src/plugins/cmakeprojectmanager/CMakeLists.txt b/src/plugins/cmakeprojectmanager/CMakeLists.txt index 010f948f8a9..492d6284146 100644 --- a/src/plugins/cmakeprojectmanager/CMakeLists.txt +++ b/src/plugins/cmakeprojectmanager/CMakeLists.txt @@ -29,7 +29,7 @@ add_qtc_plugin(CMakeProjectManager cmakeprojectmanager.cpp cmakeprojectmanager.h cmakeprojectmanagertr.h cmakeprojectnodes.cpp cmakeprojectnodes.h - cmakeprojectplugin.cpp cmakeprojectplugin.h + cmakeprojectplugin.cpp cmakesettingspage.cpp cmakesettingspage.h cmakespecificsettings.cpp cmakespecificsettings.h cmaketool.cpp cmaketool.h diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index b02b2e779c0..01528dccc73 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -472,18 +472,24 @@ size_t qHash(const CMakeConfigItem &it) return ::qHash(it.key) ^ ::qHash(it.value) ^ ::qHash(it.isUnset) ^ ::qHash(it.isInitial); } -#if WITH_TESTS - } // namespace CMakeProjectManager -#include "cmakeprojectplugin.h" +#if WITH_TESTS #include -namespace CMakeProjectManager { -namespace Internal { +namespace CMakeProjectManager::Internal { -void CMakeProjectPlugin::testCMakeSplitValue_data() +class CMakeConfigTest final : public QObject +{ + Q_OBJECT + +private slots: + void testCMakeSplitValue_data(); + void testCMakeSplitValue(); +}; + +void CMakeConfigTest::testCMakeSplitValue_data() { QTest::addColumn("input"); QTest::addColumn("keepEmpty"); @@ -526,7 +532,7 @@ void CMakeProjectPlugin::testCMakeSplitValue_data() << "C:/something;;/second/path" << true << QStringList({"C:/something", "", "/second/path"}); } -void CMakeProjectPlugin::testCMakeSplitValue() +void CMakeConfigTest::testCMakeSplitValue() { QFETCH(QString, input); QFETCH(bool, keepEmpty); @@ -537,7 +543,13 @@ void CMakeProjectPlugin::testCMakeSplitValue() QCOMPARE(expectedOutput, realOutput); } -} // namespace Internal +QObject *createCMakeConfigTest() +{ + return new CMakeConfigTest(); +} + +} // CMakeProjectManager::Internal + #endif -} // namespace CMakeProjectManager +#include "cmakeconfigitem.moc" diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h index e97572bac36..1c1a7a2c9e8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.h +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.h @@ -6,6 +6,7 @@ #include "cmake_global.h" #include +#include #include #include @@ -78,4 +79,8 @@ public: QString expandedValueOf(const ProjectExplorer::Kit *k, const QByteArray &key) const; }; +#ifdef WITH_TESTS +namespace Internal { QObject *createCMakeConfigTest(); } +#endif + } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.cpp b/src/plugins/cmakeprojectmanager/cmakeparser.cpp index 11e2dc721df..7da4e383911 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeparser.cpp @@ -248,15 +248,23 @@ void CMakeParser::flush() } // CMakeProjectManager #ifdef WITH_TESTS -#include "cmakeprojectplugin.h" #include #include -namespace CMakeProjectManager { +namespace CMakeProjectManager::Internal { -void Internal::CMakeProjectPlugin::testCMakeParser_data() +class CMakeParserTest final : public QObject +{ + Q_OBJECT + +private slots: + void testCMakeParser_data(); + void testCMakeParser(); +}; + +void CMakeParserTest::testCMakeParser_data() { QTest::addColumn("input"); QTest::addColumn("inputChannel"); @@ -462,7 +470,7 @@ void Internal::CMakeProjectPlugin::testCMakeParser_data() << QString(); } -void Internal::CMakeProjectPlugin::testCMakeParser() +void CMakeParserTest::testCMakeParser() { OutputParserTester testbench; testbench.addLineParser(new CMakeParser); @@ -478,6 +486,13 @@ void Internal::CMakeProjectPlugin::testCMakeParser() outputLines); } -} // CMakeProjectManager +QObject *createCMakeParserTest() +{ + return new CMakeParserTest; +} + +} // CMakeProjectManager::Internal #endif + +#include "cmakeparser.moc" diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.h b/src/plugins/cmakeprojectmanager/cmakeparser.h index 08f57a75342..e3e9f54f65d 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.h +++ b/src/plugins/cmakeprojectmanager/cmakeparser.h @@ -53,4 +53,8 @@ private: CallStackLine m_errorOrWarningLine; }; +#ifdef WITH_TESTS +namespace Internal { QObject *createCMakeParserTest(); } +#endif + } // CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 5688c3e75b2..3511f031351 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -1103,14 +1103,23 @@ void CMakeProjectImporter::persistTemporaryCMake(Kit *k, const QVariantList &vl) #ifdef WITH_TESTS -#include "cmakeprojectplugin.h" - #include -namespace CMakeProjectManager { -namespace Internal { +namespace CMakeProjectManager::Internal { -void CMakeProjectPlugin::testCMakeProjectImporterQt_data() +class CMakeProjectImporterTest final : public QObject +{ + Q_OBJECT + +private slots: + void testCMakeProjectImporterQt_data(); + void testCMakeProjectImporterQt(); + + void testCMakeProjectImporterToolchain_data(); + void testCMakeProjectImporterToolchain(); +}; + +void CMakeProjectImporterTest::testCMakeProjectImporterQt_data() { QTest::addColumn("cache"); QTest::addColumn("expectedQmake"); @@ -1125,7 +1134,7 @@ void CMakeProjectPlugin::testCMakeProjectImporterQt_data() // Everything else will require Qt installations! } -void CMakeProjectPlugin::testCMakeProjectImporterQt() +void CMakeProjectImporterTest::testCMakeProjectImporterQt() { QFETCH(QStringList, cache); QFETCH(QString, expectedQmake); @@ -1143,7 +1152,7 @@ void CMakeProjectPlugin::testCMakeProjectImporterQt() Environment::systemEnvironment()); QCOMPARE(realQmake.path(), expectedQmake); } -void CMakeProjectPlugin::testCMakeProjectImporterToolchain_data() +void CMakeProjectImporterTest::testCMakeProjectImporterToolchain_data() { QTest::addColumn("cache"); QTest::addColumn("expectedLanguages"); @@ -1180,7 +1189,7 @@ void CMakeProjectPlugin::testCMakeProjectImporterToolchain_data() << QStringList({"/usr/bin/g++", "/usr/bin/clang", "/tmp/strange/compiler"}); } -void CMakeProjectPlugin::testCMakeProjectImporterToolchain() +void CMakeProjectImporterTest::testCMakeProjectImporterToolchain() { QFETCH(QStringList, cache); QFETCH(QByteArrayList, expectedLanguages); @@ -1205,7 +1214,13 @@ void CMakeProjectPlugin::testCMakeProjectImporterToolchain() } } -} // namespace Internal -} // namespace CMakeProjectManager +QObject *createCMakeProjectImporterTest() +{ + return new CMakeProjectImporterTest; +} + +} // CMakeProjectManager::Internal #endif + +#include "cmakeprojectimporter.moc" diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h index 350b0b77d6c..ba8af4d61bc 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h @@ -3,8 +3,6 @@ #pragma once -#include "presetsparser.h" - #include #include @@ -51,5 +49,9 @@ private: Utils::TemporaryDirectory m_presetsTempDir; }; +#ifdef WITH_TESTS +QObject *createCMakeProjectImporterTest(); +#endif + } // namespace Internal } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index 94dfa408e15..1cbaac7b6d6 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -56,7 +56,6 @@ QtcPlugin { "cmakeprojectnodes.cpp", "cmakeprojectnodes.h", "cmakeprojectplugin.cpp", - "cmakeprojectplugin.h", "cmaketool.cpp", "cmaketool.h", "cmaketoolmanager.cpp", diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index b600a87f3c3..071f75b230b 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -1,8 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "cmakeprojectplugin.h" - #include "cmakebuildconfiguration.h" #include "cmakebuildstep.h" #include "cmakebuildsystem.h" @@ -10,8 +8,10 @@ #include "cmakeformatter.h" #include "cmakeinstallstep.h" #include "cmakelocatorfilter.h" +#include "cmakeparser.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" +#include "cmakeprojectimporter.h" #include "cmakeprojectmanager.h" #include "cmakeprojectmanagertr.h" #include "cmakeprojectnodes.h" @@ -21,6 +21,8 @@ #include #include +#include + #include #include #include @@ -66,64 +68,79 @@ public: CMakeFormatter cmakeFormatter; }; -CMakeProjectPlugin::~CMakeProjectPlugin() +class CMakeProjectPlugin final : public ExtensionSystem::IPlugin { - delete d; -} + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CMakeProjectManager.json") -void CMakeProjectPlugin::initialize() -{ - d = new CMakeProjectPluginPrivate; + ~CMakeProjectPlugin() + { + delete d; + } - const Context projectContext{CMakeProjectManager::Constants::CMAKE_PROJECT_ID}; + void initialize() final + { + d = new CMakeProjectPluginPrivate; - FileIconProvider::registerIconOverlayForSuffix(Constants::Icons::FILE_OVERLAY, "cmake"); - FileIconProvider::registerIconOverlayForFilename(Constants::Icons::FILE_OVERLAY, - "CMakeLists.txt"); +#ifdef WITH_TESTS + addTestCreator(createCMakeConfigTest); + addTestCreator(createCMakeParserTest); + addTestCreator(createCMakeProjectImporterTest); +#endif - TextEditor::SnippetProvider::registerGroup(Constants::CMAKE_SNIPPETS_GROUP_ID, - Tr::tr("CMake", "SnippetProvider")); - ProjectManager::registerProjectType(Utils::Constants::CMAKE_PROJECT_MIMETYPE); + const Context projectContext{CMakeProjectManager::Constants::CMAKE_PROJECT_ID}; - //register actions - Command *command = ActionManager::registerAction(&d->buildTargetContextAction, - Constants::BUILD_TARGET_CONTEXT_MENU, - projectContext); - command->setAttribute(Command::CA_Hide); - command->setAttribute(Command::CA_UpdateText); - command->setDescription(d->buildTargetContextAction.text()); + FileIconProvider::registerIconOverlayForSuffix(Constants::Icons::FILE_OVERLAY, "cmake"); + FileIconProvider::registerIconOverlayForFilename(Constants::Icons::FILE_OVERLAY, + "CMakeLists.txt"); - ActionManager::actionContainer(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT) + TextEditor::SnippetProvider::registerGroup(Constants::CMAKE_SNIPPETS_GROUP_ID, + Tr::tr("CMake", "SnippetProvider")); + ProjectManager::registerProjectType(Utils::Constants::CMAKE_PROJECT_MIMETYPE); + + //register actions + Command *command = ActionManager::registerAction(&d->buildTargetContextAction, + Constants::BUILD_TARGET_CONTEXT_MENU, + projectContext); + command->setAttribute(Command::CA_Hide); + command->setAttribute(Command::CA_UpdateText); + command->setDescription(d->buildTargetContextAction.text()); + + ActionManager::actionContainer(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT) ->addAction(command, ProjectExplorer::Constants::G_PROJECT_BUILD); - // Wire up context menu updates: - connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, - this, &CMakeProjectPlugin::updateContextActions); + // Wire up context menu updates: + connect(ProjectTree::instance(), &ProjectTree::currentNodeChanged, + this, &CMakeProjectPlugin::updateContextActions); - connect(&d->buildTargetContextAction, &ParameterAction::triggered, this, [] { - if (auto bs = qobject_cast(ProjectTree::currentBuildSystem())) { - auto targetNode = dynamic_cast(ProjectTree::currentNode()); - bs->buildCMakeTarget(targetNode ? targetNode->displayName() : QString()); - } - }); -} + connect(&d->buildTargetContextAction, &ParameterAction::triggered, this, [] { + if (auto bs = qobject_cast(ProjectTree::currentBuildSystem())) { + auto targetNode = dynamic_cast(ProjectTree::currentNode()); + bs->buildCMakeTarget(targetNode ? targetNode->displayName() : QString()); + } + }); + } -void CMakeProjectPlugin::extensionsInitialized() -{ - // Delay the restoration to allow the devices to load first. - QTimer::singleShot(0, this, [] { CMakeToolManager::restoreCMakeTools(); }); -} + void extensionsInitialized() final + { + // Delay the restoration to allow the devices to load first. + QTimer::singleShot(0, this, [] { CMakeToolManager::restoreCMakeTools(); }); + } -void CMakeProjectPlugin::updateContextActions(Node *node) -{ - auto targetNode = dynamic_cast(node); - const QString targetDisplayName = targetNode ? targetNode->displayName() : QString(); + void updateContextActions(ProjectExplorer::Node *node) + { + auto targetNode = dynamic_cast(node); + const QString targetDisplayName = targetNode ? targetNode->displayName() : QString(); - // Build Target: - d->buildTargetContextAction.setParameter(targetDisplayName); - d->buildTargetContextAction.setEnabled(targetNode); - d->buildTargetContextAction.setVisible(targetNode); -} + // Build Target: + d->buildTargetContextAction.setParameter(targetDisplayName); + d->buildTargetContextAction.setEnabled(targetNode); + d->buildTargetContextAction.setVisible(targetNode); + } + + class CMakeProjectPluginPrivate *d = nullptr; +}; } // CMakeProjectManager::Internal +#include "cmakeprojectplugin.moc" diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h deleted file mode 100644 index 983ba42f7ef..00000000000 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace ProjectExplorer { class Node; } - -namespace CMakeProjectManager::Internal { - -class CMakeProjectPlugin final : public ExtensionSystem::IPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CMakeProjectManager.json") - -public: - ~CMakeProjectPlugin(); - -#ifdef WITH_TESTS -private slots: - void testCMakeParser_data(); - void testCMakeParser(); - - void testCMakeSplitValue_data(); - void testCMakeSplitValue(); - - void testCMakeProjectImporterQt_data(); - void testCMakeProjectImporterQt(); - - void testCMakeProjectImporterToolchain_data(); - void testCMakeProjectImporterToolchain(); -#endif - -private: - void initialize() final; - void extensionsInitialized() final; - - void updateContextActions(ProjectExplorer::Node *node); - - class CMakeProjectPluginPrivate *d = nullptr; -}; - -} // CMakeProjectManager::Internal