diff options
author | hjk <hjk@qt.io> | 2023-05-12 11:00:00 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2023-05-12 14:54:24 +0000 |
commit | 30af7a9503c3848ac9cb35e1aebfc28d51f41d07 (patch) | |
tree | 84450067901dc259d05eb3050cedde001e187bb3 | |
parent | 4c1a161abd946b4bf51c6cc573728cf25f47876e (diff) | |
download | qt-creator-30af7a9503c3848ac9cb35e1aebfc28d51f41d07.tar.gz |
AutoTests: Aspectify parts of main settings
Change-Id: I407b5102e1f2a6647f6fdca01a61dfa422c5d3ee
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | src/plugins/autotest/autotestplugin.cpp | 7 | ||||
-rw-r--r-- | src/plugins/autotest/autotestplugin.h | 2 | ||||
-rw-r--r-- | src/plugins/autotest/boost/boosttestconfiguration.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/catch/catchconfiguration.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/ctest/ctesttreeitem.cpp | 2 | ||||
-rw-r--r-- | src/plugins/autotest/gtest/gtestconfiguration.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/qtest/qttest_utils.cpp | 5 | ||||
-rw-r--r-- | src/plugins/autotest/qtest/qttestconfiguration.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/quick/quicktestconfiguration.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/testframeworkmanager.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/testresultdelegate.cpp | 7 | ||||
-rw-r--r-- | src/plugins/autotest/testresultmodel.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/testresultspane.cpp | 8 | ||||
-rw-r--r-- | src/plugins/autotest/testrunner.cpp | 12 | ||||
-rw-r--r-- | src/plugins/autotest/testsettings.cpp | 159 | ||||
-rw-r--r-- | src/plugins/autotest/testsettings.h | 61 | ||||
-rw-r--r-- | src/plugins/autotest/testsettingspage.cpp | 181 | ||||
-rw-r--r-- | src/plugins/autotest/testsettingspage.h | 4 |
18 files changed, 206 insertions, 263 deletions
diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index 28475f3870..d6bfc6f9a8 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -96,7 +96,7 @@ public: void onRunUnderCursorTriggered(TestRunMode mode); TestSettings m_settings; - TestSettingsPage m_testSettingPage{&m_settings}; + TestSettingsPage m_testSettingPage; TestCodeParser m_testCodeParser; TestTreeModel m_testTreeModel{&m_testCodeParser}; @@ -178,11 +178,6 @@ AutotestPluginPrivate::~AutotestPluginPrivate() delete m_resultsPane; } -TestSettings *AutotestPlugin::settings() -{ - return &dd->m_settings; -} - TestProjectSettings *AutotestPlugin::projectSettings(ProjectExplorer::Project *project) { auto &settings = s_projectSettings[project]; diff --git a/src/plugins/autotest/autotestplugin.h b/src/plugins/autotest/autotestplugin.h index 8705a8a538..e6daa0c739 100644 --- a/src/plugins/autotest/autotestplugin.h +++ b/src/plugins/autotest/autotestplugin.h @@ -18,7 +18,6 @@ namespace Autotest { namespace Internal { class TestProjectSettings; -struct TestSettings; struct ChoicePair { @@ -43,7 +42,6 @@ public: void extensionsInitialized() override; ShutdownFlag aboutToShutdown() override; - static TestSettings *settings(); static TestProjectSettings *projectSettings(ProjectExplorer::Project *project); static TestFrameworks activeTestFrameworks(); static void updateMenuItemsEnabledState(); diff --git a/src/plugins/autotest/boost/boosttestconfiguration.cpp b/src/plugins/autotest/boost/boosttestconfiguration.cpp index 1df0bd6776..e581cff50e 100644 --- a/src/plugins/autotest/boost/boosttestconfiguration.cpp +++ b/src/plugins/autotest/boost/boosttestconfiguration.cpp @@ -6,7 +6,6 @@ #include "boosttestoutputreader.h" #include "boosttestsettings.h" -#include "../autotestplugin.h" #include "../itestframework.h" #include "../testsettings.h" @@ -106,7 +105,7 @@ QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted) for (const QString &test : testCases()) arguments << "-t" << test; - if (AutotestPlugin::settings()->processArgs) { + if (TestSettings::instance()->processArgs()) { arguments << filterInterfering(runnable().command.arguments().split( ' ', Qt::SkipEmptyParts), omitted); } diff --git a/src/plugins/autotest/catch/catchconfiguration.cpp b/src/plugins/autotest/catch/catchconfiguration.cpp index 88f590d352..a503639868 100644 --- a/src/plugins/autotest/catch/catchconfiguration.cpp +++ b/src/plugins/autotest/catch/catchconfiguration.cpp @@ -6,7 +6,6 @@ #include "catchoutputreader.h" #include "catchtestsettings.h" -#include "../autotestplugin.h" #include "../itestframework.h" #include "../testsettings.h" @@ -80,7 +79,7 @@ QStringList CatchConfiguration::argumentsForTestRunner(QStringList *omitted) con arguments << "\"" + testCases().join("\", \"") + "\""; arguments << "--reporter" << "xml"; - if (AutotestPlugin::settings()->processArgs) { + if (TestSettings::instance()->processArgs()) { arguments << filterInterfering(runnable().command.arguments().split( ' ', Qt::SkipEmptyParts), omitted); } diff --git a/src/plugins/autotest/ctest/ctesttreeitem.cpp b/src/plugins/autotest/ctest/ctesttreeitem.cpp index dac1b6da00..9ffc06b028 100644 --- a/src/plugins/autotest/ctest/ctesttreeitem.cpp +++ b/src/plugins/autotest/ctest/ctesttreeitem.cpp @@ -88,7 +88,7 @@ QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringLi return {}; const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem(); - QStringList options{"--timeout", QString::number(AutotestPlugin::settings()->timeout / 1000)}; + QStringList options{"--timeout", QString::number(TestSettings::instance()->timeout() / 1000)}; auto ctestSettings = static_cast<CTestSettings *>(testBase()->testSettings()); options << ctestSettings->activeSettingsAsOptions(); CommandLine command = buildSystem->commandLineForTests(selected, options); diff --git a/src/plugins/autotest/gtest/gtestconfiguration.cpp b/src/plugins/autotest/gtest/gtestconfiguration.cpp index 32e590ccb5..8680da1fca 100644 --- a/src/plugins/autotest/gtest/gtestconfiguration.cpp +++ b/src/plugins/autotest/gtest/gtestconfiguration.cpp @@ -6,7 +6,6 @@ #include "gtestoutputreader.h" #include "gtestsettings.h" -#include "../autotestplugin.h" #include "../itestframework.h" #include "../testsettings.h" @@ -55,7 +54,7 @@ QStringList filterInterfering(const QStringList &provided, QStringList *omitted) QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) const { QStringList arguments; - if (AutotestPlugin::settings()->processArgs) { + if (TestSettings::instance()->processArgs()) { arguments << filterInterfering(runnable().command.arguments().split( ' ', Qt::SkipEmptyParts), omitted); } diff --git a/src/plugins/autotest/qtest/qttest_utils.cpp b/src/plugins/autotest/qtest/qttest_utils.cpp index ab6048da08..9bedaa64c3 100644 --- a/src/plugins/autotest/qtest/qttest_utils.cpp +++ b/src/plugins/autotest/qtest/qttest_utils.cpp @@ -2,8 +2,9 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "qttest_utils.h" + #include "qttesttreeitem.h" -#include "../autotestplugin.h" +#include "../itestframework.h" #include "../testsettings.h" #include <utils/algorithm.h> @@ -136,7 +137,7 @@ Environment prepareBasicEnvironment(const Environment &env) result.set("QT_FORCE_STDERR_LOGGING", "1"); result.set("QT_LOGGING_TO_CONSOLE", "1"); } - const int timeout = AutotestPlugin::settings()->timeout; + const int timeout = TestSettings::instance()->timeout(); if (timeout > 5 * 60 * 1000) // Qt5.5 introduced hard limit, Qt5.6.1 added env var to raise this result.set("QTEST_FUNCTION_TIMEOUT", QString::number(timeout)); return result; diff --git a/src/plugins/autotest/qtest/qttestconfiguration.cpp b/src/plugins/autotest/qtest/qttestconfiguration.cpp index 37da244cc9..5dcf59a48e 100644 --- a/src/plugins/autotest/qtest/qttestconfiguration.cpp +++ b/src/plugins/autotest/qtest/qttestconfiguration.cpp @@ -7,7 +7,6 @@ #include "qttestsettings.h" #include "qttest_utils.h" -#include "../autotestplugin.h" #include "../itestframework.h" #include "../testsettings.h" @@ -40,7 +39,7 @@ TestOutputReader *QtTestConfiguration::createOutputReader(Process *app) const QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) const { QStringList arguments; - if (AutotestPlugin::settings()->processArgs) { + if (TestSettings::instance()->processArgs()) { arguments.append(QTestUtils::filterInterfering( runnable().command.arguments().split(' ', Qt::SkipEmptyParts), omitted, false)); diff --git a/src/plugins/autotest/quick/quicktestconfiguration.cpp b/src/plugins/autotest/quick/quicktestconfiguration.cpp index cf316ca489..e37b208ac4 100644 --- a/src/plugins/autotest/quick/quicktestconfiguration.cpp +++ b/src/plugins/autotest/quick/quicktestconfiguration.cpp @@ -3,7 +3,6 @@ #include "quicktestconfiguration.h" -#include "../autotestplugin.h" #include "../itestframework.h" #include "../qtest/qttestoutputreader.h" #include "../qtest/qttestsettings.h" @@ -33,7 +32,7 @@ TestOutputReader *QuickTestConfiguration::createOutputReader(Process *app) const QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) const { QStringList arguments; - if (AutotestPlugin::settings()->processArgs) { + if (TestSettings::instance()->processArgs()) { arguments.append(QTestUtils::filterInterfering (runnable().command.arguments().split(' ', Qt::SkipEmptyParts), omitted, true)); diff --git a/src/plugins/autotest/testframeworkmanager.cpp b/src/plugins/autotest/testframeworkmanager.cpp index 91fa313593..3c6aff581d 100644 --- a/src/plugins/autotest/testframeworkmanager.cpp +++ b/src/plugins/autotest/testframeworkmanager.cpp @@ -3,7 +3,6 @@ #include "testframeworkmanager.h" -#include "autotestplugin.h" #include "testsettings.h" #include <utils/aspects.h> @@ -98,7 +97,7 @@ ITestTool *TestFrameworkManager::testToolForBuildSystemId(Id buildSystemId) void TestFrameworkManager::synchronizeSettings(QSettings *s) { - Internal::AutotestPlugin::settings()->fromSettings(s); + Internal::TestSettings::instance()->fromSettings(s); for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) { if (ITestSettings *fSettings = framework->testSettings()) fSettings->readSettings(s); diff --git a/src/plugins/autotest/testresultdelegate.cpp b/src/plugins/autotest/testresultdelegate.cpp index 9b55623d57..c14b6c1703 100644 --- a/src/plugins/autotest/testresultdelegate.cpp +++ b/src/plugins/autotest/testresultdelegate.cpp @@ -3,7 +3,6 @@ #include "testresultdelegate.h" -#include "autotestplugin.h" #include "testresultmodel.h" #include "testsettings.h" @@ -162,10 +161,10 @@ void TestResultDelegate::clearCache() void TestResultDelegate::limitTextOutput(QString &output) const { - int maxLineCount = Internal::AutotestPlugin::settings()->resultDescriptionMaxSize; + int maxLineCount = Internal::TestSettings::instance()->resultDescriptionMaxSize(); bool limited = false; - if (Internal::AutotestPlugin::settings()->limitResultDescription && maxLineCount > 0) { + if (Internal::TestSettings::instance()->limitResultDescription() && maxLineCount > 0) { int index = -1; int lastChar = output.size() - 1; @@ -183,7 +182,7 @@ void TestResultDelegate::limitTextOutput(QString &output) const } } - if (AutotestPlugin::settings()->limitResultOutput && output.length() > outputLimit) { + if (TestSettings::instance()->limitResultOutput() && output.length() > outputLimit) { output = output.left(outputLimit); limited = true; } diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index 434d647410..f686692faa 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -4,7 +4,6 @@ #include "testresultmodel.h" #include "autotesticons.h" -#include "autotestplugin.h" #include "testrunner.h" #include "testsettings.h" #include "testtreeitem.h" @@ -274,7 +273,7 @@ void TestResultModel::addTestResult(const TestResult &testResult, bool autoExpan TestResultItem *newItem = new TestResultItem(testResult); TestResultItem *root = nullptr; - if (AutotestPlugin::settings()->displayApplication) { + if (TestSettings::instance()->displayApplication()) { const QString application = testResult.id(); if (!application.isEmpty()) { root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) { diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index 8997f43d1d..3dbad31ea9 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -291,7 +291,7 @@ void TestResultsPane::clearContents() setIconBadgeNumber(0); navigateStateChanged(); m_summaryWidget->setVisible(false); - m_autoScroll = AutotestPlugin::settings()->autoScroll; + m_autoScroll = TestSettings::instance()->autoScroll(); connect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, this, &TestResultsPane::onScrollBarRangeChanged, Qt::UniqueConnection); m_textOutput->clear(); @@ -437,7 +437,7 @@ void TestResultsPane::onRunSelectedTriggered() void TestResultsPane::initializeFilterMenu() { - const bool omitIntern = AutotestPlugin::settings()->omitInternalMssg; + const bool omitIntern = TestSettings::instance()->omitInternalMsg(); // FilterModel has all messages enabled by default if (omitIntern) m_filterModel->toggleTestResultType(ResultType::MessageInternal); @@ -553,8 +553,8 @@ void TestResultsPane::onTestRunFinished() m_model->removeCurrentTestMessage(); disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, this, &TestResultsPane::onScrollBarRangeChanged); - if (AutotestPlugin::settings()->popupOnFinish - && (!AutotestPlugin::settings()->popupOnFail || hasFailedTests(m_model))) { + if (TestSettings::instance()->popupOnFinish() + && (!TestSettings::instance()->popupOnFail() || hasFailedTests(m_model))) { popup(IOutputPane::NoModeSwitch); } createMarks(); diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index 631b76aca1..68dddaf951 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -258,7 +258,7 @@ static RunConfiguration *getRunConfiguration(const QString &buildTargetKey) int TestRunner::precheckTestConfigurations() { - const bool omitWarnings = AutotestPlugin::settings()->omitRunConfigWarn; + const bool omitWarnings = TestSettings::instance()->omitRunConfigWarn(); int testCaseCount = 0; for (ITestConfiguration *itc : std::as_const(m_selectedTests)) { if (itc->testBase()->type() == ITestBase::Tool) { @@ -402,7 +402,7 @@ void TestRunner::runTestsHelper() } process.setEnvironment(environment); - m_cancelTimer.setInterval(AutotestPlugin::settings()->timeout); + m_cancelTimer.setInterval(TestSettings::instance()->timeout()); m_cancelTimer.start(); qCInfo(runnerLog) << "Command:" << process.commandLine().executable(); @@ -465,7 +465,7 @@ void TestRunner::runTestsHelper() cancelCurrent(UserCanceled); }); - if (AutotestPlugin::settings()->popupOnStart) + if (TestSettings::instance()->popupOnStart()) AutotestPlugin::popupResultsPane(); m_taskTree->start(); @@ -588,7 +588,7 @@ void TestRunner::debugTests() connect(runControl, &RunControl::stopped, this, &TestRunner::onFinished); m_finishDebugConnect = connect(runControl, &RunControl::finished, this, &TestRunner::onFinished); ProjectExplorerPlugin::startRunControl(runControl); - if (useOutputProcessor && AutotestPlugin::settings()->popupOnStart) + if (useOutputProcessor && TestSettings::instance()->popupOnStart()) AutotestPlugin::popupResultsPane(); } @@ -669,10 +669,10 @@ static RunAfterBuildMode runAfterBuild() return RunAfterBuildMode::None; if (!project->namedSettings(Constants::SK_USE_GLOBAL).isValid()) - return AutotestPlugin::settings()->runAfterBuild; + return TestSettings::instance()->runAfterBuildMode(); TestProjectSettings *projectSettings = AutotestPlugin::projectSettings(project); - return projectSettings->useGlobalSettings() ? AutotestPlugin::settings()->runAfterBuild + return projectSettings->useGlobalSettings() ? TestSettings::instance()->runAfterBuildMode() : projectSettings->runAfterBuild(); } diff --git a/src/plugins/autotest/testsettings.cpp b/src/plugins/autotest/testsettings.cpp index 6de76d815f..001bf7fe07 100644 --- a/src/plugins/autotest/testsettings.cpp +++ b/src/plugins/autotest/testsettings.cpp @@ -4,53 +4,123 @@ #include "testsettings.h" #include "autotestconstants.h" +#include "autotesttr.h" #include "testframeworkmanager.h" -#include <utils/id.h> - #include <QSettings> -namespace Autotest { -namespace Internal { - -static const char timeoutKey[] = "Timeout"; -static const char omitInternalKey[] = "OmitInternal"; -static const char omitRunConfigWarnKey[] = "OmitRCWarnings"; -static const char limitResultOutputKey[] = "LimitResultOutput"; -static const char limitResultDescriptionKey[] = "LimitResultDescription"; -static const char resultDescriptionMaxSizeKey[] = "ResultDescriptionMaxSize"; -static const char autoScrollKey[] = "AutoScrollResults"; -static const char processArgsKey[] = "ProcessArgs"; -static const char displayApplicationKey[] = "DisplayApp"; -static const char popupOnStartKey[] = "PopupOnStart"; -static const char popupOnFinishKey[] = "PopupOnFinish"; -static const char popupOnFailKey[] = "PopupOnFail"; -static const char runAfterBuildKey[] = "RunAfterBuild"; +namespace Autotest::Internal { + static const char groupSuffix[] = ".group"; constexpr int defaultTimeout = 60000; +static TestSettings *s_instance; + +TestSettings *TestSettings::instance() +{ + return s_instance; +} + TestSettings::TestSettings() - : timeout(defaultTimeout) { + s_instance = this; + + setSettingsGroup(Constants::SETTINGSGROUP); + + registerAspect(&timeout); + timeout.setSettingsKey("Timeout"); + timeout.setDefaultValue(defaultTimeout); + timeout.setRange(5000, 36'000'000); // 36 Mio ms = 36'000 s = 10 h + timeout.setSuffix(Tr::tr(" s")); // we show seconds, but store milliseconds + timeout.setDisplayScaleFactor(1000); + timeout.setToolTip(Tr::tr("Timeout used when executing test cases. This will apply " + "for each test case on its own, not the whole project.")); + + registerAspect(&omitInternalMsg); + omitInternalMsg.setSettingsKey("OmitInternal"); + omitInternalMsg.setDefaultValue(true); + omitInternalMsg.setLabelText(Tr::tr("Omit internal messages")); + omitInternalMsg.setToolTip(Tr::tr("Hides internal messages by default. " + "You can still enable them by using the test results filter.")); + + registerAspect(&omitRunConfigWarn); + omitRunConfigWarn.setSettingsKey("OmitRCWarnings"); + omitRunConfigWarn.setLabelText(Tr::tr("Omit run configuration warnings")); + omitRunConfigWarn.setToolTip(Tr::tr("Hides warnings related to a deduced run configuration.")); + + registerAspect(&limitResultOutput); + limitResultOutput.setSettingsKey("LimitResultOutput"); + limitResultOutput.setDefaultValue(true); + limitResultOutput.setLabelText(Tr::tr("Limit result output")); + limitResultOutput.setToolTip(Tr::tr("Limits result output to 100000 characters.")); + + registerAspect(&limitResultDescription); + limitResultDescription.setSettingsKey("LimitResultDescription"); + limitResultDescription.setLabelText(Tr::tr("Limit result description:")); + limitResultDescription.setToolTip( + Tr::tr("Limit number of lines shown in test result tooltip and description.")); + + registerAspect(&resultDescriptionMaxSize); + resultDescriptionMaxSize.setSettingsKey("ResultDescriptionMaxSize"); + resultDescriptionMaxSize.setDefaultValue(10); + resultDescriptionMaxSize.setRange(1, 100000); + resultDescriptionMaxSize.setEnabler(&limitResultDescription); + + registerAspect(&autoScroll); + autoScroll.setSettingsKey("AutoScrollResults"); + autoScroll.setDefaultValue(true); + autoScroll.setLabelText(Tr::tr("Automatically scroll results")); + autoScroll.setToolTip(Tr::tr("Automatically scrolls down when new items are added " + "and scrollbar is at bottom.")); + + registerAspect(&processArgs); + processArgs.setSettingsKey("ProcessArgs"); + processArgs.setLabelText(Tr::tr("Process arguments")); + processArgs.setToolTip( + Tr::tr("Allow passing arguments specified on the respective run configuration.\n" + "Warning: this is an experimental feature and might lead to failing to " + "execute the test executable.")); + + registerAspect(&displayApplication); + displayApplication.setSettingsKey("DisplayApp"); + displayApplication.setLabelText(Tr::tr("Group results by application")); + + registerAspect(&popupOnStart); + popupOnStart.setSettingsKey("PopupOnStart"); + popupOnStart.setLabelText(Tr::tr("Open results when tests start")); + popupOnStart.setToolTip( + Tr::tr("Displays test results automatically when tests are started.")); + + registerAspect(&popupOnFinish); + popupOnFinish.setSettingsKey("PopupOnFinish"); + popupOnFinish.setDefaultValue(true); + popupOnFinish.setLabelText(Tr::tr("Open results when tests finish")); + popupOnFinish.setToolTip( + Tr::tr("Displays test results automatically when tests are finished.")); + + registerAspect(&popupOnFail); + popupOnFail.setSettingsKey("PopupOnFail"); + popupOnFail.setLabelText(Tr::tr("Only for unsuccessful test runs")); + popupOnFail.setEnabler(&popupOnFinish); + popupOnFail.setToolTip(Tr::tr("Displays test results only if the test run contains " + "failed, fatal or unexpectedly passed tests.")); + + registerAspect(&runAfterBuild); + runAfterBuild.setSettingsKey("RunAfterBuild"); + runAfterBuild.setDisplayStyle(Utils::SelectionAspect::DisplayStyle::ComboBox); + runAfterBuild.setToolTip(Tr::tr("Runs chosen tests automatically if a build succeeded.")); + runAfterBuild.addOption(Tr::tr("None")); + runAfterBuild.addOption(Tr::tr("All")); + runAfterBuild.addOption(Tr::tr("Selected")); } void TestSettings::toSettings(QSettings *s) const { + AspectContainer::writeSettings(s); + s->beginGroup(Constants::SETTINGSGROUP); - s->setValue(timeoutKey, timeout); - s->setValue(omitInternalKey, omitInternalMssg); - s->setValue(omitRunConfigWarnKey, omitRunConfigWarn); - s->setValue(limitResultOutputKey, limitResultOutput); - s->setValue(limitResultDescriptionKey, limitResultDescription); - s->setValue(resultDescriptionMaxSizeKey, resultDescriptionMaxSize); - s->setValue(autoScrollKey, autoScroll); - s->setValue(processArgsKey, processArgs); - s->setValue(displayApplicationKey, displayApplication); - s->setValue(popupOnStartKey, popupOnStart); - s->setValue(popupOnFinishKey, popupOnFinish); - s->setValue(popupOnFailKey, popupOnFail); - s->setValue(runAfterBuildKey, int(runAfterBuild)); + // store frameworks and their current active and grouping state for (auto it = frameworks.cbegin(); it != frameworks.cend(); ++it) { const Utils::Id &id = it.key(); @@ -65,21 +135,10 @@ void TestSettings::toSettings(QSettings *s) const void TestSettings::fromSettings(QSettings *s) { + AspectContainer::readSettings(s); + s->beginGroup(Constants::SETTINGSGROUP); - timeout = s->value(timeoutKey, defaultTimeout).toInt(); - omitInternalMssg = s->value(omitInternalKey, true).toBool(); - omitRunConfigWarn = s->value(omitRunConfigWarnKey, false).toBool(); - limitResultOutput = s->value(limitResultOutputKey, true).toBool(); - limitResultDescription = s->value(limitResultDescriptionKey, false).toBool(); - resultDescriptionMaxSize = s->value(resultDescriptionMaxSizeKey, 10).toInt(); - autoScroll = s->value(autoScrollKey, true).toBool(); - processArgs = s->value(processArgsKey, false).toBool(); - displayApplication = s->value(displayApplicationKey, false).toBool(); - popupOnStart = s->value(popupOnStartKey, true).toBool(); - popupOnFinish = s->value(popupOnFinishKey, true).toBool(); - popupOnFail = s->value(popupOnFailKey, false).toBool(); - runAfterBuild = RunAfterBuildMode(s->value(runAfterBuildKey, - int(RunAfterBuildMode::None)).toInt()); + // try to get settings for registered frameworks const TestFrameworks ®istered = TestFrameworkManager::registeredFrameworks(); frameworks.clear(); @@ -102,5 +161,9 @@ void TestSettings::fromSettings(QSettings *s) s->endGroup(); } -} // namespace Internal -} // namespace Autotest +RunAfterBuildMode TestSettings::runAfterBuildMode() const +{ + return static_cast<RunAfterBuildMode>(runAfterBuild.value()); +} + +} // namespace Autotest::Internal diff --git a/src/plugins/autotest/testsettings.h b/src/plugins/autotest/testsettings.h index ecf04fabaa..b4aec87f49 100644 --- a/src/plugins/autotest/testsettings.h +++ b/src/plugins/autotest/testsettings.h @@ -3,18 +3,9 @@ #pragma once -#include <QHash> +#include <utils/aspects.h> -namespace Utils { -class Id; -} - -QT_BEGIN_NAMESPACE -class QSettings; -QT_END_NAMESPACE - -namespace Autotest { -namespace Internal { +namespace Autotest::Internal { enum class RunAfterBuildMode { @@ -23,29 +14,39 @@ enum class RunAfterBuildMode Selected }; -struct TestSettings +class NonAspectSettings { +public: + QHash<Utils::Id, bool> frameworks; + QHash<Utils::Id, bool> frameworksGrouping; + QHash<Utils::Id, bool> tools; +}; + +class TestSettings : public Utils::AspectContainer, public NonAspectSettings +{ +public: TestSettings(); + + static TestSettings *instance(); + void toSettings(QSettings *s) const; void fromSettings(QSettings *s); - int timeout; - bool omitInternalMssg = true; - bool omitRunConfigWarn = false; - bool limitResultOutput = true; - bool limitResultDescription = false; - int resultDescriptionMaxSize = 10; - bool autoScroll = true; - bool processArgs = false; - bool displayApplication = false; - bool popupOnStart = true; - bool popupOnFinish = true; - bool popupOnFail = false; - RunAfterBuildMode runAfterBuild = RunAfterBuildMode::None; - QHash<Utils::Id, bool> frameworks; - QHash<Utils::Id, bool> frameworksGrouping; - QHash<Utils::Id, bool> tools; + Utils::IntegerAspect timeout; + Utils::BoolAspect omitInternalMsg; + Utils::BoolAspect omitRunConfigWarn; + Utils::BoolAspect limitResultOutput; + Utils::BoolAspect limitResultDescription; + Utils::IntegerAspect resultDescriptionMaxSize; + Utils::BoolAspect autoScroll; + Utils::BoolAspect processArgs; + Utils::BoolAspect displayApplication; + Utils::BoolAspect popupOnStart; + Utils::BoolAspect popupOnFinish; + Utils::BoolAspect popupOnFail; + Utils::SelectionAspect runAfterBuild; + + RunAfterBuildMode runAfterBuildMode() const; }; -} // namespace Internal -} // namespace Autotest +} // Autotest::Internal diff --git a/src/plugins/autotest/testsettingspage.cpp b/src/plugins/autotest/testsettingspage.cpp index be6c424457..6c9850bc2a 100644 --- a/src/plugins/autotest/testsettingspage.cpp +++ b/src/plugins/autotest/testsettingspage.cpp @@ -25,7 +25,6 @@ #include <QLabel> #include <QPushButton> #include <QSpacerItem> -#include <QSpinBox> #include <QTreeWidget> using namespace Utils; @@ -35,100 +34,24 @@ namespace Autotest::Internal { class TestSettingsWidget : public Core::IOptionsPageWidget { public: - explicit TestSettingsWidget(TestSettings *settings); + TestSettingsWidget(); private: void populateFrameworksListWidget(const QHash<Id, bool> &frameworks, const QHash<Id, bool> &testTools); - void testSettings(TestSettings &settings) const; - void testToolsSettings(TestSettings &settings) const; + void testSettings(NonAspectSettings &settings) const; + void testToolsSettings(NonAspectSettings &settings) const; void onFrameworkItemChanged(); - TestSettings *m_settings; - QCheckBox *m_omitInternalMsgCB; - QCheckBox *m_omitRunConfigWarnCB; - QCheckBox *m_limitResultOutputCB; - QCheckBox *m_limitResultDescriptionCb; - QSpinBox *m_limitResultDescriptionSpinBox; - QCheckBox *m_openResultsOnStartCB; - QCheckBox *m_openResultsOnFinishCB; - QCheckBox *m_openResultsOnFailCB; - QCheckBox *m_autoScrollCB; - QCheckBox *m_displayAppCB; - QCheckBox *m_processArgsCB; - QComboBox *m_runAfterBuildCB; - QSpinBox *m_timeoutSpin; QTreeWidget *m_frameworkTreeWidget; InfoLabel *m_frameworksWarn; }; -TestSettingsWidget::TestSettingsWidget(TestSettings *settings) - : m_settings(settings) +TestSettingsWidget::TestSettingsWidget() { - m_omitInternalMsgCB = new QCheckBox(Tr::tr("Omit internal messages")); - m_omitInternalMsgCB->setChecked(true); - m_omitInternalMsgCB->setToolTip(Tr::tr("Hides internal messages by default. " - "You can still enable them by using the test results filter.")); - - m_omitRunConfigWarnCB = new QCheckBox(Tr::tr("Omit run configuration warnings")); - m_omitRunConfigWarnCB->setToolTip(Tr::tr("Hides warnings related to a deduced run configuration.")); - - m_limitResultOutputCB = new QCheckBox(Tr::tr("Limit result output")); - m_limitResultOutputCB->setChecked(true); - m_limitResultOutputCB->setToolTip(Tr::tr("Limits result output to 100000 characters.")); - - m_limitResultDescriptionCb = new QCheckBox(Tr::tr("Limit result description:")); - m_limitResultDescriptionCb->setToolTip( - Tr::tr("Limit number of lines shown in test result tooltip and description.")); - - m_limitResultDescriptionSpinBox = new QSpinBox; - m_limitResultDescriptionSpinBox->setEnabled(false); - m_limitResultDescriptionSpinBox->setMinimum(1); - m_limitResultDescriptionSpinBox->setMaximum(1000000); - m_limitResultDescriptionSpinBox->setValue(10); - - m_openResultsOnStartCB = new QCheckBox(Tr::tr("Open results when tests start")); - m_openResultsOnStartCB->setToolTip( - Tr::tr("Displays test results automatically when tests are started.")); - - m_openResultsOnFinishCB = new QCheckBox(Tr::tr("Open results when tests finish")); - m_openResultsOnFinishCB->setChecked(true); - m_openResultsOnFinishCB->setToolTip( - Tr::tr("Displays test results automatically when tests are finished.")); - - m_openResultsOnFailCB = new QCheckBox(Tr::tr("Only for unsuccessful test runs")); - m_openResultsOnFailCB->setToolTip( - Tr::tr("Displays test results only if the test run contains failed, fatal or unexpectedly passed tests.")); - - m_autoScrollCB = new QCheckBox(Tr::tr("Automatically scroll results")); - m_autoScrollCB->setChecked(true); - m_autoScrollCB->setToolTip(Tr::tr("Automatically scrolls down when new items are added and scrollbar is at bottom.")); - - m_displayAppCB = new QCheckBox(Tr::tr("Group results by application")); - - m_processArgsCB = new QCheckBox(Tr::tr("Process arguments")); - m_processArgsCB->setToolTip( - Tr::tr("Allow passing arguments specified on the respective run configuration.\n" - "Warning: this is an experimental feature and might lead to failing to execute the test executable.")); - - m_runAfterBuildCB = new QComboBox; - m_runAfterBuildCB->setToolTip(Tr::tr("Runs chosen tests automatically if a build succeeded.")); - m_runAfterBuildCB->addItem(Tr::tr("None")); - m_runAfterBuildCB->addItem(Tr::tr("All")); - m_runAfterBuildCB->addItem(Tr::tr("Selected")); - auto timeoutLabel = new QLabel(Tr::tr("Timeout:")); timeoutLabel->setToolTip(Tr::tr("Timeout used when executing each test case.")); - m_timeoutSpin = new QSpinBox; - m_timeoutSpin->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - m_timeoutSpin->setRange(5, 36000); - m_timeoutSpin->setValue(60); - m_timeoutSpin->setSuffix(Tr::tr(" s")); - m_timeoutSpin->setToolTip( - Tr::tr("Timeout used when executing test cases. This will apply " - "for each test case on its own, not the whole project.")); - m_frameworkTreeWidget = new QTreeWidget; m_frameworkTreeWidget->setRootIsDecorated(false); m_frameworkTreeWidget->setHeaderHidden(false); @@ -156,21 +79,22 @@ TestSettingsWidget::TestSettingsWidget(TestSettings *settings) onClicked([] { AutotestPlugin::clearChoiceCache(); }, this) }; + TestSettings &s = *TestSettings::instance(); Group generalGroup { title(Tr::tr("General")), Column { - m_omitInternalMsgCB, - m_omitRunConfigWarnCB, - m_limitResultOutputCB, - Row { m_limitResultDescriptionCb, m_limitResultDescriptionSpinBox, st }, - m_openResultsOnStartCB, - m_openResultsOnFinishCB, - Row { Space(20), m_openResultsOnFailCB }, - m_autoScrollCB, - m_displayAppCB, - m_processArgsCB, - Row { Tr::tr("Automatically run"), m_runAfterBuildCB, st }, - Row { timeoutLabel, m_timeoutSpin, st }, + s.omitInternalMsg, + s.omitRunConfigWarn, + s.limitResultOutput, + Row { s.limitResultDescription, s.resultDescriptionMaxSize, st }, + s.popupOnStart, + s.popupOnFinish, + Row { Space(20), s.popupOnFail }, + s.autoScroll, + s.displayApplication, + s.processArgs, + Row { Tr::tr("Automatically run"), s.runAfterBuild, st }, + Row { timeoutLabel, s.timeout, st }, Row { resetChoicesButton, st } } }; @@ -193,61 +117,32 @@ TestSettingsWidget::TestSettingsWidget(TestSettings *settings) connect(m_frameworkTreeWidget, &QTreeWidget::itemChanged, this, &TestSettingsWidget::onFrameworkItemChanged); - connect(m_openResultsOnFinishCB, &QCheckBox::toggled, - m_openResultsOnFailCB, &QCheckBox::setEnabled); - connect(m_limitResultDescriptionCb, &QCheckBox::toggled, - m_limitResultDescriptionSpinBox, &QSpinBox::setEnabled); - - - m_timeoutSpin->setValue(settings->timeout / 1000); // we store milliseconds - m_omitInternalMsgCB->setChecked(settings->omitInternalMssg); - m_omitRunConfigWarnCB->setChecked(settings->omitRunConfigWarn); - m_limitResultOutputCB->setChecked(settings->limitResultOutput); - m_limitResultDescriptionCb->setChecked(settings->limitResultDescription); - m_limitResultDescriptionSpinBox->setEnabled(settings->limitResultDescription); - m_limitResultDescriptionSpinBox->setValue(settings->resultDescriptionMaxSize); - m_autoScrollCB->setChecked(settings->autoScroll); - m_processArgsCB->setChecked(settings->processArgs); - m_displayAppCB->setChecked(settings->displayApplication); - m_openResultsOnStartCB->setChecked(settings->popupOnStart); - m_openResultsOnFinishCB->setChecked(settings->popupOnFinish); - m_openResultsOnFailCB->setChecked(settings->popupOnFail); - m_runAfterBuildCB->setCurrentIndex(int(settings->runAfterBuild)); - populateFrameworksListWidget(settings->frameworks, settings->tools); + + populateFrameworksListWidget(s.frameworks, s.tools); setOnApply([this] { - TestSettings result; - result.timeout = m_timeoutSpin->value() * 1000; // we display seconds - result.omitInternalMssg = m_omitInternalMsgCB->isChecked(); - result.omitRunConfigWarn = m_omitRunConfigWarnCB->isChecked(); - result.limitResultOutput = m_limitResultOutputCB->isChecked(); - result.limitResultDescription = m_limitResultDescriptionCb->isChecked(); - result.resultDescriptionMaxSize = m_limitResultDescriptionSpinBox->value(); - result.autoScroll = m_autoScrollCB->isChecked(); - result.processArgs = m_processArgsCB->isChecked(); - result.displayApplication = m_displayAppCB->isChecked(); - result.popupOnStart = m_openResultsOnStartCB->isChecked(); - result.popupOnFinish = m_openResultsOnFinishCB->isChecked(); - result.popupOnFail = m_openResultsOnFailCB->isChecked(); - result.runAfterBuild = RunAfterBuildMode(m_runAfterBuildCB->currentIndex()); - testSettings(result); - testToolsSettings(result); - - const QList<Utils::Id> changedIds = Utils::filtered(result.frameworksGrouping.keys(), - [result, this](Utils::Id id) { - return result.frameworksGrouping[id] != m_settings->frameworksGrouping[id]; + TestSettings &s = *TestSettings::instance(); + + NonAspectSettings tmp; + testSettings(tmp); + testToolsSettings(tmp); + + const QList<Utils::Id> changedIds = Utils::filtered(tmp.frameworksGrouping.keys(), + [&tmp, &s](Utils::Id id) { + return tmp.frameworksGrouping[id] != s.frameworksGrouping[id]; }); - *m_settings = result; - m_settings->toSettings(Core::ICore::settings()); + testSettings(s); + testToolsSettings(s); + s.toSettings(Core::ICore::settings()); for (ITestFramework *framework : TestFrameworkManager::registeredFrameworks()) { - framework->setActive(m_settings->frameworks.value(framework->id(), false)); - framework->setGrouping(m_settings->frameworksGrouping.value(framework->id(), false)); + framework->setActive(s.frameworks.value(framework->id(), false)); + framework->setGrouping(s.frameworksGrouping.value(framework->id(), false)); } for (ITestTool *testTool : TestFrameworkManager::registeredTestTools()) - testTool->setActive(m_settings->tools.value(testTool->id(), false)); + testTool->setActive(s.tools.value(testTool->id(), false)); TestTreeModel::instance()->synchronizeTestFrameworks(); TestTreeModel::instance()->synchronizeTestTools(); @@ -294,7 +189,7 @@ void TestSettingsWidget::populateFrameworksListWidget(const QHash<Id, bool> &fra } } -void TestSettingsWidget::testSettings(TestSettings &settings) const +void TestSettingsWidget::testSettings(NonAspectSettings &settings) const { const QAbstractItemModel *model = m_frameworkTreeWidget->model(); QTC_ASSERT(model, return); @@ -309,7 +204,7 @@ void TestSettingsWidget::testSettings(TestSettings &settings) const } } -void TestSettingsWidget::testToolsSettings(TestSettings &settings) const +void TestSettingsWidget::testToolsSettings(NonAspectSettings &settings) const { const QAbstractItemModel *model = m_frameworkTreeWidget->model(); QTC_ASSERT(model, return); @@ -356,14 +251,14 @@ void TestSettingsWidget::onFrameworkItemChanged() // TestSettingsPage -TestSettingsPage::TestSettingsPage(TestSettings *settings) +TestSettingsPage::TestSettingsPage() { setId(Constants::AUTOTEST_SETTINGS_ID); setDisplayName(Tr::tr("General")); setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); setDisplayCategory(Tr::tr("Testing")); setCategoryIconPath(":/autotest/images/settingscategory_autotest.png"); - setWidgetCreator([settings] { return new TestSettingsWidget(settings); }); + setWidgetCreator([] { return new TestSettingsWidget; }); } } // Autotest::Internal diff --git a/src/plugins/autotest/testsettingspage.h b/src/plugins/autotest/testsettingspage.h index 46338e7f89..03eb214097 100644 --- a/src/plugins/autotest/testsettingspage.h +++ b/src/plugins/autotest/testsettingspage.h @@ -7,12 +7,10 @@ namespace Autotest::Internal { -struct TestSettings; - class TestSettingsPage : public Core::IOptionsPage { public: - explicit TestSettingsPage(TestSettings *settings); + TestSettingsPage(); }; } // Autotest::Internal |