forked from qt-creator/qt-creator
Autotest: Move Test{FrameWorkManager,Runner} singletons
Make them plugin-pimpl data members, removing some indirections. Change-Id: Ie441ac94a27f07342513b0b5b1437ccfe4b5d7d2 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -89,7 +89,6 @@ public:
|
|||||||
AutotestPluginPrivate();
|
AutotestPluginPrivate();
|
||||||
~AutotestPluginPrivate() override;
|
~AutotestPluginPrivate() override;
|
||||||
|
|
||||||
TestFrameworkManager *m_frameworkManager = nullptr;
|
|
||||||
TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr;
|
TestNavigationWidgetFactory *m_navigationWidgetFactory = nullptr;
|
||||||
TestResultsPane *m_resultsPane = nullptr;
|
TestResultsPane *m_resultsPane = nullptr;
|
||||||
QMap<QString, ChoicePair> m_runconfigCache;
|
QMap<QString, ChoicePair> m_runconfigCache;
|
||||||
@@ -105,6 +104,8 @@ public:
|
|||||||
|
|
||||||
TestCodeParser m_testCodeParser;
|
TestCodeParser m_testCodeParser;
|
||||||
TestTreeModel m_testTreeModel{&m_testCodeParser};
|
TestTreeModel m_testTreeModel{&m_testCodeParser};
|
||||||
|
TestRunner m_testRunner;
|
||||||
|
TestFrameworkManager m_frameworkManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
static AutotestPluginPrivate *dd = nullptr;
|
static AutotestPluginPrivate *dd = nullptr;
|
||||||
@@ -127,14 +128,13 @@ AutotestPlugin::~AutotestPlugin()
|
|||||||
AutotestPluginPrivate::AutotestPluginPrivate()
|
AutotestPluginPrivate::AutotestPluginPrivate()
|
||||||
{
|
{
|
||||||
dd = this; // Needed as the code below access it via the static plugin interface
|
dd = this; // Needed as the code below access it via the static plugin interface
|
||||||
m_frameworkManager = TestFrameworkManager::instance();
|
|
||||||
initializeMenuEntries();
|
initializeMenuEntries();
|
||||||
m_frameworkManager->registerTestFramework(new QtTestFramework);
|
m_frameworkManager.registerTestFramework(new QtTestFramework);
|
||||||
m_frameworkManager->registerTestFramework(new QuickTestFramework);
|
m_frameworkManager.registerTestFramework(new QuickTestFramework);
|
||||||
m_frameworkManager->registerTestFramework(new GTestFramework);
|
m_frameworkManager.registerTestFramework(new GTestFramework);
|
||||||
m_frameworkManager->registerTestFramework(new BoostTestFramework);
|
m_frameworkManager.registerTestFramework(new BoostTestFramework);
|
||||||
|
|
||||||
m_frameworkManager->synchronizeSettings(ICore::settings());
|
m_frameworkManager.synchronizeSettings(ICore::settings());
|
||||||
m_navigationWidgetFactory = new TestNavigationWidgetFactory;
|
m_navigationWidgetFactory = new TestNavigationWidgetFactory;
|
||||||
m_resultsPane = TestResultsPane::instance();
|
m_resultsPane = TestResultsPane::instance();
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ AutotestPluginPrivate::AutotestPluginPrivate()
|
|||||||
});
|
});
|
||||||
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
|
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
|
||||||
|
|
||||||
m_frameworkManager->activateFrameworksFromSettings(&m_settings);
|
m_frameworkManager.activateFrameworksFromSettings(&m_settings);
|
||||||
m_testTreeModel.synchronizeTestFrameworks();
|
m_testTreeModel.synchronizeTestFrameworks();
|
||||||
|
|
||||||
auto sessionManager = ProjectExplorer::SessionManager::instance();
|
auto sessionManager = ProjectExplorer::SessionManager::instance();
|
||||||
@@ -173,7 +173,6 @@ AutotestPluginPrivate::~AutotestPluginPrivate()
|
|||||||
|
|
||||||
delete m_navigationWidgetFactory;
|
delete m_navigationWidgetFactory;
|
||||||
delete m_resultsPane;
|
delete m_resultsPane;
|
||||||
delete m_frameworkManager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TestSettings *AutotestPlugin::settings()
|
TestSettings *AutotestPlugin::settings()
|
||||||
@@ -298,16 +297,14 @@ ExtensionSystem::IPlugin::ShutdownFlag AutotestPlugin::aboutToShutdown()
|
|||||||
|
|
||||||
void AutotestPluginPrivate::onRunAllTriggered()
|
void AutotestPluginPrivate::onRunAllTriggered()
|
||||||
{
|
{
|
||||||
TestRunner *runner = TestRunner::instance();
|
m_testRunner.setSelectedTests(m_testTreeModel.getAllTestCases());
|
||||||
runner->setSelectedTests(m_testTreeModel.getAllTestCases());
|
m_testRunner.prepareToRunTests(TestRunMode::Run);
|
||||||
runner->prepareToRunTests(TestRunMode::Run);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutotestPluginPrivate::onRunSelectedTriggered()
|
void AutotestPluginPrivate::onRunSelectedTriggered()
|
||||||
{
|
{
|
||||||
TestRunner *runner = TestRunner::instance();
|
m_testRunner.setSelectedTests(m_testTreeModel.getSelectedTests());
|
||||||
runner->setSelectedTests(m_testTreeModel.getSelectedTests());
|
m_testRunner.prepareToRunTests(TestRunMode::Run);
|
||||||
runner->prepareToRunTests(TestRunMode::Run);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutotestPluginPrivate::onRunFileTriggered()
|
void AutotestPluginPrivate::onRunFileTriggered()
|
||||||
@@ -324,9 +321,8 @@ void AutotestPluginPrivate::onRunFileTriggered()
|
|||||||
if (tests.isEmpty())
|
if (tests.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TestRunner *runner = TestRunner::instance();
|
m_testRunner.setSelectedTests(tests);
|
||||||
runner->setSelectedTests(tests);
|
m_testRunner.prepareToRunTests(TestRunMode::Run);
|
||||||
runner->prepareToRunTests(TestRunMode::Run);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static QList<TestConfiguration *> testItemsToTestConfigurations(const QList<TestTreeItem *> &items,
|
static QList<TestConfiguration *> testItemsToTestConfigurations(const QList<TestTreeItem *> &items,
|
||||||
@@ -368,16 +364,15 @@ void AutotestPluginPrivate::onRunUnderCursorTriggered(TestRunMode mode)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto runner = TestRunner::instance();
|
m_testRunner.setSelectedTests(testsToRun);
|
||||||
runner->setSelectedTests(testsToRun);
|
m_testRunner.prepareToRunTests(mode);
|
||||||
runner->prepareToRunTests(mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutotestPlugin::updateMenuItemsEnabledState()
|
void AutotestPlugin::updateMenuItemsEnabledState()
|
||||||
{
|
{
|
||||||
const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
|
const ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
|
||||||
const ProjectExplorer::Target *target = project ? project->activeTarget() : nullptr;
|
const ProjectExplorer::Target *target = project ? project->activeTarget() : nullptr;
|
||||||
const bool canScan = !TestRunner::instance()->isTestRunning()
|
const bool canScan = !dd->m_testRunner.isTestRunning()
|
||||||
&& dd->m_testCodeParser.state() == TestCodeParser::Idle;
|
&& dd->m_testCodeParser.state() == TestCodeParser::Idle;
|
||||||
const bool hasTests = dd->m_testTreeModel.hasTests();
|
const bool hasTests = dd->m_testTreeModel.hasTests();
|
||||||
// avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks
|
// avoid expensive call to PE::canRunStartupProject() - limit to minimum necessary checks
|
||||||
|
@@ -28,7 +28,6 @@
|
|||||||
#include "autotestplugin.h"
|
#include "autotestplugin.h"
|
||||||
#include "iframeworksettings.h"
|
#include "iframeworksettings.h"
|
||||||
#include "itestparser.h"
|
#include "itestparser.h"
|
||||||
#include "testrunner.h"
|
|
||||||
#include "testsettings.h"
|
#include "testsettings.h"
|
||||||
#include "testtreeitem.h"
|
#include "testtreeitem.h"
|
||||||
#include "testtreemodel.h"
|
#include "testtreemodel.h"
|
||||||
@@ -51,21 +50,18 @@ static TestFrameworkManager *s_instance = nullptr;
|
|||||||
|
|
||||||
TestFrameworkManager::TestFrameworkManager()
|
TestFrameworkManager::TestFrameworkManager()
|
||||||
{
|
{
|
||||||
m_testRunner = Internal::TestRunner::instance();
|
|
||||||
s_instance = this;
|
s_instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestFrameworkManager *TestFrameworkManager::instance()
|
TestFrameworkManager *TestFrameworkManager::instance()
|
||||||
{
|
{
|
||||||
if (!s_instance)
|
|
||||||
return new TestFrameworkManager;
|
|
||||||
return s_instance;
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestFrameworkManager::~TestFrameworkManager()
|
TestFrameworkManager::~TestFrameworkManager()
|
||||||
{
|
{
|
||||||
delete m_testRunner;
|
|
||||||
qDeleteAll(m_registeredFrameworks);
|
qDeleteAll(m_registeredFrameworks);
|
||||||
|
s_instance = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestFrameworkManager::registerTestFramework(ITestFramework *framework)
|
bool TestFrameworkManager::registerTestFramework(ITestFramework *framework)
|
||||||
|
@@ -37,18 +37,20 @@ namespace Core { class Id; }
|
|||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
class TestRunner;
|
|
||||||
struct TestSettings;
|
struct TestSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
class IFrameworkSettings;
|
class IFrameworkSettings;
|
||||||
class ITestParser;
|
class ITestParser;
|
||||||
|
|
||||||
class TestFrameworkManager
|
class TestFrameworkManager final
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
TestFrameworkManager();
|
||||||
|
~TestFrameworkManager();
|
||||||
|
|
||||||
static TestFrameworkManager *instance();
|
static TestFrameworkManager *instance();
|
||||||
virtual ~TestFrameworkManager();
|
|
||||||
|
|
||||||
static ITestFramework *frameworkForId(Core::Id frameworkId);
|
static ITestFramework *frameworkForId(Core::Id frameworkId);
|
||||||
|
|
||||||
@@ -65,10 +67,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
TestFrameworks activeFrameworks() const;
|
TestFrameworks activeFrameworks() const;
|
||||||
explicit TestFrameworkManager();
|
|
||||||
|
|
||||||
TestFrameworks m_registeredFrameworks;
|
TestFrameworks m_registeredFrameworks;
|
||||||
Internal::TestRunner *m_testRunner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Autotest
|
} // namespace Autotest
|
||||||
|
@@ -82,14 +82,13 @@ static TestRunner *s_instance = nullptr;
|
|||||||
|
|
||||||
TestRunner *TestRunner::instance()
|
TestRunner *TestRunner::instance()
|
||||||
{
|
{
|
||||||
if (!s_instance)
|
|
||||||
s_instance = new TestRunner;
|
|
||||||
return s_instance;
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestRunner::TestRunner(QObject *parent) :
|
TestRunner::TestRunner()
|
||||||
QObject(parent)
|
|
||||||
{
|
{
|
||||||
|
s_instance = this;
|
||||||
|
|
||||||
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::resultReadyAt,
|
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::resultReadyAt,
|
||||||
this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); });
|
this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); });
|
||||||
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::finished,
|
connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::finished,
|
||||||
|
@@ -53,14 +53,17 @@ enum class TestRunMode;
|
|||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class AUTOTESTSHARED_EXPORT TestRunner : public QObject
|
class AUTOTESTSHARED_EXPORT TestRunner final : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
TestRunner();
|
||||||
|
~TestRunner() final;
|
||||||
|
|
||||||
enum CancelReason { UserCanceled, Timeout, KitChanged };
|
enum CancelReason { UserCanceled, Timeout, KitChanged };
|
||||||
|
|
||||||
static TestRunner* instance();
|
static TestRunner* instance();
|
||||||
~TestRunner() override;
|
|
||||||
|
|
||||||
void setSelectedTests(const QList<TestConfiguration *> &selected);
|
void setSelectedTests(const QList<TestConfiguration *> &selected);
|
||||||
void runTest(TestRunMode mode, const TestTreeItem *item);
|
void runTest(TestRunMode mode, const TestTreeItem *item);
|
||||||
@@ -92,7 +95,6 @@ private:
|
|||||||
void debugTests();
|
void debugTests();
|
||||||
void runOrDebugTests();
|
void runOrDebugTests();
|
||||||
void reportResult(ResultType type, const QString &description);
|
void reportResult(ResultType type, const QString &description);
|
||||||
explicit TestRunner(QObject *parent = nullptr);
|
|
||||||
bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project);
|
bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project);
|
||||||
void onBuildSystemUpdated();
|
void onBuildSystemUpdated();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user