Autotest: Slim down TestFrameworkManager interface

- sort frameworks at insertion time
- apply the 'static' pattern
- inline code from convenience functions that are only used once on
  the caller side

Change-Id: Ic4a46ad9487c58b4dfd61658a6fccebb88a428a9
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2020-03-26 12:01:59 +01:00
parent 77c4caf4ea
commit 78235d63b4
7 changed files with 29 additions and 77 deletions

View File

@@ -27,21 +27,13 @@
#include "autotestconstants.h" #include "autotestconstants.h"
#include "autotestplugin.h" #include "autotestplugin.h"
#include "iframeworksettings.h" #include "iframeworksettings.h"
#include "itestparser.h"
#include "testsettings.h" #include "testsettings.h"
#include "testtreeitem.h"
#include "testtreemodel.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QLoggingCategory>
#include <QSettings> #include <QSettings>
static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.frameworkmanager", QtWarningMsg)
using namespace Core; using namespace Core;
namespace Autotest { namespace Autotest {
@@ -53,11 +45,6 @@ TestFrameworkManager::TestFrameworkManager()
s_instance = this; s_instance = this;
} }
TestFrameworkManager *TestFrameworkManager::instance()
{
return s_instance;
}
TestFrameworkManager::~TestFrameworkManager() TestFrameworkManager::~TestFrameworkManager()
{ {
qDeleteAll(m_registeredFrameworks); qDeleteAll(m_registeredFrameworks);
@@ -70,46 +57,21 @@ bool TestFrameworkManager::registerTestFramework(ITestFramework *framework)
QTC_ASSERT(!m_registeredFrameworks.contains(framework), return false); QTC_ASSERT(!m_registeredFrameworks.contains(framework), return false);
// TODO check for unique priority before registering // TODO check for unique priority before registering
m_registeredFrameworks.append(framework); m_registeredFrameworks.append(framework);
Utils::sort(m_registeredFrameworks, &ITestFramework::priority);
return true; return true;
} }
void TestFrameworkManager::activateFrameworksFromSettings(const Internal::TestSettings *settings) void TestFrameworkManager::activateFrameworksFromSettings(const Internal::TestSettings *settings)
{ {
for (ITestFramework *framework : qAsConst(m_registeredFrameworks)) { for (ITestFramework *framework : qAsConst(s_instance->m_registeredFrameworks)) {
framework->setActive(settings->frameworks.value(framework->id(), false)); framework->setActive(settings->frameworks.value(framework->id(), false));
framework->setGrouping(settings->frameworksGrouping.value(framework->id(), false)); framework->setGrouping(settings->frameworksGrouping.value(framework->id(), false));
} }
} }
TestFrameworks TestFrameworkManager::registeredFrameworks() const TestFrameworks TestFrameworkManager::registeredFrameworks()
{ {
return m_registeredFrameworks; return s_instance->m_registeredFrameworks;
}
TestFrameworks TestFrameworkManager::sortedRegisteredFrameworks() const
{
TestFrameworks registered = m_registeredFrameworks;
Utils::sort(registered, &ITestFramework::priority);
qCDebug(LOG) << "Registered frameworks sorted by priority" << registered;
return registered;
}
TestFrameworks TestFrameworkManager::activeFrameworks() const
{
TestFrameworks active;
for (ITestFramework *framework : qAsConst(m_registeredFrameworks)) {
if (framework->active())
active.append(framework);
}
return active;
}
TestFrameworks TestFrameworkManager::sortedActiveFrameworks() const
{
TestFrameworks active = activeFrameworks();
Utils::sort(active, &ITestFramework::priority);
qCDebug(LOG) << "Active frameworks sorted by priority" << active;
return active;
} }
ITestFramework *TestFrameworkManager::frameworkForId(Id frameworkId) ITestFramework *TestFrameworkManager::frameworkForId(Id frameworkId)
@@ -129,11 +91,6 @@ void TestFrameworkManager::synchronizeSettings(QSettings *s)
} }
} }
bool TestFrameworkManager::hasActiveFrameworks() const
{
return Utils::anyOf(m_registeredFrameworks, &ITestFramework::active);
}
Id ITestFramework::settingsId() const Id ITestFramework::settingsId() const
{ {
return Core::Id(Constants::SETTINGSPAGE_PREFIX) return Core::Id(Constants::SETTINGSPAGE_PREFIX)

View File

@@ -27,8 +27,6 @@
#include "itestframework.h" #include "itestframework.h"
#include <QHash>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QSettings; class QSettings;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -40,9 +38,6 @@ namespace Internal {
struct TestSettings; struct TestSettings;
} }
class IFrameworkSettings;
class ITestParser;
class TestFrameworkManager final class TestFrameworkManager final
{ {
@@ -50,23 +45,14 @@ public:
TestFrameworkManager(); TestFrameworkManager();
~TestFrameworkManager(); ~TestFrameworkManager();
static TestFrameworkManager *instance(); bool registerTestFramework(ITestFramework *framework);
void synchronizeSettings(QSettings *s);
static ITestFramework *frameworkForId(Core::Id frameworkId); static ITestFramework *frameworkForId(Core::Id frameworkId);
static void activateFrameworksFromSettings(const Internal::TestSettings *settings);
bool registerTestFramework(ITestFramework *framework); static TestFrameworks registeredFrameworks();
void activateFrameworksFromSettings(const Internal::TestSettings *settings);
TestFrameworks registeredFrameworks() const;
TestFrameworks sortedRegisteredFrameworks() const;
TestFrameworks sortedActiveFrameworks() const;
void synchronizeSettings(QSettings *s);
bool hasActiveFrameworks() const;
private: private:
TestFrameworks activeFrameworks() const;
TestFrameworks m_registeredFrameworks; TestFrameworks m_registeredFrameworks;
}; };

View File

@@ -76,7 +76,9 @@ TestNavigationWidget::TestNavigationWidget(QWidget *parent) :
QHBoxLayout *hLayout = new QHBoxLayout; QHBoxLayout *hLayout = new QHBoxLayout;
m_missingFrameworksWidget->setLayout(hLayout); m_missingFrameworksWidget->setLayout(hLayout);
hLayout->addWidget(new QLabel(tr("No active test frameworks."))); hLayout->addWidget(new QLabel(tr("No active test frameworks.")));
m_missingFrameworksWidget->setVisible(!TestFrameworkManager::instance()->hasActiveFrameworks()); const bool hasActiveFrameworks = Utils::anyOf(TestFrameworkManager::registeredFrameworks(),
&ITestFramework::active);
m_missingFrameworksWidget->setVisible(!hasActiveFrameworks);
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0); layout->setSpacing(0);

View File

@@ -36,6 +36,8 @@ namespace Internal {
static const char SK_ACTIVE_FRAMEWORKS[] = "AutoTest.ActiveFrameworks"; static const char SK_ACTIVE_FRAMEWORKS[] = "AutoTest.ActiveFrameworks";
static const char SK_RUN_AFTER_BUILD[] = "AutoTest.RunAfterBuild"; static const char SK_RUN_AFTER_BUILD[] = "AutoTest.RunAfterBuild";
static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.frameworkmanager", QtWarningMsg)
TestProjectSettings::TestProjectSettings(ProjectExplorer::Project *project) TestProjectSettings::TestProjectSettings(ProjectExplorer::Project *project)
: m_project(project) : m_project(project)
{ {
@@ -60,7 +62,7 @@ void TestProjectSettings::setUseGlobalSettings(bool useGlobal)
void TestProjectSettings::activateFramework(const Core::Id &id, bool activate) void TestProjectSettings::activateFramework(const Core::Id &id, bool activate)
{ {
ITestFramework *framework = TestFrameworkManager::instance()->frameworkForId(id); ITestFramework *framework = TestFrameworkManager::frameworkForId(id);
m_activeTestFrameworks[framework] = activate; m_activeTestFrameworks[framework] = activate;
if (!activate) if (!activate)
framework->resetRootNode(); framework->resetRootNode();
@@ -71,8 +73,8 @@ void TestProjectSettings::load()
const QVariant useGlobal = m_project->namedSettings(Constants::SK_USE_GLOBAL); const QVariant useGlobal = m_project->namedSettings(Constants::SK_USE_GLOBAL);
m_useGlobalSettings = useGlobal.isValid() ? useGlobal.toBool() : true; m_useGlobalSettings = useGlobal.isValid() ? useGlobal.toBool() : true;
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance(); const TestFrameworks registered = TestFrameworkManager::registeredFrameworks();
const TestFrameworks registered = frameworkManager->sortedRegisteredFrameworks(); qCDebug(LOG) << "Registered frameworks sorted by priority" << registered;
const QVariant activeFrameworks = m_project->namedSettings(SK_ACTIVE_FRAMEWORKS); const QVariant activeFrameworks = m_project->namedSettings(SK_ACTIVE_FRAMEWORKS);
m_activeTestFrameworks.clear(); m_activeTestFrameworks.clear();

View File

@@ -92,8 +92,7 @@ void TestSettings::fromSettings(QSettings *s)
runAfterBuild = RunAfterBuildMode(s->value(runAfterBuildKey, runAfterBuild = RunAfterBuildMode(s->value(runAfterBuildKey,
int(RunAfterBuildMode::None)).toInt()); int(RunAfterBuildMode::None)).toInt());
// try to get settings for registered frameworks // try to get settings for registered frameworks
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance(); const TestFrameworks &registered = TestFrameworkManager::registeredFrameworks();
const TestFrameworks &registered = frameworkManager->registeredFrameworks();
frameworks.clear(); frameworks.clear();
frameworksGrouping.clear(); frameworksGrouping.clear();
for (const ITestFramework *framework : registered) { for (const ITestFramework *framework : registered) {

View File

@@ -93,8 +93,7 @@ TestSettings TestSettingsWidget::settings() const
void TestSettingsWidget::populateFrameworksListWidget(const QHash<Core::Id, bool> &frameworks) void TestSettingsWidget::populateFrameworksListWidget(const QHash<Core::Id, bool> &frameworks)
{ {
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance(); const TestFrameworks &registered = TestFrameworkManager::registeredFrameworks();
const TestFrameworks &registered = frameworkManager->sortedRegisteredFrameworks();
m_ui.frameworkTreeWidget->clear(); m_ui.frameworkTreeWidget->clear();
for (const ITestFramework *framework : registered) { for (const ITestFramework *framework : registered) {
const Core::Id id = framework->id(); const Core::Id id = framework->id();
@@ -169,8 +168,12 @@ void TestSettingsPage::apply()
}); });
*m_settings = newSettings; *m_settings = newSettings;
m_settings->toSettings(Core::ICore::settings()); m_settings->toSettings(Core::ICore::settings());
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
frameworkManager->activateFrameworksFromSettings(m_settings); for (ITestFramework *framework : TestFrameworkManager::registeredFrameworks()) {
framework->setActive(m_settings->frameworks.value(framework->id(), false));
framework->setGrouping(m_settings->frameworksGrouping.value(framework->id(), false));
}
TestTreeModel::instance()->synchronizeTestFrameworks(); TestTreeModel::instance()->synchronizeTestFrameworks();
if (!changedIds.isEmpty()) if (!changedIds.isEmpty())
TestTreeModel::instance()->rebuild(changedIds); TestTreeModel::instance()->rebuild(changedIds);

View File

@@ -44,6 +44,8 @@ using namespace Autotest::Internal;
namespace Autotest { namespace Autotest {
static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.frameworkmanager", QtWarningMsg)
static TestTreeModel *s_instance = nullptr; static TestTreeModel *s_instance = nullptr;
TestTreeModel::TestTreeModel(TestCodeParser *parser) : TestTreeModel::TestTreeModel(TestCodeParser *parser) :
@@ -211,11 +213,12 @@ void TestTreeModel::synchronizeTestFrameworks()
{ {
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
TestFrameworks sorted; TestFrameworks sorted;
TestFrameworkManager *manager = TestFrameworkManager::instance();
const QVariant useGlobal = project ? project->namedSettings(Constants::SK_USE_GLOBAL) const QVariant useGlobal = project ? project->namedSettings(Constants::SK_USE_GLOBAL)
: QVariant(); : QVariant();
if (!useGlobal.isValid() || AutotestPlugin::projectSettings(project)->useGlobalSettings()) { if (!useGlobal.isValid() || AutotestPlugin::projectSettings(project)->useGlobalSettings()) {
sorted = manager->sortedActiveFrameworks(); sorted = Utils::filtered(TestFrameworkManager::registeredFrameworks(),
&ITestFramework::active);
qCDebug(LOG) << "Active frameworks sorted by priority" << sorted;
} else { // we've got custom project settings } else { // we've got custom project settings
const TestProjectSettings *settings = AutotestPlugin::projectSettings(project); const TestProjectSettings *settings = AutotestPlugin::projectSettings(project);
const QMap<ITestFramework *, bool> active = settings->activeFrameworks(); const QMap<ITestFramework *, bool> active = settings->activeFrameworks();