From 14e18fc92fca6074cab15f382b51d996eaa8df6a Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 11 Jul 2023 12:40:08 +0200 Subject: [PATCH] AutoTest: Merge settings and tools hierarchies [1/2] Currently living in the settings files to keep changes small, will be renamed in a second step. This allows the settings aspects to be used in their short form and overall removes some indirections. Change-Id: I099369b62239aed8192613a04bca958a660c36c7 Reviewed-by: Christian Stenger --- src/plugins/autotest/CMakeLists.txt | 5 - src/plugins/autotest/autotestplugin.cpp | 22 ++--- src/plugins/autotest/autotestunittests.cpp | 4 +- .../autotest/boost/boosttestconfiguration.cpp | 22 ++--- .../autotest/boost/boosttestframework.cpp | 40 -------- .../autotest/boost/boosttestframework.h | 28 ------ .../autotest/boost/boosttestsettings.cpp | 64 +++++++++++-- .../autotest/boost/boosttestsettings.h | 14 ++- .../autotest/catch/catchconfiguration.cpp | 36 ++++---- src/plugins/autotest/catch/catchframework.cpp | 39 -------- src/plugins/autotest/catch/catchframework.h | 30 ------ .../autotest/catch/catchtestparser.cpp | 2 +- .../autotest/catch/catchtestsettings.cpp | 58 +++++++++++- .../autotest/catch/catchtestsettings.h | 16 +++- src/plugins/autotest/ctest/ctestsettings.cpp | 64 ++++++++++++- src/plugins/autotest/ctest/ctestsettings.h | 19 +++- src/plugins/autotest/ctest/ctesttool.cpp | 43 --------- src/plugins/autotest/ctest/ctesttool.h | 31 ------- src/plugins/autotest/ctest/ctesttreeitem.cpp | 2 +- .../autotest/gtest/gtestconfiguration.cpp | 18 ++-- src/plugins/autotest/gtest/gtestframework.cpp | 75 --------------- src/plugins/autotest/gtest/gtestframework.h | 33 ------- src/plugins/autotest/gtest/gtestsettings.cpp | 92 +++++++++++++++++-- src/plugins/autotest/gtest/gtestsettings.h | 22 ++++- src/plugins/autotest/gtest/gtesttreeitem.cpp | 14 +-- src/plugins/autotest/itestframework.cpp | 10 +- src/plugins/autotest/itestframework.h | 7 +- .../autotest/qtest/qttestconfiguration.cpp | 22 ++--- .../autotest/qtest/qttestframework.cpp | 48 ---------- src/plugins/autotest/qtest/qttestframework.h | 29 ------ src/plugins/autotest/qtest/qttestsettings.cpp | 68 +++++++++++++- src/plugins/autotest/qtest/qttestsettings.h | 16 +++- .../autotest/quick/quicktestconfiguration.cpp | 18 ++-- .../autotest/quick/quicktestframework.cpp | 17 ++-- .../autotest/quick/quicktestframework.h | 9 +- .../autotest/quick/quicktestparser.cpp | 4 +- src/plugins/autotest/testframeworkmanager.cpp | 15 +-- 37 files changed, 489 insertions(+), 567 deletions(-) delete mode 100644 src/plugins/autotest/boost/boosttestframework.cpp delete mode 100644 src/plugins/autotest/boost/boosttestframework.h delete mode 100644 src/plugins/autotest/catch/catchframework.cpp delete mode 100644 src/plugins/autotest/catch/catchframework.h delete mode 100644 src/plugins/autotest/ctest/ctesttool.cpp delete mode 100644 src/plugins/autotest/ctest/ctesttool.h delete mode 100644 src/plugins/autotest/gtest/gtestframework.cpp delete mode 100644 src/plugins/autotest/gtest/gtestframework.h delete mode 100644 src/plugins/autotest/qtest/qttestframework.cpp delete mode 100644 src/plugins/autotest/qtest/qttestframework.h diff --git a/src/plugins/autotest/CMakeLists.txt b/src/plugins/autotest/CMakeLists.txt index bbad11ff0dd..8ded823a8cf 100644 --- a/src/plugins/autotest/CMakeLists.txt +++ b/src/plugins/autotest/CMakeLists.txt @@ -13,7 +13,6 @@ add_qtc_plugin(AutoTest boost/boostcodeparser.cpp boost/boostcodeparser.h boost/boosttestconfiguration.cpp boost/boosttestconfiguration.h boost/boosttestconstants.h - boost/boosttestframework.cpp boost/boosttestframework.h boost/boosttestoutputreader.cpp boost/boosttestoutputreader.h boost/boosttestparser.cpp boost/boosttestparser.h boost/boosttestresult.cpp boost/boosttestresult.h @@ -21,19 +20,16 @@ add_qtc_plugin(AutoTest boost/boosttesttreeitem.cpp boost/boosttesttreeitem.h catch/catchcodeparser.cpp catch/catchcodeparser.h catch/catchconfiguration.cpp catch/catchconfiguration.h - catch/catchframework.h catch/catchframework.cpp catch/catchoutputreader.h catch/catchoutputreader.cpp catch/catchresult.h catch/catchresult.cpp catch/catchtestparser.h catch/catchtestparser.cpp catch/catchtreeitem.h catch/catchtreeitem.cpp catch/catchtestsettings.cpp catch/catchtestsettings.h ctest/ctestconfiguration.cpp ctest/ctestconfiguration.h ctest/ctestoutputreader.cpp ctest/ctestoutputreader.h ctest/ctestsettings.cpp ctest/ctestsettings.h - ctest/ctesttool.cpp ctest/ctesttool.h ctest/ctesttreeitem.cpp ctest/ctesttreeitem.h gtest/gtest_utils.cpp gtest/gtest_utils.h gtest/gtestconfiguration.cpp gtest/gtestconfiguration.h gtest/gtestconstants.h - gtest/gtestframework.cpp gtest/gtestframework.h gtest/gtestoutputreader.cpp gtest/gtestoutputreader.h gtest/gtestparser.cpp gtest/gtestparser.h gtest/gtestresult.cpp gtest/gtestresult.h @@ -47,7 +43,6 @@ add_qtc_plugin(AutoTest qtest/qttest_utils.cpp qtest/qttest_utils.h qtest/qttestconfiguration.cpp qtest/qttestconfiguration.h qtest/qttestconstants.h - qtest/qttestframework.cpp qtest/qttestframework.h qtest/qttestoutputreader.cpp qtest/qttestoutputreader.h qtest/qttestparser.cpp qtest/qttestparser.h qtest/qttestresult.cpp qtest/qttestresult.h diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index cb318c96b6a..1211b7f5e48 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -18,11 +18,11 @@ #include "testtreeitem.h" #include "testtreemodel.h" -#include "boost/boosttestframework.h" -#include "catch/catchframework.h" -#include "ctest/ctesttool.h" -#include "gtest/gtestframework.h" -#include "qtest/qttestframework.h" +#include "boost/boosttestsettings.h" +#include "catch/catchtestsettings.h" +#include "ctest/ctestsettings.h" +#include "gtest/gtestsettings.h" +#include "qtest/qttestsettings.h" #include "quick/quicktestframework.h" #include @@ -128,13 +128,13 @@ AutotestPluginPrivate::AutotestPluginPrivate() { dd = this; // Needed as the code below access it via the static plugin interface initializeMenuEntries(); - m_frameworkManager.registerTestFramework(new QtTestFramework); - m_frameworkManager.registerTestFramework(new QuickTestFramework); - m_frameworkManager.registerTestFramework(new GTestFramework); - m_frameworkManager.registerTestFramework(new BoostTestFramework); - m_frameworkManager.registerTestFramework(new CatchFramework); + m_frameworkManager.registerTestFramework(&theQtTestFramework()); + m_frameworkManager.registerTestFramework(&theQuickTestFramework()); + m_frameworkManager.registerTestFramework(&theGTestFramework()); + m_frameworkManager.registerTestFramework(&theBoostTestFramework()); + m_frameworkManager.registerTestFramework(&theCatchFramework()); - m_frameworkManager.registerTestTool(new CTestTool); + m_frameworkManager.registerTestTool(&theCTestTool()); m_frameworkManager.synchronizeSettings(); m_resultsPane = TestResultsPane::instance(); diff --git a/src/plugins/autotest/autotestunittests.cpp b/src/plugins/autotest/autotestunittests.cpp index 50d0b496c21..9834a6ea681 100644 --- a/src/plugins/autotest/autotestunittests.cpp +++ b/src/plugins/autotest/autotestunittests.cpp @@ -78,8 +78,8 @@ void AutoTestUnitTests::initTestCase() // Enable quick check for derived tests static const Id id = Id("AutoTest.Framework.QtTest"); - static_cast( - TestFrameworkManager::frameworkForId(id)->testSettings()) + static_cast( + TestFrameworkManager::frameworkForId(id)) ->quickCheckForDerivedTests.setValue(true); } diff --git a/src/plugins/autotest/boost/boosttestconfiguration.cpp b/src/plugins/autotest/boost/boosttestconfiguration.cpp index 088506199c8..58cbfb5f313 100644 --- a/src/plugins/autotest/boost/boosttestconfiguration.cpp +++ b/src/plugins/autotest/boost/boosttestconfiguration.cpp @@ -18,10 +18,10 @@ namespace Internal { TestOutputReader *BoostTestConfiguration::createOutputReader(Process *app) const { - auto settings = static_cast(framework()->testSettings()); + BoostTestFramework &settings = *static_cast(framework()); return new BoostTestOutputReader(app, buildDirectory(), projectFile(), - LogLevel(settings->logLevel.value()), - ReportLevel(settings->reportLevel.value())); + LogLevel(settings.logLevel()), + ReportLevel(settings.reportLevel())); } enum class InterferingType { Options, EnvironmentVariables }; @@ -86,19 +86,19 @@ static QStringList filterInterfering(const QStringList &provided, QStringList *o QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted) const { - auto boostSettings = static_cast(framework()->testSettings()); + BoostTestFramework &boostSettings = *static_cast(framework()); QStringList arguments; - arguments << "-l" << BoostTestSettings::logLevelToOption(LogLevel(boostSettings->logLevel())); - arguments << "-r" << BoostTestSettings::reportLevelToOption(ReportLevel(boostSettings->reportLevel())); + arguments << "-l" << BoostTestFramework::logLevelToOption(LogLevel(boostSettings.logLevel())); + arguments << "-r" << BoostTestFramework::reportLevelToOption(ReportLevel(boostSettings.reportLevel())); - if (boostSettings->randomize()) - arguments << QString("--random=").append(QString::number(boostSettings->seed())); + if (boostSettings.randomize()) + arguments << QString("--random=").append(QString::number(boostSettings.seed())); - if (boostSettings->systemErrors()) + if (boostSettings.systemErrors()) arguments << "-s"; - if (boostSettings->fpExceptions()) + if (boostSettings.fpExceptions()) arguments << "--detect_fp_exceptions"; - if (!boostSettings->memLeaks()) + if (!boostSettings.memLeaks()) arguments << "--detect_memory_leaks=0"; // TODO improve the test case gathering and arguments building to avoid too long command lines diff --git a/src/plugins/autotest/boost/boosttestframework.cpp b/src/plugins/autotest/boost/boosttestframework.cpp deleted file mode 100644 index b431bbed76b..00000000000 --- a/src/plugins/autotest/boost/boosttestframework.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "boosttestframework.h" - -#include "boosttestconstants.h" -#include "boosttesttreeitem.h" -#include "boosttestparser.h" -#include "../autotesttr.h" - -namespace Autotest { -namespace Internal { - -ITestParser *BoostTestFramework::createTestParser() -{ - return new BoostTestParser(this); -} - -ITestTreeItem *BoostTestFramework::createRootNode() -{ - return new BoostTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); -} - -const char *BoostTestFramework::name() const -{ - return BoostTest::Constants::FRAMEWORK_NAME; -} - -QString BoostTestFramework::displayName() const -{ - return Tr::tr(BoostTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); -} - -unsigned BoostTestFramework::priority() const -{ - return BoostTest::Constants::FRAMEWORK_PRIORITY; -} - -} // namespace Internal -} // namespace Autotest diff --git a/src/plugins/autotest/boost/boosttestframework.h b/src/plugins/autotest/boost/boosttestframework.h deleted file mode 100644 index da015fbd6f3..00000000000 --- a/src/plugins/autotest/boost/boosttestframework.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "../itestframework.h" - -#include "boosttestsettings.h" - -namespace Autotest::Internal { - -class BoostTestFramework : public ITestFramework -{ -public: - BoostTestFramework() : ITestFramework(true) {} - -private: - const char *name() const override; - QString displayName() const override; - unsigned priority() const override; - ITestSettings *testSettings() override { return &m_settings; } - ITestParser *createTestParser() override; - ITestTreeItem *createRootNode() override; - - BoostTestSettings m_settings{settingsId()}; -}; - -} // Autotest::Internal diff --git a/src/plugins/autotest/boost/boosttestsettings.cpp b/src/plugins/autotest/boost/boosttestsettings.cpp index 4ff10a90ce8..54c8fa5e498 100644 --- a/src/plugins/autotest/boost/boosttestsettings.cpp +++ b/src/plugins/autotest/boost/boosttestsettings.cpp @@ -4,10 +4,13 @@ #include "boosttestsettings.h" #include "boosttestconstants.h" - +#include "boosttesttreeitem.h" +#include "boosttestparser.h" #include "../autotestconstants.h" #include "../autotesttr.h" +#include + #include using namespace Layouting; @@ -15,11 +18,15 @@ using namespace Utils; namespace Autotest::Internal { -BoostTestSettings::BoostTestSettings(Id settingsId) +BoostTestFramework &theBoostTestFramework() +{ + static BoostTestFramework framework; + return framework; +} + +BoostTestFramework::BoostTestFramework() + : ITestFramework(true) { - setId(settingsId); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayName(Tr::tr(BoostTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); setSettingsGroups("Autotest", "BoostTest"); setLayouter([this] { @@ -88,7 +95,7 @@ BoostTestSettings::BoostTestSettings(Id settingsId) memLeaks.setToolTip(Tr::tr("Enable memory leak detection.")); } -QString BoostTestSettings::logLevelToOption(const LogLevel logLevel) +QString BoostTestFramework::logLevelToOption(const LogLevel logLevel) { switch (logLevel) { case LogLevel::All: return QString("all"); @@ -106,7 +113,7 @@ QString BoostTestSettings::logLevelToOption(const LogLevel logLevel) return {}; } -QString BoostTestSettings::reportLevelToOption(const ReportLevel reportLevel) +QString BoostTestFramework::reportLevelToOption(const ReportLevel reportLevel) { switch (reportLevel) { case ReportLevel::Confirm: return QString("confirm"); @@ -117,4 +124,47 @@ QString BoostTestSettings::reportLevelToOption(const ReportLevel reportLevel) return {}; } +ITestParser *BoostTestFramework::createTestParser() +{ + return new BoostTestParser(this); +} + +ITestTreeItem *BoostTestFramework::createRootNode() +{ + return new BoostTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); +} + +const char *BoostTestFramework::name() const +{ + return BoostTest::Constants::FRAMEWORK_NAME; +} + +QString BoostTestFramework::displayName() const +{ + return Tr::tr(BoostTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); +} + +unsigned BoostTestFramework::priority() const +{ + return BoostTest::Constants::FRAMEWORK_PRIORITY; +} + +// BoostSettingsPage + +class BoostSettingsPage final : public Core::IOptionsPage +{ +public: + BoostSettingsPage() + { + setId(Id(Constants::SETTINGSPAGE_PREFIX).withSuffix(QString("%1.%2") + .arg(BoostTest::Constants::FRAMEWORK_PRIORITY) + .arg(BoostTest::Constants::FRAMEWORK_NAME))); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayName(Tr::tr(BoostTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); + setSettingsProvider([] { return &theBoostTestFramework() ; }); + } +}; + +const BoostSettingsPage settingsPage; + } // Autotest::Internal diff --git a/src/plugins/autotest/boost/boosttestsettings.h b/src/plugins/autotest/boost/boosttestsettings.h index e95f98218c2..39e999cb3d4 100644 --- a/src/plugins/autotest/boost/boosttestsettings.h +++ b/src/plugins/autotest/boost/boosttestsettings.h @@ -3,7 +3,7 @@ #pragma once -#include +#include "../itestframework.h" namespace Autotest::Internal { @@ -30,10 +30,16 @@ enum class ReportLevel No }; -class BoostTestSettings : public Core::PagedSettings +class BoostTestFramework : public ITestFramework { public: - explicit BoostTestSettings(Utils::Id settingsId); + BoostTestFramework(); + + const char *name() const override; + QString displayName() const override; + unsigned priority() const override; + ITestParser *createTestParser() override; + ITestTreeItem *createRootNode() override; static QString logLevelToOption(const LogLevel logLevel); static QString reportLevelToOption(const ReportLevel reportLevel); @@ -47,6 +53,8 @@ public: Utils::BoolAspect memLeaks{this}; }; +BoostTestFramework &theBoostTestFramework(); + } // Autotest::Internal Q_DECLARE_METATYPE(Autotest::Internal::LogLevel) diff --git a/src/plugins/autotest/catch/catchconfiguration.cpp b/src/plugins/autotest/catch/catchconfiguration.cpp index 0cb9aef7c5c..0d073892cb2 100644 --- a/src/plugins/autotest/catch/catchconfiguration.cpp +++ b/src/plugins/autotest/catch/catchconfiguration.cpp @@ -84,32 +84,30 @@ QStringList CatchConfiguration::argumentsForTestRunner(QStringList *omitted) con ' ', Qt::SkipEmptyParts), omitted); } - auto settings = static_cast(framework()->testSettings()); - if (!settings) - return arguments; + CatchFramework &settings = *static_cast(framework()); - if (settings->abortAfterChecked.value()) - arguments << "-x" << QString::number(settings->abortAfter.value()); - if (settings->samplesChecked.value()) - arguments << "--benchmark-samples" << QString::number(settings->benchmarkSamples.value()); - if (settings->resamplesChecked.value()) - arguments << "--benchmark-resamples" << QString::number(settings->benchmarkResamples.value()); - if (settings->warmupChecked.value()) - arguments << "--benchmark-warmup-time" << QString::number(settings->benchmarkWarmupTime.value()); - if (settings->confidenceIntervalChecked.value()) - arguments << "--benchmark-confidence-interval" << QString::number(settings->confidenceInterval.value()); - if (settings->noAnalysis.value()) + if (settings.abortAfterChecked()) + arguments << "-x" << QString::number(settings.abortAfter()); + if (settings.samplesChecked()) + arguments << "--benchmark-samples" << QString::number(settings.benchmarkSamples()); + if (settings.resamplesChecked()) + arguments << "--benchmark-resamples" << QString::number(settings.benchmarkResamples()); + if (settings.warmupChecked()) + arguments << "--benchmark-warmup-time" << QString::number(settings.benchmarkWarmupTime()); + if (settings.confidenceIntervalChecked()) + arguments << "--benchmark-confidence-interval" << QString::number(settings.confidenceInterval()); + if (settings.noAnalysis()) arguments << "--benchmark-no-analysis"; - if (settings->showSuccess.value()) + if (settings.showSuccess()) arguments << "-s"; - if (settings->noThrow.value()) + if (settings.noThrow()) arguments << "-e"; - if (settings->visibleWhitespace.value()) + if (settings.visibleWhitespace()) arguments << "-i"; - if (settings->warnOnEmpty.value()) + if (settings.warnOnEmpty()) arguments << "-w" << "NoAssertions"; - if (isDebugRunMode() && settings->breakOnFailure.value()) + if (isDebugRunMode() && settings.breakOnFailure()) arguments << "-b"; return arguments; } diff --git a/src/plugins/autotest/catch/catchframework.cpp b/src/plugins/autotest/catch/catchframework.cpp deleted file mode 100644 index d2afeddaad2..00000000000 --- a/src/plugins/autotest/catch/catchframework.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2019 Jochen Seemann -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "catchframework.h" - -#include "catchtestparser.h" -#include "catchtreeitem.h" -#include "../autotesttr.h" - -namespace Autotest { -namespace Internal { - -const char *CatchFramework::name() const -{ - return "Catch"; -} - -QString CatchFramework::displayName() const -{ - return Tr::tr("Catch Test"); -} - -unsigned CatchFramework::priority() const -{ - return 12; -} - -ITestParser *CatchFramework::createTestParser() -{ - return new CatchTestParser(this); -} - -ITestTreeItem *CatchFramework::createRootNode() -{ - return new CatchTreeItem(this, displayName(), {}, ITestTreeItem::Root); -} - -} // namespace Internal -} // namespace Autotest diff --git a/src/plugins/autotest/catch/catchframework.h b/src/plugins/autotest/catch/catchframework.h deleted file mode 100644 index 6bd20b44f6a..00000000000 --- a/src/plugins/autotest/catch/catchframework.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2019 Jochen Seemann -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "../itestframework.h" - -#include "catchtestsettings.h" - -namespace Autotest::Internal { - -class CatchFramework : public ITestFramework -{ -public: - CatchFramework() : ITestFramework(true) {} - - const char *name() const override; - QString displayName() const override; - unsigned priority() const override; - -protected: - ITestParser *createTestParser() override; - ITestTreeItem *createRootNode() override; - -private: - ITestSettings * testSettings() override { return &m_settings; } - CatchTestSettings m_settings{settingsId()}; -}; - -} // Autotest::Internal diff --git a/src/plugins/autotest/catch/catchtestparser.cpp b/src/plugins/autotest/catch/catchtestparser.cpp index a37f8b4ca73..172304eb953 100644 --- a/src/plugins/autotest/catch/catchtestparser.cpp +++ b/src/plugins/autotest/catch/catchtestparser.cpp @@ -4,7 +4,7 @@ #include "catchtestparser.h" #include "catchcodeparser.h" -#include "catchframework.h" +#include "catchtestsettings.h" #include "catchtreeitem.h" #include diff --git a/src/plugins/autotest/catch/catchtestsettings.cpp b/src/plugins/autotest/catch/catchtestsettings.cpp index 5ee4a6acf97..bdca7ae3b33 100644 --- a/src/plugins/autotest/catch/catchtestsettings.cpp +++ b/src/plugins/autotest/catch/catchtestsettings.cpp @@ -3,9 +3,14 @@ #include "catchtestsettings.h" +#include "catchtestparser.h" +#include "catchtreeitem.h" + #include "../autotestconstants.h" #include "../autotesttr.h" +#include + #include using namespace Layouting; @@ -13,11 +18,15 @@ using namespace Utils; namespace Autotest::Internal { -CatchTestSettings::CatchTestSettings(Id settingsId) +CatchFramework &theCatchFramework() +{ + static CatchFramework framework; + return framework; +} + +CatchFramework::CatchFramework() + : ITestFramework(true) { - setId(settingsId); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayName(Tr::tr("Catch Test")); setSettingsGroups("Autotest", "Catch2"); setLayouter([this] { @@ -107,4 +116,45 @@ CatchTestSettings::CatchTestSettings(Id settingsId) warnOnEmpty.setToolTip(Tr::tr("Warns if a test section does not check any assertion.")); } +const char *CatchFramework::name() const +{ + return "Catch"; +} + +QString CatchFramework::displayName() const +{ + return Tr::tr("Catch Test"); +} + +unsigned CatchFramework::priority() const +{ + return 12; +} + +ITestParser *CatchFramework::createTestParser() +{ + return new CatchTestParser(this); +} + +ITestTreeItem *CatchFramework::createRootNode() +{ + return new CatchTreeItem(this, displayName(), {}, ITestTreeItem::Root); +} + +// CatchTestSettingsPage + +class CatchTestSettingsPage final : public Core::IOptionsPage +{ +public: + CatchTestSettingsPage() + { + setId(Id(Constants::SETTINGSPAGE_PREFIX).withSuffix("12.Catch")); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayName(Tr::tr("Catch Test")); + setSettingsProvider([] { return &theCatchFramework(); }); + } +}; + +const CatchTestSettingsPage settingsPage; + } // Autotest::Internal diff --git a/src/plugins/autotest/catch/catchtestsettings.h b/src/plugins/autotest/catch/catchtestsettings.h index 71c1caf5839..225a99c849f 100644 --- a/src/plugins/autotest/catch/catchtestsettings.h +++ b/src/plugins/autotest/catch/catchtestsettings.h @@ -3,14 +3,14 @@ #pragma once -#include +#include "../itestframework.h" namespace Autotest::Internal { -class CatchTestSettings : public Core::PagedSettings +class CatchFramework : public ITestFramework { public: - explicit CatchTestSettings(Utils::Id settingsId); + CatchFramework(); Utils::IntegerAspect abortAfter{this}; Utils::IntegerAspect benchmarkSamples{this}; @@ -28,6 +28,16 @@ public: Utils::BoolAspect noThrow{this}; Utils::BoolAspect visibleWhitespace{this}; Utils::BoolAspect warnOnEmpty{this}; + + const char *name() const override; + QString displayName() const override; + unsigned priority() const override; + +protected: + ITestParser *createTestParser() override; + ITestTreeItem *createRootNode() override; }; +CatchFramework &theCatchFramework(); + } // Autotest::Internal diff --git a/src/plugins/autotest/ctest/ctestsettings.cpp b/src/plugins/autotest/ctest/ctestsettings.cpp index 70016f79209..aedf929eb84 100644 --- a/src/plugins/autotest/ctest/ctestsettings.cpp +++ b/src/plugins/autotest/ctest/ctestsettings.cpp @@ -3,9 +3,16 @@ #include "ctestsettings.h" +#include "ctesttreeitem.h" #include "../autotestconstants.h" #include "../autotesttr.h" +#include + +#include + +#include + #include using namespace Layouting; @@ -13,12 +20,16 @@ using namespace Utils; namespace Autotest::Internal { -CTestSettings::CTestSettings(Id settingsId) +CTestTool &theCTestTool() +{ + static CTestTool tool; + return tool; +} + +CTestTool::CTestTool() + : Autotest::ITestTool(false) { setSettingsGroups("Autotest", "CTest"); - setId(settingsId); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayName(Tr::tr("CTest")); setLayouter([this] { return Row { Form { @@ -97,7 +108,7 @@ CTestSettings::CTestSettings(Id settingsId) threshold.setEnabler(&testLoad); } -QStringList CTestSettings::activeSettingsAsOptions() const +QStringList CTestTool::activeSettingsAsOptions() const { QStringList options; if (outputOnFail.value()) @@ -133,4 +144,47 @@ QStringList CTestSettings::activeSettingsAsOptions() const return options; } +Id CTestTool::buildSystemId() const +{ + return Id(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); +} + +ITestTreeItem *CTestTool::createItemFromTestCaseInfo(const ProjectExplorer::TestCaseInfo &tci) +{ + CTestTreeItem *item = new CTestTreeItem(this, tci.name, tci.path, TestTreeItem::TestCase); + item->setLine(tci.line); + return item; +} + +const char *CTestTool::name() const +{ + return "CTest"; +} + +QString CTestTool::displayName() const +{ + return Tr::tr("CTest"); +} + +ITestTreeItem *CTestTool::createRootNode() +{ + return new CTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); +} + +// CTestToolSettingsPage + +class CTestToolSettingsPage final : public Core::IOptionsPage +{ +public: + CTestToolSettingsPage() + { + setId(Id(Constants::SETTINGSPAGE_PREFIX).withSuffix(QString("255.CTest"))); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayName(Tr::tr("CTest")); + setSettingsProvider([] { return &theCTestTool(); }); + } +}; + +const CTestToolSettingsPage settingsPage; + } // Autotest::Internal diff --git a/src/plugins/autotest/ctest/ctestsettings.h b/src/plugins/autotest/ctest/ctestsettings.h index 77de6b0aac8..1549a7db6e1 100644 --- a/src/plugins/autotest/ctest/ctestsettings.h +++ b/src/plugins/autotest/ctest/ctestsettings.h @@ -3,14 +3,23 @@ #pragma once -#include +#include "../itestframework.h" -namespace Autotest::Internal { +namespace Autotest::Internal { -class CTestSettings : public Core::PagedSettings +class CTestTool final : public Autotest::ITestTool { public: - explicit CTestSettings(Utils::Id settingsId); + CTestTool(); + + Utils::Id buildSystemId() const final; + + ITestTreeItem *createItemFromTestCaseInfo(const ProjectExplorer::TestCaseInfo &tci) final; + + const char *name() const final; + QString displayName() const final; + ITestTreeItem *createRootNode() final; + QStringList activeSettingsAsOptions() const; @@ -28,5 +37,7 @@ public: Utils::IntegerAspect threshold{this}; }; +CTestTool &theCTestTool(); + } // Autotest::Internal diff --git a/src/plugins/autotest/ctest/ctesttool.cpp b/src/plugins/autotest/ctest/ctesttool.cpp deleted file mode 100644 index fd2fe675282..00000000000 --- a/src/plugins/autotest/ctest/ctesttool.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "ctesttool.h" -#include "ctesttreeitem.h" -#include "../autotesttr.h" - -#include - -#include - -namespace Autotest { -namespace Internal { - -Utils::Id CTestTool::buildSystemId() const -{ - return Utils::Id(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); -} - -ITestTreeItem *CTestTool::createItemFromTestCaseInfo(const ProjectExplorer::TestCaseInfo &tci) -{ - CTestTreeItem *item = new CTestTreeItem(this, tci.name, tci.path, TestTreeItem::TestCase); - item->setLine(tci.line); - return item; -} - -const char *CTestTool::name() const -{ - return "CTest"; -} - -QString CTestTool::displayName() const -{ - return Tr::tr("CTest"); -} - -ITestTreeItem *CTestTool::createRootNode() -{ - return new CTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); -} - -} // namespace Internal -} // namespace Autotest diff --git a/src/plugins/autotest/ctest/ctesttool.h b/src/plugins/autotest/ctest/ctesttool.h deleted file mode 100644 index e7a7f74218a..00000000000 --- a/src/plugins/autotest/ctest/ctesttool.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "../itestframework.h" -#include "ctestsettings.h" - -namespace Autotest::Internal { - -class CTestTool final : public Autotest::ITestTool -{ -public: - CTestTool() : Autotest::ITestTool(false) {} - - Utils::Id buildSystemId() const final; - - ITestTreeItem *createItemFromTestCaseInfo(const ProjectExplorer::TestCaseInfo &tci) final; - -protected: - const char *name() const final; - QString displayName() const final; - ITestTreeItem *createRootNode() final; - -private: - ITestSettings *testSettings() override { return &m_settings; } - - CTestSettings m_settings{settingsId()}; -}; - -} // Autotest::Internal diff --git a/src/plugins/autotest/ctest/ctesttreeitem.cpp b/src/plugins/autotest/ctest/ctesttreeitem.cpp index d95838a5a79..8156d414eec 100644 --- a/src/plugins/autotest/ctest/ctesttreeitem.cpp +++ b/src/plugins/autotest/ctest/ctesttreeitem.cpp @@ -89,7 +89,7 @@ QList CTestTreeItem::testConfigurationsFor(const QStringLi const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem(); QStringList options{"--timeout", QString::number(testSettings().timeout() / 1000)}; - auto ctestSettings = static_cast(testBase()->testSettings()); + auto ctestSettings = static_cast(testBase()); options << ctestSettings->activeSettingsAsOptions(); CommandLine command = buildSystem->commandLineForTests(selected, options); if (command.executable().isEmpty()) diff --git a/src/plugins/autotest/gtest/gtestconfiguration.cpp b/src/plugins/autotest/gtest/gtestconfiguration.cpp index c2a6b4c0d08..3ce012c7b86 100644 --- a/src/plugins/autotest/gtest/gtestconfiguration.cpp +++ b/src/plugins/autotest/gtest/gtestconfiguration.cpp @@ -67,21 +67,19 @@ QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) con arguments << "--gtest_filter=\"" + testSets.join(':') + '"'; } - auto gSettings = static_cast(framework()->testSettings()); - if (!gSettings) - return arguments; + GTestFramework &gSettings = *static_cast(framework()); - if (gSettings->runDisabled.value()) + if (gSettings.runDisabled()) arguments << "--gtest_also_run_disabled_tests"; - if (gSettings->repeat.value()) - arguments << QString("--gtest_repeat=%1").arg(gSettings->iterations.value()); - if (gSettings->shuffle.value()) - arguments << "--gtest_shuffle" << QString("--gtest_random_seed=%1").arg(gSettings->seed.value()); - if (gSettings->throwOnFailure.value()) + if (gSettings.repeat()) + arguments << QString("--gtest_repeat=%1").arg(gSettings.iterations()); + if (gSettings.shuffle()) + arguments << "--gtest_shuffle" << QString("--gtest_random_seed=%1").arg(gSettings.seed()); + if (gSettings.throwOnFailure()) arguments << "--gtest_throw_on_failure"; if (isDebugRunMode()) { - if (gSettings->breakOnFailure.value()) + if (gSettings.breakOnFailure()) arguments << "--gtest_break_on_failure"; arguments << "--gtest_catch_exceptions=0"; } diff --git a/src/plugins/autotest/gtest/gtestframework.cpp b/src/plugins/autotest/gtest/gtestframework.cpp deleted file mode 100644 index af0a6eaa46c..00000000000 --- a/src/plugins/autotest/gtest/gtestframework.cpp +++ /dev/null @@ -1,75 +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 - -#include "gtestframework.h" - -#include "../autotesttr.h" -#include "gtesttreeitem.h" -#include "gtestparser.h" - -#include - -namespace Autotest { -namespace Internal { - -static GTestSettings *g_settings; - -GTestFramework::GTestFramework() - : ITestFramework(true) -{ - g_settings = &m_settings; -} - -ITestParser *GTestFramework::createTestParser() -{ - return new GTestParser(this); -} - -ITestTreeItem *GTestFramework::createRootNode() -{ - return new GTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); -} - -const char *GTestFramework::name() const -{ - return GTest::Constants::FRAMEWORK_NAME; -} - -QString GTestFramework:: displayName() const -{ - return Tr::tr(GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); -} - -unsigned GTestFramework::priority() const -{ - return GTest::Constants::FRAMEWORK_PRIORITY; -} - -QString GTestFramework::currentGTestFilter() -{ - return g_settings->gtestFilter.value(); -} - -QString GTestFramework::groupingToolTip() const -{ - return Tr::tr("Enable or disable grouping of test cases by folder or " - "GTest filter.\nSee also Google Test settings."); -} - -GTest::Constants::GroupMode GTestFramework::groupMode() -{ - return GTest::Constants::GroupMode(g_settings->groupMode.itemValue().toInt()); -} - -QStringList GTestFramework::testNameForSymbolName(const QString &symbolName) const -{ - static const QRegularExpression r("^(.+::)?((DISABLED_)?.+?)_((DISABLED_)?.+)_Test::TestBody$"); - const QRegularExpressionMatch match = r.match(symbolName); - if (!match.hasMatch()) - return {}; - - return { match.captured(2), match.captured(4) }; -} - -} // namespace Internal -} // namespace Autotest diff --git a/src/plugins/autotest/gtest/gtestframework.h b/src/plugins/autotest/gtest/gtestframework.h deleted file mode 100644 index 03c8a4fc0d9..00000000000 --- a/src/plugins/autotest/gtest/gtestframework.h +++ /dev/null @@ -1,33 +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 "../itestframework.h" -#include "gtestconstants.h" -#include "gtestsettings.h" - -namespace Autotest::Internal { - -class GTestFramework : public ITestFramework -{ -public: - GTestFramework(); - - static GTest::Constants::GroupMode groupMode(); - static QString currentGTestFilter(); - - QStringList testNameForSymbolName(const QString &symbolName) const override; -private: - const char *name() const override; - QString displayName() const override; - unsigned priority() const override; - QString groupingToolTip() const override; - ITestSettings *testSettings() override { return &m_settings; } - ITestParser *createTestParser() override; - ITestTreeItem *createRootNode() override; - - GTestSettings m_settings{settingsId()}; -}; - -} // Autotest::Internal diff --git a/src/plugins/autotest/gtest/gtestsettings.cpp b/src/plugins/autotest/gtest/gtestsettings.cpp index a97515b8d23..1d79a5b40df 100644 --- a/src/plugins/autotest/gtest/gtestsettings.cpp +++ b/src/plugins/autotest/gtest/gtestsettings.cpp @@ -4,11 +4,17 @@ #include "gtestsettings.h" #include "gtest_utils.h" +#include "gtesttreeitem.h" +#include "gtestparser.h" #include "gtestconstants.h" #include "../autotestconstants.h" #include "../autotesttr.h" #include "../testtreemodel.h" +#include + +#include + #include using namespace Layouting; @@ -16,12 +22,16 @@ using namespace Utils; namespace Autotest::Internal { -GTestSettings::GTestSettings(Id settingsId) +GTestFramework &theGTestFramework() +{ + static GTestFramework framework; + return framework; +} + +GTestFramework::GTestFramework() + : ITestFramework(true) { setSettingsGroups("Autotest", "GTest"); - setId(settingsId); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayName(Tr::tr(GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); setLayouter([this] { return Row { Form { @@ -112,15 +122,83 @@ GTestSettings::GTestSettings(Id settingsId) return edit && GTestUtils::isValidGTestFilter(edit->text()); }); - QObject::connect(&groupMode, &SelectionAspect::volatileValueChanged, >estFilter, [this] { + connect(&groupMode, &SelectionAspect::volatileValueChanged, >estFilter, [this] { gtestFilter.setEnabled(groupMode.itemValueForIndex(groupMode.volatileValue()) == GTest::Constants::GTestFilter); }); - - QObject::connect(this, &AspectContainer::applied, this, [] { + connect(this, &AspectContainer::applied, this, [] { Id id = Id(Constants::FRAMEWORK_PREFIX).withSuffix(GTest::Constants::FRAMEWORK_NAME); TestTreeModel::instance()->rebuild({id}); }); } +ITestParser *GTestFramework::createTestParser() +{ + return new GTestParser(this); +} + +ITestTreeItem *GTestFramework::createRootNode() +{ + return new GTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); +} + +const char *GTestFramework::name() const +{ + return GTest::Constants::FRAMEWORK_NAME; +} + +QString GTestFramework::displayName() const +{ + return Tr::tr(GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); +} + +unsigned GTestFramework::priority() const +{ + return GTest::Constants::FRAMEWORK_PRIORITY; +} + +QString GTestFramework::currentGTestFilter() +{ + return theGTestFramework().gtestFilter(); +} + +QString GTestFramework::groupingToolTip() const +{ + return Tr::tr("Enable or disable grouping of test cases by folder or " + "GTest filter.\nSee also Google Test settings."); +} + +GTest::Constants::GroupMode GTestFramework::staticGroupMode() +{ + return GTest::Constants::GroupMode(theGTestFramework().groupMode.itemValue().toInt()); +} + +QStringList GTestFramework::testNameForSymbolName(const QString &symbolName) const +{ + static const QRegularExpression r("^(.+::)?((DISABLED_)?.+?)_((DISABLED_)?.+)_Test::TestBody$"); + const QRegularExpressionMatch match = r.match(symbolName); + if (!match.hasMatch()) + return {}; + + return { match.captured(2), match.captured(4) }; +} + +// GTestSettingPage + +class GTestSettingsPage final : public Core::IOptionsPage +{ +public: + GTestSettingsPage() + { + setId(Id(Constants::SETTINGSPAGE_PREFIX).withSuffix(QString("%1.%2") + .arg(GTest::Constants::FRAMEWORK_PRIORITY) + .arg(GTest::Constants::FRAMEWORK_NAME))); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayName(Tr::tr(GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); + setSettingsProvider([] { return &theGTestFramework(); }); + } +}; + +const GTestSettingsPage settingsPage; + } // Autotest::Internal diff --git a/src/plugins/autotest/gtest/gtestsettings.h b/src/plugins/autotest/gtest/gtestsettings.h index ea0ab565e6c..720a3d9a5b5 100644 --- a/src/plugins/autotest/gtest/gtestsettings.h +++ b/src/plugins/autotest/gtest/gtestsettings.h @@ -3,14 +3,16 @@ #pragma once -#include +#include "../itestframework.h" + +#include "gtestconstants.h" namespace Autotest::Internal { -class GTestSettings : public Core::PagedSettings +class GTestFramework : public ITestFramework { public: - explicit GTestSettings(Utils::Id settingsId); + GTestFramework(); Utils::IntegerAspect iterations{this}; Utils::IntegerAspect seed{this}; @@ -21,6 +23,20 @@ public: Utils::BoolAspect breakOnFailure{this}; Utils::SelectionAspect groupMode{this}; Utils::StringAspect gtestFilter{this}; + + static GTest::Constants::GroupMode staticGroupMode(); + static QString currentGTestFilter(); + + QStringList testNameForSymbolName(const QString &symbolName) const override; + + const char *name() const override; + QString displayName() const override; + unsigned priority() const override; + QString groupingToolTip() const override; + ITestParser *createTestParser() override; + ITestTreeItem *createRootNode() override; }; +GTestFramework &theGTestFramework(); + } // Autotest::Internal diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp index f91b68f0e38..ddeb8b8c4bf 100644 --- a/src/plugins/autotest/gtest/gtesttreeitem.cpp +++ b/src/plugins/autotest/gtest/gtesttreeitem.cpp @@ -5,7 +5,7 @@ #include "gtestconfiguration.h" #include "gtestconstants.h" -#include "gtestframework.h" +#include "gtestsettings.h" #include "gtestparser.h" #include "../autotesttr.h" @@ -113,7 +113,7 @@ QVariant GTestTreeItem::data(int column, int role) const } case Qt::DecorationRole: if (type() == GroupNode - && GTestFramework::groupMode() == GTest::Constants::GTestFilter) { + && GTestFramework::staticGroupMode() == GTest::Constants::GTestFilter) { static const QIcon filterIcon = Icon({{":/utils/images/filtericon.png", Theme::PanelTextColorMid}}).icon(); return filterIcon; @@ -121,7 +121,7 @@ QVariant GTestTreeItem::data(int column, int role) const break; case Qt::ToolTipRole: if (type() == GroupNode - && GTestFramework::groupMode() == GTest::Constants::GTestFilter) { + && GTestFramework::staticGroupMode() == GTest::Constants::GTestFilter) { const auto tpl = QString("

%1

%2

").arg(filePath().toString()); return tpl.arg(Tr::tr("Change GTest filter in use inside the settings.")); } @@ -361,7 +361,7 @@ TestTreeItem *GTestTreeItem::find(const TestParseResult *result) switch (type()) { case Root: if (result->framework->grouping()) { - if (GTestFramework::groupMode() == GTest::Constants::Directory) { + if (GTestFramework::staticGroupMode() == GTest::Constants::Directory) { const FilePath base = parseResult->fileName.absolutePath(); for (int row = 0; row < childCount(); ++row) { GTestTreeItem *group = static_cast(childAt(row)); @@ -445,7 +445,7 @@ bool GTestTreeItem::modify(const TestParseResult *result) TestTreeItem *GTestTreeItem::createParentGroupNode() const { - if (GTestFramework::groupMode() == GTest::Constants::Directory) { + if (GTestFramework::staticGroupMode() == GTest::Constants::Directory) { const FilePath &absPath = filePath().absolutePath(); return new GTestTreeItem(framework(), absPath.baseName(), absPath, TestTreeItem::GroupNode); } else { // GTestFilter @@ -531,7 +531,7 @@ bool GTestTreeItem::isGroupNodeFor(const TestTreeItem *other) const if (type() != TestTreeItem::GroupNode) return false; - if (GTestFramework::groupMode() == GTest::Constants::Directory) { + if (GTestFramework::staticGroupMode() == GTest::Constants::Directory) { return other->filePath().absolutePath() == filePath(); } else { // GTestFilter QString fullName; @@ -566,7 +566,7 @@ TestTreeItem *GTestTreeItem::applyFilters() if (type() != TestSuite) return nullptr; - if (GTestFramework::groupMode() != GTest::Constants::GTestFilter) + if (GTestFramework::staticGroupMode() != GTest::Constants::GTestFilter) return nullptr; const QString gtestFilter = GTestFramework::currentGTestFilter(); diff --git a/src/plugins/autotest/itestframework.cpp b/src/plugins/autotest/itestframework.cpp index 0f1919b2af8..f8ccd8e85d3 100644 --- a/src/plugins/autotest/itestframework.cpp +++ b/src/plugins/autotest/itestframework.cpp @@ -17,12 +17,6 @@ ITestBase::ITestBase(bool activeByDefault, const ITestBase::TestBaseType type) , m_type(type) {} -Id ITestBase::settingsId() const -{ - return Id(Constants::SETTINGSPAGE_PREFIX) - .withSuffix(QString("%1.%2").arg(priority()).arg(QLatin1String(name()))); -} - Id ITestBase::id() const { return Id(Constants::FRAMEWORK_PREFIX).withSuffix(name()); @@ -41,7 +35,9 @@ void ITestBase::resetRootNode() ITestFramework::ITestFramework(bool activeByDefault) : ITestBase(activeByDefault, ITestBase::Framework) -{} +{ + setAutoApply(false); +} ITestFramework::~ITestFramework() { diff --git a/src/plugins/autotest/itestframework.h b/src/plugins/autotest/itestframework.h index d7a4d7927da..5621d9d8377 100644 --- a/src/plugins/autotest/itestframework.h +++ b/src/plugins/autotest/itestframework.h @@ -3,6 +3,7 @@ #pragma once +#include #include namespace ProjectExplorer { struct TestCaseInfo; } @@ -12,12 +13,11 @@ namespace Autotest { class ITestFramework; class ITestParser; -using ITestSettings = Utils::AspectContainer; class ITestTool; class ITestTreeItem; class TestTreeItem; -class ITestBase +class ITestBase : public Utils::AspectContainer { public: enum TestBaseType @@ -35,9 +35,6 @@ public: virtual unsigned priority() const = 0; // should this be modifyable? TestBaseType type() const { return m_type; } - virtual ITestSettings *testSettings() { return nullptr; } - - Utils::Id settingsId() const; Utils::Id id() const; bool active() const { return m_active; } diff --git a/src/plugins/autotest/qtest/qttestconfiguration.cpp b/src/plugins/autotest/qtest/qttestconfiguration.cpp index 9648e69d547..02972c33fac 100644 --- a/src/plugins/autotest/qtest/qttestconfiguration.cpp +++ b/src/plugins/autotest/qtest/qttestconfiguration.cpp @@ -29,8 +29,8 @@ static QStringList quoteIfNeeded(const QStringList &testCases, bool debugMode) TestOutputReader *QtTestConfiguration::createOutputReader(Process *app) const { - auto qtSettings = static_cast(framework()->testSettings()); - const QtTestOutputReader::OutputMode mode = qtSettings && qtSettings->useXMLOutput.value() + QtTestFramework &qtSettings = *static_cast(framework()); + const QtTestOutputReader::OutputMode mode = qtSettings.useXMLOutput() ? QtTestOutputReader::XML : QtTestOutputReader::PlainText; return new QtTestOutputReader(app, buildDirectory(), projectFile(), mode, TestType::QtTest); @@ -44,29 +44,27 @@ QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) co runnable().command.arguments().split(' ', Qt::SkipEmptyParts), omitted, false)); } - auto qtSettings = static_cast(framework()->testSettings()); - if (!qtSettings) - return arguments; - if (qtSettings->useXMLOutput.value()) + QtTestFramework &qtSettings = *static_cast(framework()); + if (qtSettings.useXMLOutput()) arguments << "-xml"; if (!testCases().isEmpty()) arguments << quoteIfNeeded(testCases(), isDebugRunMode()); - const QString &metricsOption = QtTestSettings::metricsTypeToOption(MetricsType(qtSettings->metrics.value())); + const QString metricsOption = QtTestFramework::metricsTypeToOption(MetricsType(qtSettings.metrics())); if (!metricsOption.isEmpty()) arguments << metricsOption; - if (qtSettings->verboseBench.value()) + if (qtSettings.verboseBench()) arguments << "-vb"; - if (qtSettings->logSignalsSlots.value()) + if (qtSettings.logSignalsSlots()) arguments << "-vs"; - if (isDebugRunMode() && qtSettings->noCrashHandler.value()) + if (isDebugRunMode() && qtSettings.noCrashHandler()) arguments << "-nocrashhandler"; - if (qtSettings->limitWarnings.value() && qtSettings->maxWarnings.value() != 2000) - arguments << "-maxwarnings" << QString::number(qtSettings->maxWarnings.value()); + if (qtSettings.limitWarnings() && qtSettings.maxWarnings() != 2000) + arguments << "-maxwarnings" << QString::number(qtSettings.maxWarnings()); return arguments; } diff --git a/src/plugins/autotest/qtest/qttestframework.cpp b/src/plugins/autotest/qtest/qttestframework.cpp deleted file mode 100644 index d13470c8569..00000000000 --- a/src/plugins/autotest/qtest/qttestframework.cpp +++ /dev/null @@ -1,48 +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 - -#include "qttestframework.h" - -#include "qttestconstants.h" -#include "qttestparser.h" -#include "qttesttreeitem.h" -#include "../autotesttr.h" - -namespace Autotest { -namespace Internal { - -ITestParser *QtTestFramework::createTestParser() -{ - return new QtTestParser(this); -} - -ITestTreeItem *QtTestFramework::createRootNode() -{ - return new QtTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); -} - -const char *QtTestFramework::name() const -{ - return QtTest::Constants::FRAMEWORK_NAME; -} - -QString QtTestFramework::displayName() const -{ - return Tr::tr(QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); -} - -unsigned QtTestFramework::priority() const -{ - return QtTest::Constants::FRAMEWORK_PRIORITY; -} - -QStringList QtTestFramework::testNameForSymbolName(const QString &symbolName) const -{ - int index = symbolName.lastIndexOf("::"); - if (index == -1) - return {}; - return { symbolName.left(index), symbolName.mid(index + 2) }; -} - -} // namespace Internal -} // namespace Autotest diff --git a/src/plugins/autotest/qtest/qttestframework.h b/src/plugins/autotest/qtest/qttestframework.h deleted file mode 100644 index c90bd3c9d8c..00000000000 --- a/src/plugins/autotest/qtest/qttestframework.h +++ /dev/null @@ -1,29 +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 "../itestframework.h" - -#include "qttestsettings.h" - -namespace Autotest::Internal { - -class QtTestFramework : public ITestFramework -{ -public: - QtTestFramework() : ITestFramework(true) {} - - QStringList testNameForSymbolName(const QString &symbolName) const override; -private: - const char *name() const override; - QString displayName() const override; - unsigned priority() const override; - ITestParser *createTestParser() override; - ITestTreeItem *createRootNode() override; - ITestSettings *testSettings() override { return &m_settings; } - - QtTestSettings m_settings{settingsId()}; -}; - -} // Autotest::Internal diff --git a/src/plugins/autotest/qtest/qttestsettings.cpp b/src/plugins/autotest/qtest/qttestsettings.cpp index a8953a04492..78239e7f76e 100644 --- a/src/plugins/autotest/qtest/qttestsettings.cpp +++ b/src/plugins/autotest/qtest/qttestsettings.cpp @@ -6,6 +6,10 @@ #include "../autotestconstants.h" #include "../autotesttr.h" #include "qttestconstants.h" +#include "qttestparser.h" +#include "qttesttreeitem.h" + +#include #include #include @@ -15,12 +19,15 @@ using namespace Utils; namespace Autotest::Internal { -QtTestSettings::QtTestSettings(Id settingsId) +QtTestFramework &theQtTestFramework() +{ + static QtTestFramework framework; + return framework; +} + +QtTestFramework::QtTestFramework() : ITestFramework(true) { setSettingsGroups("Autotest", "QtTest"); - setId(settingsId); - setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); - setDisplayName(Tr::tr(QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); setLayouter([this] { return Row { Form { @@ -91,7 +98,7 @@ QtTestSettings::QtTestSettings(Id settingsId) "feature significantly increases scan time.")); } -QString QtTestSettings::metricsTypeToOption(const MetricsType type) +QString QtTestFramework::metricsTypeToOption(const MetricsType type) { switch (type) { case MetricsType::Walltime: @@ -108,4 +115,55 @@ QString QtTestSettings::metricsTypeToOption(const MetricsType type) return {}; } +ITestParser *QtTestFramework::createTestParser() +{ + return new QtTestParser(this); +} + +ITestTreeItem *QtTestFramework::createRootNode() +{ + return new QtTestTreeItem(this, displayName(), {}, ITestTreeItem::Root); +} + +const char *QtTestFramework::name() const +{ + return QtTest::Constants::FRAMEWORK_NAME; +} + +QString QtTestFramework::displayName() const +{ + return Tr::tr(QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY); +} + +unsigned QtTestFramework::priority() const +{ + return QtTest::Constants::FRAMEWORK_PRIORITY; +} + +QStringList QtTestFramework::testNameForSymbolName(const QString &symbolName) const +{ + int index = symbolName.lastIndexOf("::"); + if (index == -1) + return {}; + return { symbolName.left(index), symbolName.mid(index + 2) }; +} + +// QtTestSettingsPage + +class QtTestSettingPage final : public Core::IOptionsPage +{ +public: + QtTestSettingPage() + { + setId(Id(Constants::SETTINGSPAGE_PREFIX).withSuffix(QString("%1.%2") + .arg(QtTest::Constants::FRAMEWORK_PRIORITY) + .arg(QtTest::Constants::FRAMEWORK_NAME))); + setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); + setDisplayName(Tr::tr(QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY)); + setSettingsProvider([] { return &theQtTestFramework(); }); + } +}; + +const QtTestSettingPage settingsPage; + } // Autotest::Internal diff --git a/src/plugins/autotest/qtest/qttestsettings.h b/src/plugins/autotest/qtest/qttestsettings.h index 31394ee6027..f2dc1a4776a 100644 --- a/src/plugins/autotest/qtest/qttestsettings.h +++ b/src/plugins/autotest/qtest/qttestsettings.h @@ -3,7 +3,7 @@ #pragma once -#include +#include "../itestframework.h" namespace Autotest::Internal { @@ -16,10 +16,10 @@ enum MetricsType Perf }; -class QtTestSettings : public Core::PagedSettings +class QtTestFramework : public ITestFramework { public: - explicit QtTestSettings(Utils::Id settingsId); + QtTestFramework(); static QString metricsTypeToOption(const MetricsType type); @@ -31,6 +31,16 @@ public: Utils::BoolAspect limitWarnings{this}; Utils::IntegerAspect maxWarnings{this}; Utils::BoolAspect quickCheckForDerivedTests{this}; + + QStringList testNameForSymbolName(const QString &symbolName) const override; + + const char *name() const override; + QString displayName() const override; + unsigned priority() const override; + ITestParser *createTestParser() override; + ITestTreeItem *createRootNode() override; }; +QtTestFramework &theQtTestFramework(); + } // Autotest::Internal diff --git a/src/plugins/autotest/quick/quicktestconfiguration.cpp b/src/plugins/autotest/quick/quicktestconfiguration.cpp index f757dfb0255..b23a2d7a17d 100644 --- a/src/plugins/autotest/quick/quicktestconfiguration.cpp +++ b/src/plugins/autotest/quick/quicktestconfiguration.cpp @@ -22,8 +22,8 @@ QuickTestConfiguration::QuickTestConfiguration(ITestFramework *framework) TestOutputReader *QuickTestConfiguration::createOutputReader(Process *app) const { - auto qtSettings = static_cast(framework()->testSettings()); - const QtTestOutputReader::OutputMode mode = qtSettings && qtSettings->useXMLOutput.value() + QtTestFramework &qtSettings = *static_cast(framework()); + const QtTestOutputReader::OutputMode mode = qtSettings.useXMLOutput() ? QtTestOutputReader::XML : QtTestOutputReader::PlainText; return new QtTestOutputReader(app, buildDirectory(), projectFile(), mode, TestType::QuickTest); @@ -38,25 +38,23 @@ QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) omitted, true)); } - auto qtSettings = static_cast(framework()->testSettings()); - if (!qtSettings) - return arguments; - if (qtSettings->useXMLOutput.value()) + QtTestFramework &qtSettings = *static_cast(framework()); + if (qtSettings.useXMLOutput()) arguments << "-xml"; if (!testCases().isEmpty()) arguments << testCases(); - const QString &metricsOption = QtTestSettings::metricsTypeToOption(MetricsType(qtSettings->metrics.value())); + const QString &metricsOption = QtTestFramework::metricsTypeToOption(MetricsType(qtSettings.metrics())); if (!metricsOption.isEmpty()) arguments << metricsOption; if (isDebugRunMode()) { - if (qtSettings->noCrashHandler.value()) + if (qtSettings.noCrashHandler()) arguments << "-nocrashhandler"; } - if (qtSettings->limitWarnings.value() && qtSettings->maxWarnings.value() != 2000) - arguments << "-maxwarnings" << QString::number(qtSettings->maxWarnings.value()); + if (qtSettings.limitWarnings() && qtSettings.maxWarnings() != 2000) + arguments << "-maxwarnings" << QString::number(qtSettings.maxWarnings()); return arguments; } diff --git a/src/plugins/autotest/quick/quicktestframework.cpp b/src/plugins/autotest/quick/quicktestframework.cpp index a8289ad48e5..e1e70bb03ae 100644 --- a/src/plugins/autotest/quick/quicktestframework.cpp +++ b/src/plugins/autotest/quick/quicktestframework.cpp @@ -5,14 +5,17 @@ #include "quicktestparser.h" #include "quicktesttreeitem.h" -#include "../autotestconstants.h" #include "../autotesttr.h" -#include "../testframeworkmanager.h" -#include "../qtest/qttestconstants.h" namespace Autotest { namespace Internal { +QuickTestFramework &theQuickTestFramework() +{ + static QuickTestFramework framework; + return framework; +} + ITestParser *QuickTestFramework::createTestParser() { return new QuickTestParser(this); @@ -38,13 +41,5 @@ unsigned QuickTestFramework::priority() const return 5; } -ITestSettings *QuickTestFramework::testSettings() -{ - static const Utils::Id id - = Utils::Id(Constants::FRAMEWORK_PREFIX).withSuffix(QtTest::Constants::FRAMEWORK_NAME); - ITestFramework *qtTestFramework = TestFrameworkManager::frameworkForId(id); - return qtTestFramework->testSettings(); -} - } // namespace Internal } // namespace Autotest diff --git a/src/plugins/autotest/quick/quicktestframework.h b/src/plugins/autotest/quick/quicktestframework.h index 99c7eb0552a..fe3622b0e66 100644 --- a/src/plugins/autotest/quick/quicktestframework.h +++ b/src/plugins/autotest/quick/quicktestframework.h @@ -5,6 +5,8 @@ #include "../itestframework.h" +#include "../qtest/qttestsettings.h" + namespace Autotest { namespace QuickTest { namespace Constants { @@ -16,19 +18,20 @@ const char FRAMEWORK_NAME[] = "QtQuickTest"; namespace Internal { -class QuickTestFramework : public ITestFramework +class QuickTestFramework : public QtTestFramework { public: - QuickTestFramework() : ITestFramework(true) {} + QuickTestFramework() {} const char *name() const override; QString displayName() const override; unsigned priority() const override; - ITestSettings *testSettings() override; protected: ITestParser *createTestParser() override; ITestTreeItem *createRootNode() override; }; +QuickTestFramework &theQuickTestFramework(); + } // namespace Internal } // namespace Autotest diff --git a/src/plugins/autotest/quick/quicktestparser.cpp b/src/plugins/autotest/quick/quicktestparser.cpp index 4fa8d4fb81d..64b98e1aa28 100644 --- a/src/plugins/autotest/quick/quicktestparser.cpp +++ b/src/plugins/autotest/quick/quicktestparser.cpp @@ -356,8 +356,8 @@ void QuickTestParser::init(const QSet &filesToParse, bool fullParse) m_mainCppFiles.clear(); } - auto qtSettings = static_cast(framework()->testSettings()); - m_checkForDerivedTests = qtSettings->quickCheckForDerivedTests.value(); + QtTestFramework &qtSettings = *static_cast(framework()); + m_checkForDerivedTests = qtSettings.quickCheckForDerivedTests(); CppParser::init(filesToParse, fullParse); } diff --git a/src/plugins/autotest/testframeworkmanager.cpp b/src/plugins/autotest/testframeworkmanager.cpp index 26f455cf9b5..b9b61b79d11 100644 --- a/src/plugins/autotest/testframeworkmanager.cpp +++ b/src/plugins/autotest/testframeworkmanager.cpp @@ -22,8 +22,6 @@ TestFrameworkManager::TestFrameworkManager() TestFrameworkManager::~TestFrameworkManager() { - qDeleteAll(m_registeredFrameworks); - qDeleteAll(m_registeredTestTools); s_instance = nullptr; } @@ -96,14 +94,11 @@ ITestTool *TestFrameworkManager::testToolForBuildSystemId(Id buildSystemId) void TestFrameworkManager::synchronizeSettings() { Internal::testSettings().fromSettings(); - for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) { - if (ITestSettings *fSettings = framework->testSettings()) - fSettings->readSettings(); - } - for (ITestTool *testTool : std::as_const(m_registeredTestTools)) { - if (ITestSettings *tSettings = testTool->testSettings()) - tSettings->readSettings(); - } + for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) + framework->readSettings(); + + for (ITestTool *testTool : std::as_const(m_registeredTestTools)) + testTool->readSettings(); } } // namespace Autotest