AutoTests: Aspectify parts of main settings

Change-Id: I407b5102e1f2a6647f6fdca01a61dfa422c5d3ee
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-05-12 11:00:00 +02:00
parent 4c1a161abd
commit 30af7a9503
18 changed files with 205 additions and 262 deletions

View File

@@ -96,7 +96,7 @@ public:
void onRunUnderCursorTriggered(TestRunMode mode); void onRunUnderCursorTriggered(TestRunMode mode);
TestSettings m_settings; TestSettings m_settings;
TestSettingsPage m_testSettingPage{&m_settings}; TestSettingsPage m_testSettingPage;
TestCodeParser m_testCodeParser; TestCodeParser m_testCodeParser;
TestTreeModel m_testTreeModel{&m_testCodeParser}; TestTreeModel m_testTreeModel{&m_testCodeParser};
@@ -178,11 +178,6 @@ AutotestPluginPrivate::~AutotestPluginPrivate()
delete m_resultsPane; delete m_resultsPane;
} }
TestSettings *AutotestPlugin::settings()
{
return &dd->m_settings;
}
TestProjectSettings *AutotestPlugin::projectSettings(ProjectExplorer::Project *project) TestProjectSettings *AutotestPlugin::projectSettings(ProjectExplorer::Project *project)
{ {
auto &settings = s_projectSettings[project]; auto &settings = s_projectSettings[project];

View File

@@ -18,7 +18,6 @@ namespace Autotest {
namespace Internal { namespace Internal {
class TestProjectSettings; class TestProjectSettings;
struct TestSettings;
struct ChoicePair struct ChoicePair
{ {
@@ -43,7 +42,6 @@ public:
void extensionsInitialized() override; void extensionsInitialized() override;
ShutdownFlag aboutToShutdown() override; ShutdownFlag aboutToShutdown() override;
static TestSettings *settings();
static TestProjectSettings *projectSettings(ProjectExplorer::Project *project); static TestProjectSettings *projectSettings(ProjectExplorer::Project *project);
static TestFrameworks activeTestFrameworks(); static TestFrameworks activeTestFrameworks();
static void updateMenuItemsEnabledState(); static void updateMenuItemsEnabledState();

View File

@@ -6,7 +6,6 @@
#include "boosttestoutputreader.h" #include "boosttestoutputreader.h"
#include "boosttestsettings.h" #include "boosttestsettings.h"
#include "../autotestplugin.h"
#include "../itestframework.h" #include "../itestframework.h"
#include "../testsettings.h" #include "../testsettings.h"
@@ -106,7 +105,7 @@ QStringList BoostTestConfiguration::argumentsForTestRunner(QStringList *omitted)
for (const QString &test : testCases()) for (const QString &test : testCases())
arguments << "-t" << test; arguments << "-t" << test;
if (AutotestPlugin::settings()->processArgs) { if (TestSettings::instance()->processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -6,7 +6,6 @@
#include "catchoutputreader.h" #include "catchoutputreader.h"
#include "catchtestsettings.h" #include "catchtestsettings.h"
#include "../autotestplugin.h"
#include "../itestframework.h" #include "../itestframework.h"
#include "../testsettings.h" #include "../testsettings.h"
@@ -80,7 +79,7 @@ QStringList CatchConfiguration::argumentsForTestRunner(QStringList *omitted) con
arguments << "\"" + testCases().join("\", \"") + "\""; arguments << "\"" + testCases().join("\", \"") + "\"";
arguments << "--reporter" << "xml"; arguments << "--reporter" << "xml";
if (AutotestPlugin::settings()->processArgs) { if (TestSettings::instance()->processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -88,7 +88,7 @@ QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringLi
return {}; return {};
const ProjectExplorer::BuildSystem *buildSystem = target->buildSystem(); 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()); auto ctestSettings = static_cast<CTestSettings *>(testBase()->testSettings());
options << ctestSettings->activeSettingsAsOptions(); options << ctestSettings->activeSettingsAsOptions();
CommandLine command = buildSystem->commandLineForTests(selected, options); CommandLine command = buildSystem->commandLineForTests(selected, options);

View File

@@ -6,7 +6,6 @@
#include "gtestoutputreader.h" #include "gtestoutputreader.h"
#include "gtestsettings.h" #include "gtestsettings.h"
#include "../autotestplugin.h"
#include "../itestframework.h" #include "../itestframework.h"
#include "../testsettings.h" #include "../testsettings.h"
@@ -55,7 +54,7 @@ QStringList filterInterfering(const QStringList &provided, QStringList *omitted)
QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList GTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (AutotestPlugin::settings()->processArgs) { if (TestSettings::instance()->processArgs()) {
arguments << filterInterfering(runnable().command.arguments().split( arguments << filterInterfering(runnable().command.arguments().split(
' ', Qt::SkipEmptyParts), omitted); ' ', Qt::SkipEmptyParts), omitted);
} }

View File

@@ -2,8 +2,9 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "qttest_utils.h" #include "qttest_utils.h"
#include "qttesttreeitem.h" #include "qttesttreeitem.h"
#include "../autotestplugin.h" #include "../itestframework.h"
#include "../testsettings.h" #include "../testsettings.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -136,7 +137,7 @@ Environment prepareBasicEnvironment(const Environment &env)
result.set("QT_FORCE_STDERR_LOGGING", "1"); result.set("QT_FORCE_STDERR_LOGGING", "1");
result.set("QT_LOGGING_TO_CONSOLE", "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 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)); result.set("QTEST_FUNCTION_TIMEOUT", QString::number(timeout));
return result; return result;

View File

@@ -7,7 +7,6 @@
#include "qttestsettings.h" #include "qttestsettings.h"
#include "qttest_utils.h" #include "qttest_utils.h"
#include "../autotestplugin.h"
#include "../itestframework.h" #include "../itestframework.h"
#include "../testsettings.h" #include "../testsettings.h"
@@ -40,7 +39,7 @@ TestOutputReader *QtTestConfiguration::createOutputReader(Process *app) const
QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList QtTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (AutotestPlugin::settings()->processArgs) { if (TestSettings::instance()->processArgs()) {
arguments.append(QTestUtils::filterInterfering( arguments.append(QTestUtils::filterInterfering(
runnable().command.arguments().split(' ', Qt::SkipEmptyParts), runnable().command.arguments().split(' ', Qt::SkipEmptyParts),
omitted, false)); omitted, false));

View File

@@ -3,7 +3,6 @@
#include "quicktestconfiguration.h" #include "quicktestconfiguration.h"
#include "../autotestplugin.h"
#include "../itestframework.h" #include "../itestframework.h"
#include "../qtest/qttestoutputreader.h" #include "../qtest/qttestoutputreader.h"
#include "../qtest/qttestsettings.h" #include "../qtest/qttestsettings.h"
@@ -33,7 +32,7 @@ TestOutputReader *QuickTestConfiguration::createOutputReader(Process *app) const
QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) const QStringList QuickTestConfiguration::argumentsForTestRunner(QStringList *omitted) const
{ {
QStringList arguments; QStringList arguments;
if (AutotestPlugin::settings()->processArgs) { if (TestSettings::instance()->processArgs()) {
arguments.append(QTestUtils::filterInterfering arguments.append(QTestUtils::filterInterfering
(runnable().command.arguments().split(' ', Qt::SkipEmptyParts), (runnable().command.arguments().split(' ', Qt::SkipEmptyParts),
omitted, true)); omitted, true));

View File

@@ -3,7 +3,6 @@
#include "testframeworkmanager.h" #include "testframeworkmanager.h"
#include "autotestplugin.h"
#include "testsettings.h" #include "testsettings.h"
#include <utils/aspects.h> #include <utils/aspects.h>
@@ -98,7 +97,7 @@ ITestTool *TestFrameworkManager::testToolForBuildSystemId(Id buildSystemId)
void TestFrameworkManager::synchronizeSettings(QSettings *s) void TestFrameworkManager::synchronizeSettings(QSettings *s)
{ {
Internal::AutotestPlugin::settings()->fromSettings(s); Internal::TestSettings::instance()->fromSettings(s);
for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) { for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) {
if (ITestSettings *fSettings = framework->testSettings()) if (ITestSettings *fSettings = framework->testSettings())
fSettings->readSettings(s); fSettings->readSettings(s);

View File

@@ -3,7 +3,6 @@
#include "testresultdelegate.h" #include "testresultdelegate.h"
#include "autotestplugin.h"
#include "testresultmodel.h" #include "testresultmodel.h"
#include "testsettings.h" #include "testsettings.h"
@@ -162,10 +161,10 @@ void TestResultDelegate::clearCache()
void TestResultDelegate::limitTextOutput(QString &output) const void TestResultDelegate::limitTextOutput(QString &output) const
{ {
int maxLineCount = Internal::AutotestPlugin::settings()->resultDescriptionMaxSize; int maxLineCount = Internal::TestSettings::instance()->resultDescriptionMaxSize();
bool limited = false; bool limited = false;
if (Internal::AutotestPlugin::settings()->limitResultDescription && maxLineCount > 0) { if (Internal::TestSettings::instance()->limitResultDescription() && maxLineCount > 0) {
int index = -1; int index = -1;
int lastChar = output.size() - 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); output = output.left(outputLimit);
limited = true; limited = true;
} }

View File

@@ -4,7 +4,6 @@
#include "testresultmodel.h" #include "testresultmodel.h"
#include "autotesticons.h" #include "autotesticons.h"
#include "autotestplugin.h"
#include "testrunner.h" #include "testrunner.h"
#include "testsettings.h" #include "testsettings.h"
#include "testtreeitem.h" #include "testtreeitem.h"
@@ -274,7 +273,7 @@ void TestResultModel::addTestResult(const TestResult &testResult, bool autoExpan
TestResultItem *newItem = new TestResultItem(testResult); TestResultItem *newItem = new TestResultItem(testResult);
TestResultItem *root = nullptr; TestResultItem *root = nullptr;
if (AutotestPlugin::settings()->displayApplication) { if (TestSettings::instance()->displayApplication()) {
const QString application = testResult.id(); const QString application = testResult.id();
if (!application.isEmpty()) { if (!application.isEmpty()) {
root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) { root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) {

View File

@@ -291,7 +291,7 @@ void TestResultsPane::clearContents()
setIconBadgeNumber(0); setIconBadgeNumber(0);
navigateStateChanged(); navigateStateChanged();
m_summaryWidget->setVisible(false); m_summaryWidget->setVisible(false);
m_autoScroll = AutotestPlugin::settings()->autoScroll; m_autoScroll = TestSettings::instance()->autoScroll();
connect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, connect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged,
this, &TestResultsPane::onScrollBarRangeChanged, Qt::UniqueConnection); this, &TestResultsPane::onScrollBarRangeChanged, Qt::UniqueConnection);
m_textOutput->clear(); m_textOutput->clear();
@@ -437,7 +437,7 @@ void TestResultsPane::onRunSelectedTriggered()
void TestResultsPane::initializeFilterMenu() void TestResultsPane::initializeFilterMenu()
{ {
const bool omitIntern = AutotestPlugin::settings()->omitInternalMssg; const bool omitIntern = TestSettings::instance()->omitInternalMsg();
// FilterModel has all messages enabled by default // FilterModel has all messages enabled by default
if (omitIntern) if (omitIntern)
m_filterModel->toggleTestResultType(ResultType::MessageInternal); m_filterModel->toggleTestResultType(ResultType::MessageInternal);
@@ -553,8 +553,8 @@ void TestResultsPane::onTestRunFinished()
m_model->removeCurrentTestMessage(); m_model->removeCurrentTestMessage();
disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged, disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged,
this, &TestResultsPane::onScrollBarRangeChanged); this, &TestResultsPane::onScrollBarRangeChanged);
if (AutotestPlugin::settings()->popupOnFinish if (TestSettings::instance()->popupOnFinish()
&& (!AutotestPlugin::settings()->popupOnFail || hasFailedTests(m_model))) { && (!TestSettings::instance()->popupOnFail() || hasFailedTests(m_model))) {
popup(IOutputPane::NoModeSwitch); popup(IOutputPane::NoModeSwitch);
} }
createMarks(); createMarks();

View File

@@ -258,7 +258,7 @@ static RunConfiguration *getRunConfiguration(const QString &buildTargetKey)
int TestRunner::precheckTestConfigurations() int TestRunner::precheckTestConfigurations()
{ {
const bool omitWarnings = AutotestPlugin::settings()->omitRunConfigWarn; const bool omitWarnings = TestSettings::instance()->omitRunConfigWarn();
int testCaseCount = 0; int testCaseCount = 0;
for (ITestConfiguration *itc : std::as_const(m_selectedTests)) { for (ITestConfiguration *itc : std::as_const(m_selectedTests)) {
if (itc->testBase()->type() == ITestBase::Tool) { if (itc->testBase()->type() == ITestBase::Tool) {
@@ -402,7 +402,7 @@ void TestRunner::runTestsHelper()
} }
process.setEnvironment(environment); process.setEnvironment(environment);
m_cancelTimer.setInterval(AutotestPlugin::settings()->timeout); m_cancelTimer.setInterval(TestSettings::instance()->timeout());
m_cancelTimer.start(); m_cancelTimer.start();
qCInfo(runnerLog) << "Command:" << process.commandLine().executable(); qCInfo(runnerLog) << "Command:" << process.commandLine().executable();
@@ -465,7 +465,7 @@ void TestRunner::runTestsHelper()
cancelCurrent(UserCanceled); cancelCurrent(UserCanceled);
}); });
if (AutotestPlugin::settings()->popupOnStart) if (TestSettings::instance()->popupOnStart())
AutotestPlugin::popupResultsPane(); AutotestPlugin::popupResultsPane();
m_taskTree->start(); m_taskTree->start();
@@ -588,7 +588,7 @@ void TestRunner::debugTests()
connect(runControl, &RunControl::stopped, this, &TestRunner::onFinished); connect(runControl, &RunControl::stopped, this, &TestRunner::onFinished);
m_finishDebugConnect = connect(runControl, &RunControl::finished, this, &TestRunner::onFinished); m_finishDebugConnect = connect(runControl, &RunControl::finished, this, &TestRunner::onFinished);
ProjectExplorerPlugin::startRunControl(runControl); ProjectExplorerPlugin::startRunControl(runControl);
if (useOutputProcessor && AutotestPlugin::settings()->popupOnStart) if (useOutputProcessor && TestSettings::instance()->popupOnStart())
AutotestPlugin::popupResultsPane(); AutotestPlugin::popupResultsPane();
} }
@@ -669,10 +669,10 @@ static RunAfterBuildMode runAfterBuild()
return RunAfterBuildMode::None; return RunAfterBuildMode::None;
if (!project->namedSettings(Constants::SK_USE_GLOBAL).isValid()) if (!project->namedSettings(Constants::SK_USE_GLOBAL).isValid())
return AutotestPlugin::settings()->runAfterBuild; return TestSettings::instance()->runAfterBuildMode();
TestProjectSettings *projectSettings = AutotestPlugin::projectSettings(project); TestProjectSettings *projectSettings = AutotestPlugin::projectSettings(project);
return projectSettings->useGlobalSettings() ? AutotestPlugin::settings()->runAfterBuild return projectSettings->useGlobalSettings() ? TestSettings::instance()->runAfterBuildMode()
: projectSettings->runAfterBuild(); : projectSettings->runAfterBuild();
} }

View File

@@ -4,53 +4,123 @@
#include "testsettings.h" #include "testsettings.h"
#include "autotestconstants.h" #include "autotestconstants.h"
#include "autotesttr.h"
#include "testframeworkmanager.h" #include "testframeworkmanager.h"
#include <utils/id.h>
#include <QSettings> #include <QSettings>
namespace Autotest { namespace Autotest::Internal {
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";
static const char groupSuffix[] = ".group"; static const char groupSuffix[] = ".group";
constexpr int defaultTimeout = 60000; constexpr int defaultTimeout = 60000;
TestSettings::TestSettings() static TestSettings *s_instance;
: timeout(defaultTimeout)
TestSettings *TestSettings::instance()
{ {
return s_instance;
}
TestSettings::TestSettings()
{
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 void TestSettings::toSettings(QSettings *s) const
{ {
AspectContainer::writeSettings(s);
s->beginGroup(Constants::SETTINGSGROUP); 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 // store frameworks and their current active and grouping state
for (auto it = frameworks.cbegin(); it != frameworks.cend(); ++it) { for (auto it = frameworks.cbegin(); it != frameworks.cend(); ++it) {
const Utils::Id &id = it.key(); const Utils::Id &id = it.key();
@@ -65,21 +135,10 @@ void TestSettings::toSettings(QSettings *s) const
void TestSettings::fromSettings(QSettings *s) void TestSettings::fromSettings(QSettings *s)
{ {
AspectContainer::readSettings(s);
s->beginGroup(Constants::SETTINGSGROUP); 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 // try to get settings for registered frameworks
const TestFrameworks &registered = TestFrameworkManager::registeredFrameworks(); const TestFrameworks &registered = TestFrameworkManager::registeredFrameworks();
frameworks.clear(); frameworks.clear();
@@ -102,5 +161,9 @@ void TestSettings::fromSettings(QSettings *s)
s->endGroup(); s->endGroup();
} }
} // namespace Internal RunAfterBuildMode TestSettings::runAfterBuildMode() const
} // namespace Autotest {
return static_cast<RunAfterBuildMode>(runAfterBuild.value());
}
} // namespace Autotest::Internal

View File

@@ -3,18 +3,9 @@
#pragma once #pragma once
#include <QHash> #include <utils/aspects.h>
namespace Utils { namespace Autotest::Internal {
class Id;
}
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace Autotest {
namespace Internal {
enum class RunAfterBuildMode enum class RunAfterBuildMode
{ {
@@ -23,29 +14,39 @@ enum class RunAfterBuildMode
Selected Selected
}; };
struct TestSettings class NonAspectSettings
{ {
TestSettings(); public:
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> frameworks;
QHash<Utils::Id, bool> frameworksGrouping; QHash<Utils::Id, bool> frameworksGrouping;
QHash<Utils::Id, bool> tools; QHash<Utils::Id, bool> tools;
}; };
} // namespace Internal class TestSettings : public Utils::AspectContainer, public NonAspectSettings
} // namespace Autotest {
public:
TestSettings();
static TestSettings *instance();
void toSettings(QSettings *s) const;
void fromSettings(QSettings *s);
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;
};
} // Autotest::Internal

View File

@@ -25,7 +25,6 @@
#include <QLabel> #include <QLabel>
#include <QPushButton> #include <QPushButton>
#include <QSpacerItem> #include <QSpacerItem>
#include <QSpinBox>
#include <QTreeWidget> #include <QTreeWidget>
using namespace Utils; using namespace Utils;
@@ -35,100 +34,24 @@ namespace Autotest::Internal {
class TestSettingsWidget : public Core::IOptionsPageWidget class TestSettingsWidget : public Core::IOptionsPageWidget
{ {
public: public:
explicit TestSettingsWidget(TestSettings *settings); TestSettingsWidget();
private: private:
void populateFrameworksListWidget(const QHash<Id, bool> &frameworks, void populateFrameworksListWidget(const QHash<Id, bool> &frameworks,
const QHash<Id, bool> &testTools); const QHash<Id, bool> &testTools);
void testSettings(TestSettings &settings) const; void testSettings(NonAspectSettings &settings) const;
void testToolsSettings(TestSettings &settings) const; void testToolsSettings(NonAspectSettings &settings) const;
void onFrameworkItemChanged(); 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; QTreeWidget *m_frameworkTreeWidget;
InfoLabel *m_frameworksWarn; InfoLabel *m_frameworksWarn;
}; };
TestSettingsWidget::TestSettingsWidget(TestSettings *settings) TestSettingsWidget::TestSettingsWidget()
: m_settings(settings)
{ {
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:")); auto timeoutLabel = new QLabel(Tr::tr("Timeout:"));
timeoutLabel->setToolTip(Tr::tr("Timeout used when executing each test case.")); 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 = new QTreeWidget;
m_frameworkTreeWidget->setRootIsDecorated(false); m_frameworkTreeWidget->setRootIsDecorated(false);
m_frameworkTreeWidget->setHeaderHidden(false); m_frameworkTreeWidget->setHeaderHidden(false);
@@ -156,21 +79,22 @@ TestSettingsWidget::TestSettingsWidget(TestSettings *settings)
onClicked([] { AutotestPlugin::clearChoiceCache(); }, this) onClicked([] { AutotestPlugin::clearChoiceCache(); }, this)
}; };
TestSettings &s = *TestSettings::instance();
Group generalGroup { Group generalGroup {
title(Tr::tr("General")), title(Tr::tr("General")),
Column { Column {
m_omitInternalMsgCB, s.omitInternalMsg,
m_omitRunConfigWarnCB, s.omitRunConfigWarn,
m_limitResultOutputCB, s.limitResultOutput,
Row { m_limitResultDescriptionCb, m_limitResultDescriptionSpinBox, st }, Row { s.limitResultDescription, s.resultDescriptionMaxSize, st },
m_openResultsOnStartCB, s.popupOnStart,
m_openResultsOnFinishCB, s.popupOnFinish,
Row { Space(20), m_openResultsOnFailCB }, Row { Space(20), s.popupOnFail },
m_autoScrollCB, s.autoScroll,
m_displayAppCB, s.displayApplication,
m_processArgsCB, s.processArgs,
Row { Tr::tr("Automatically run"), m_runAfterBuildCB, st }, Row { Tr::tr("Automatically run"), s.runAfterBuild, st },
Row { timeoutLabel, m_timeoutSpin, st }, Row { timeoutLabel, s.timeout, st },
Row { resetChoicesButton, st } Row { resetChoicesButton, st }
} }
}; };
@@ -193,61 +117,32 @@ TestSettingsWidget::TestSettingsWidget(TestSettings *settings)
connect(m_frameworkTreeWidget, &QTreeWidget::itemChanged, connect(m_frameworkTreeWidget, &QTreeWidget::itemChanged,
this, &TestSettingsWidget::onFrameworkItemChanged); this, &TestSettingsWidget::onFrameworkItemChanged);
connect(m_openResultsOnFinishCB, &QCheckBox::toggled,
m_openResultsOnFailCB, &QCheckBox::setEnabled);
connect(m_limitResultDescriptionCb, &QCheckBox::toggled,
m_limitResultDescriptionSpinBox, &QSpinBox::setEnabled);
populateFrameworksListWidget(s.frameworks, s.tools);
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);
setOnApply([this] { setOnApply([this] {
TestSettings result; TestSettings &s = *TestSettings::instance();
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(), NonAspectSettings tmp;
[result, this](Utils::Id id) { testSettings(tmp);
return result.frameworksGrouping[id] != m_settings->frameworksGrouping[id]; 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; testSettings(s);
m_settings->toSettings(Core::ICore::settings()); testToolsSettings(s);
s.toSettings(Core::ICore::settings());
for (ITestFramework *framework : TestFrameworkManager::registeredFrameworks()) { for (ITestFramework *framework : TestFrameworkManager::registeredFrameworks()) {
framework->setActive(m_settings->frameworks.value(framework->id(), false)); framework->setActive(s.frameworks.value(framework->id(), false));
framework->setGrouping(m_settings->frameworksGrouping.value(framework->id(), false)); framework->setGrouping(s.frameworksGrouping.value(framework->id(), false));
} }
for (ITestTool *testTool : TestFrameworkManager::registeredTestTools()) 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()->synchronizeTestFrameworks();
TestTreeModel::instance()->synchronizeTestTools(); 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(); const QAbstractItemModel *model = m_frameworkTreeWidget->model();
QTC_ASSERT(model, return); 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(); const QAbstractItemModel *model = m_frameworkTreeWidget->model();
QTC_ASSERT(model, return); QTC_ASSERT(model, return);
@@ -356,14 +251,14 @@ void TestSettingsWidget::onFrameworkItemChanged()
// TestSettingsPage // TestSettingsPage
TestSettingsPage::TestSettingsPage(TestSettings *settings) TestSettingsPage::TestSettingsPage()
{ {
setId(Constants::AUTOTEST_SETTINGS_ID); setId(Constants::AUTOTEST_SETTINGS_ID);
setDisplayName(Tr::tr("General")); setDisplayName(Tr::tr("General"));
setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY);
setDisplayCategory(Tr::tr("Testing")); setDisplayCategory(Tr::tr("Testing"));
setCategoryIconPath(":/autotest/images/settingscategory_autotest.png"); setCategoryIconPath(":/autotest/images/settingscategory_autotest.png");
setWidgetCreator([settings] { return new TestSettingsWidget(settings); }); setWidgetCreator([] { return new TestSettingsWidget; });
} }
} // Autotest::Internal } // Autotest::Internal

View File

@@ -7,12 +7,10 @@
namespace Autotest::Internal { namespace Autotest::Internal {
struct TestSettings;
class TestSettingsPage : public Core::IOptionsPage class TestSettingsPage : public Core::IOptionsPage
{ {
public: public:
explicit TestSettingsPage(TestSettings *settings); TestSettingsPage();
}; };
} // Autotest::Internal } // Autotest::Internal