forked from qt-creator/qt-creator
AutoTest: Add project based {en|dis}abling of test frameworks
Provide integration into the 'Project' view which allows to set some settings on a per project base. For now only enabling or disabling of test frameworks. Task-number: QTCREATORBUG-16704 Change-Id: Iedd9a300164931e07a21cbb4e5a222be3266c81e Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
committed by
David Schulz
parent
edcd955aad
commit
43e27f76b3
@@ -36,6 +36,7 @@ add_qtc_plugin(AutoTest
|
|||||||
itestframework.h
|
itestframework.h
|
||||||
itestparser.cpp itestparser.h
|
itestparser.cpp itestparser.h
|
||||||
itestsettingspage.h
|
itestsettingspage.h
|
||||||
|
projectsettingswidget.cpp projectsettingswidget.h
|
||||||
qtest/qttest_utils.cpp qtest/qttest_utils.h
|
qtest/qttest_utils.cpp qtest/qttest_utils.h
|
||||||
qtest/qttestconfiguration.cpp qtest/qttestconfiguration.h
|
qtest/qttestconfiguration.cpp qtest/qttestconfiguration.h
|
||||||
qtest/qttestconstants.h
|
qtest/qttestconstants.h
|
||||||
@@ -59,6 +60,7 @@ add_qtc_plugin(AutoTest
|
|||||||
testframeworkmanager.cpp testframeworkmanager.h
|
testframeworkmanager.cpp testframeworkmanager.h
|
||||||
testnavigationwidget.cpp testnavigationwidget.h
|
testnavigationwidget.cpp testnavigationwidget.h
|
||||||
testoutputreader.cpp testoutputreader.h
|
testoutputreader.cpp testoutputreader.h
|
||||||
|
testprojectsettings.cpp testprojectsettings.h
|
||||||
testresult.cpp testresult.h
|
testresult.cpp testresult.h
|
||||||
testresultdelegate.cpp testresultdelegate.h
|
testresultdelegate.cpp testresultdelegate.h
|
||||||
testresultmodel.cpp testresultmodel.h
|
testresultmodel.cpp testresultmodel.h
|
||||||
|
|||||||
@@ -6,23 +6,27 @@ include(../../qtcreatorplugin.pri)
|
|||||||
DEFINES += AUTOTEST_LIBRARY
|
DEFINES += AUTOTEST_LIBRARY
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
testtreeview.cpp \
|
|
||||||
testtreemodel.cpp \
|
|
||||||
testtreeitem.cpp \
|
|
||||||
testcodeparser.cpp \
|
|
||||||
autotestplugin.cpp \
|
autotestplugin.cpp \
|
||||||
testrunner.cpp \
|
itestparser.cpp \
|
||||||
|
projectsettingswidget.cpp \
|
||||||
|
testcodeparser.cpp \
|
||||||
testconfiguration.cpp \
|
testconfiguration.cpp \
|
||||||
testresult.cpp \
|
testeditormark.cpp \
|
||||||
testresultspane.cpp \
|
testframeworkmanager.cpp \
|
||||||
testresultmodel.cpp \
|
|
||||||
testresultdelegate.cpp \
|
|
||||||
testtreeitemdelegate.cpp \
|
|
||||||
testsettings.cpp \
|
|
||||||
testsettingspage.cpp \
|
|
||||||
testnavigationwidget.cpp \
|
testnavigationwidget.cpp \
|
||||||
testoutputreader.cpp \
|
testoutputreader.cpp \
|
||||||
itestparser.cpp \
|
testprojectsettings.cpp \
|
||||||
|
testresult.cpp \
|
||||||
|
testresultdelegate.cpp \
|
||||||
|
testresultmodel.cpp \
|
||||||
|
testresultspane.cpp \
|
||||||
|
testrunner.cpp \
|
||||||
|
testsettings.cpp \
|
||||||
|
testsettingspage.cpp \
|
||||||
|
testtreeitem.cpp \
|
||||||
|
testtreeitemdelegate.cpp \
|
||||||
|
testtreemodel.cpp \
|
||||||
|
testtreeview.cpp \
|
||||||
gtest/gtestconfiguration.cpp \
|
gtest/gtestconfiguration.cpp \
|
||||||
gtest/gtestparser.cpp \
|
gtest/gtestparser.cpp \
|
||||||
gtest/gtesttreeitem.cpp \
|
gtest/gtesttreeitem.cpp \
|
||||||
@@ -57,34 +61,37 @@ SOURCES += \
|
|||||||
boost/boosttestoutputreader.cpp \
|
boost/boosttestoutputreader.cpp \
|
||||||
boost/boosttestresult.cpp \
|
boost/boosttestresult.cpp \
|
||||||
boost/boosttestsettings.cpp \
|
boost/boosttestsettings.cpp \
|
||||||
boost/boosttestsettingspage.cpp \
|
boost/boosttestsettingspage.cpp
|
||||||
testframeworkmanager.cpp \
|
|
||||||
testeditormark.cpp
|
|
||||||
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
testtreeview.h \
|
|
||||||
testtreemodel.h \
|
|
||||||
testtreeitem.h \
|
|
||||||
testcodeparser.h \
|
|
||||||
autotestplugin.h \
|
|
||||||
autotest_global.h \
|
autotest_global.h \
|
||||||
autotestconstants.h \
|
autotestconstants.h \
|
||||||
testrunner.h \
|
autotesticons.h \
|
||||||
|
autotestplugin.h \
|
||||||
|
iframeworksettings.h \
|
||||||
|
itestframework.h \
|
||||||
|
itestparser.h \
|
||||||
|
itestsettingspage.h \
|
||||||
|
projectsettingswidget.h \
|
||||||
|
testcodeparser.h \
|
||||||
testconfiguration.h \
|
testconfiguration.h \
|
||||||
testresult.h \
|
testeditormark.h \
|
||||||
testresultspane.h \
|
testframeworkmanager.h \
|
||||||
testresultmodel.h \
|
|
||||||
testresultdelegate.h \
|
|
||||||
testtreeitemdelegate.h \
|
|
||||||
testsettings.h \
|
|
||||||
testsettingspage.h \
|
|
||||||
testnavigationwidget.h \
|
testnavigationwidget.h \
|
||||||
testoutputreader.h \
|
testoutputreader.h \
|
||||||
autotesticons.h \
|
testprojectsettings.h \
|
||||||
itestframework.h \
|
testresult.h \
|
||||||
iframeworksettings.h \
|
testresultdelegate.h \
|
||||||
itestparser.h \
|
testresultmodel.h \
|
||||||
|
testresultspane.h \
|
||||||
|
testrunconfiguration.h \
|
||||||
|
testrunner.h \
|
||||||
|
testsettings.h \
|
||||||
|
testsettingspage.h \
|
||||||
|
testtreeitem.h \
|
||||||
|
testtreeitemdelegate.h \
|
||||||
|
testtreemodel.h \
|
||||||
|
testtreeview.h \
|
||||||
gtest/gtestconfiguration.h \
|
gtest/gtestconfiguration.h \
|
||||||
gtest/gtestparser.h \
|
gtest/gtestparser.h \
|
||||||
gtest/gtesttreeitem.h \
|
gtest/gtesttreeitem.h \
|
||||||
@@ -122,11 +129,7 @@ HEADERS += \
|
|||||||
boost/boosttestoutputreader.h \
|
boost/boosttestoutputreader.h \
|
||||||
boost/boosttestresult.h \
|
boost/boosttestresult.h \
|
||||||
boost/boosttestsettingspage.h \
|
boost/boosttestsettingspage.h \
|
||||||
boost/boosttestsettings.h \
|
boost/boosttestsettings.h
|
||||||
testframeworkmanager.h \
|
|
||||||
testrunconfiguration.h \
|
|
||||||
itestsettingspage.h \
|
|
||||||
testeditormark.h
|
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
autotest.qrc
|
autotest.qrc
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ QtcPlugin {
|
|||||||
"autotestconstants.h",
|
"autotestconstants.h",
|
||||||
"autotestplugin.cpp",
|
"autotestplugin.cpp",
|
||||||
"autotestplugin.h",
|
"autotestplugin.h",
|
||||||
|
"projectsettingswidget.cpp",
|
||||||
|
"projectsettingswidget.h",
|
||||||
"testcodeparser.cpp",
|
"testcodeparser.cpp",
|
||||||
"testcodeparser.h",
|
"testcodeparser.h",
|
||||||
"testconfiguration.cpp",
|
"testconfiguration.cpp",
|
||||||
@@ -70,6 +72,8 @@ QtcPlugin {
|
|||||||
"testtreeview.h",
|
"testtreeview.h",
|
||||||
"testoutputreader.cpp",
|
"testoutputreader.cpp",
|
||||||
"testoutputreader.h",
|
"testoutputreader.h",
|
||||||
|
"testprojectsettings.cpp",
|
||||||
|
"testprojectsettings.h",
|
||||||
"itestparser.cpp",
|
"itestparser.cpp",
|
||||||
"itestparser.h",
|
"itestparser.h",
|
||||||
"itestframework.h",
|
"itestframework.h",
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ const char FRAMEWORK_PREFIX[] = "AutoTest.Framework.";
|
|||||||
const char SETTINGSPAGE_PREFIX[] = "A.AutoTest.";
|
const char SETTINGSPAGE_PREFIX[] = "A.AutoTest.";
|
||||||
const char SETTINGSGROUP[] = "Autotest";
|
const char SETTINGSGROUP[] = "Autotest";
|
||||||
const char TASK_MARK_ID[] = "Autotest.TaskMark";
|
const char TASK_MARK_ID[] = "Autotest.TaskMark";
|
||||||
|
const char SK_USE_GLOBAL[] = "AutoTest.UseGlobal";
|
||||||
} // namespace Constants
|
} // namespace Constants
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|||||||
@@ -26,8 +26,10 @@
|
|||||||
#include "autotestplugin.h"
|
#include "autotestplugin.h"
|
||||||
#include "autotestconstants.h"
|
#include "autotestconstants.h"
|
||||||
#include "autotesticons.h"
|
#include "autotesticons.h"
|
||||||
|
#include "projectsettingswidget.h"
|
||||||
#include "testcodeparser.h"
|
#include "testcodeparser.h"
|
||||||
#include "testframeworkmanager.h"
|
#include "testframeworkmanager.h"
|
||||||
|
#include "testprojectsettings.h"
|
||||||
#include "testrunner.h"
|
#include "testrunner.h"
|
||||||
#include "testsettings.h"
|
#include "testsettings.h"
|
||||||
#include "testsettingspage.h"
|
#include "testsettingspage.h"
|
||||||
@@ -54,6 +56,7 @@
|
|||||||
#include <projectexplorer/buildmanager.h>
|
#include <projectexplorer/buildmanager.h>
|
||||||
#include <projectexplorer/projectexplorer.h>
|
#include <projectexplorer/projectexplorer.h>
|
||||||
#include <projectexplorer/projectexplorericons.h>
|
#include <projectexplorer/projectexplorericons.h>
|
||||||
|
#include <projectexplorer/projectpanelfactory.h>
|
||||||
#include <projectexplorer/runconfiguration.h>
|
#include <projectexplorer/runconfiguration.h>
|
||||||
#include <projectexplorer/session.h>
|
#include <projectexplorer/session.h>
|
||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
@@ -78,6 +81,7 @@ using namespace Autotest::Internal;
|
|||||||
using namespace Core;
|
using namespace Core;
|
||||||
|
|
||||||
static AutotestPlugin *s_instance = nullptr;
|
static AutotestPlugin *s_instance = nullptr;
|
||||||
|
static QHash<ProjectExplorer::Project *, TestProjectSettings *> s_projectSettings;
|
||||||
|
|
||||||
AutotestPlugin::AutotestPlugin()
|
AutotestPlugin::AutotestPlugin()
|
||||||
: m_settings(new TestSettings)
|
: m_settings(new TestSettings)
|
||||||
@@ -103,6 +107,15 @@ QSharedPointer<TestSettings> AutotestPlugin::settings()
|
|||||||
return s_instance->m_settings;
|
return s_instance->m_settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestProjectSettings *AutotestPlugin::projectSettings(ProjectExplorer::Project *project)
|
||||||
|
{
|
||||||
|
auto &settings = s_projectSettings[project];
|
||||||
|
if (!settings)
|
||||||
|
settings = new TestProjectSettings(project);
|
||||||
|
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
void AutotestPlugin::initializeMenuEntries()
|
void AutotestPlugin::initializeMenuEntries()
|
||||||
{
|
{
|
||||||
ActionContainer *menu = ActionManager::createMenu(Constants::MENU_ID);
|
ActionContainer *menu = ActionManager::createMenu(Constants::MENU_ID);
|
||||||
@@ -184,13 +197,27 @@ bool AutotestPlugin::initialize(const QStringList &arguments, QString *errorStri
|
|||||||
m_navigationWidgetFactory = new TestNavigationWidgetFactory;
|
m_navigationWidgetFactory = new TestNavigationWidgetFactory;
|
||||||
m_resultsPane = TestResultsPane::instance();
|
m_resultsPane = TestResultsPane::instance();
|
||||||
|
|
||||||
|
auto panelFactory = new ProjectExplorer::ProjectPanelFactory();
|
||||||
|
panelFactory->setPriority(666);
|
||||||
|
// panelFactory->setIcon(); // TODO ?
|
||||||
|
panelFactory->setDisplayName(tr("Testing"));
|
||||||
|
panelFactory->setCreateWidgetFunction([](ProjectExplorer::Project *project) {
|
||||||
|
return new ProjectTestSettingsWidget(project);
|
||||||
|
});
|
||||||
|
ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory);
|
||||||
|
|
||||||
m_frameworkManager->activateFrameworksFromSettings(m_settings);
|
m_frameworkManager->activateFrameworksFromSettings(m_settings);
|
||||||
TestTreeModel::instance()->syncTestFrameworks();
|
TestTreeModel::instance()->scheduleTestFrameworksSync(true);
|
||||||
|
|
||||||
connect(ProjectExplorer::SessionManager::instance(),
|
connect(ProjectExplorer::SessionManager::instance(),
|
||||||
&ProjectExplorer::SessionManager::startupProjectChanged, this, [this] {
|
&ProjectExplorer::SessionManager::startupProjectChanged, this, [this] {
|
||||||
m_runconfigCache.clear();
|
m_runconfigCache.clear();
|
||||||
});
|
});
|
||||||
|
connect(ProjectExplorer::SessionManager::instance(),
|
||||||
|
&ProjectExplorer::SessionManager::aboutToRemoveProject,
|
||||||
|
this, [] (ProjectExplorer::Project *project) {
|
||||||
|
delete s_projectSettings.take(project);
|
||||||
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,17 @@
|
|||||||
|
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
namespace ProjectExplorer { class RunConfiguration; }
|
namespace ProjectExplorer {
|
||||||
|
class Project;
|
||||||
|
class RunConfiguration;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class TestFrameworkManager;
|
class TestFrameworkManager;
|
||||||
class TestNavigationWidgetFactory;
|
class TestNavigationWidgetFactory;
|
||||||
|
class TestProjectSettings;
|
||||||
class TestResultsPane;
|
class TestResultsPane;
|
||||||
struct TestSettings;
|
struct TestSettings;
|
||||||
class TestSettingsPage;
|
class TestSettingsPage;
|
||||||
@@ -67,6 +71,7 @@ public:
|
|||||||
ShutdownFlag aboutToShutdown() override;
|
ShutdownFlag aboutToShutdown() override;
|
||||||
|
|
||||||
static QSharedPointer<TestSettings> settings();
|
static QSharedPointer<TestSettings> settings();
|
||||||
|
static TestProjectSettings *projectSettings(ProjectExplorer::Project *project);
|
||||||
static void updateMenuItemsEnabledState();
|
static void updateMenuItemsEnabledState();
|
||||||
static void cacheRunConfigChoice(const QString &buildTargetKey, const ChoicePair &choice);
|
static void cacheRunConfigChoice(const QString &buildTargetKey, const ChoicePair &choice);
|
||||||
static ChoicePair cachedChoiceFor(const QString &buildTargetKey);
|
static ChoicePair cachedChoiceFor(const QString &buildTargetKey);
|
||||||
|
|||||||
110
src/plugins/autotest/projectsettingswidget.cpp
Normal file
110
src/plugins/autotest/projectsettingswidget.cpp
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2019 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "autotestplugin.h"
|
||||||
|
#include "projectsettingswidget.h"
|
||||||
|
#include "testframeworkmanager.h"
|
||||||
|
#include "testprojectsettings.h"
|
||||||
|
|
||||||
|
#include <QBoxLayout>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QTreeWidget>
|
||||||
|
|
||||||
|
namespace Autotest {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
enum ItemDataRole { FrameworkIdRole = Qt::UserRole + 1 };
|
||||||
|
|
||||||
|
static QSpacerItem *createSpacer(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
|
||||||
|
{
|
||||||
|
return new QSpacerItem(20, 10, horizontal, vertical);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProjectTestSettingsWidget::ProjectTestSettingsWidget(ProjectExplorer::Project *project,
|
||||||
|
QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, m_projectSettings(AutotestPlugin::projectSettings(project))
|
||||||
|
{
|
||||||
|
auto verticalLayout = new QVBoxLayout(this);
|
||||||
|
m_useGlobalSettings = new QComboBox;
|
||||||
|
m_useGlobalSettings->addItem(tr("Global"));
|
||||||
|
m_useGlobalSettings->addItem(tr("Custom"));
|
||||||
|
|
||||||
|
auto generalWidget = new QWidget;
|
||||||
|
auto groupBoxLayout = new QVBoxLayout;
|
||||||
|
m_activeFrameworks = new QTreeWidget;
|
||||||
|
m_activeFrameworks->setHeaderHidden(true);
|
||||||
|
m_activeFrameworks->setRootIsDecorated(false);
|
||||||
|
groupBoxLayout->addWidget(new QLabel(tr("Active frameworks:")));
|
||||||
|
groupBoxLayout->addWidget(m_activeFrameworks);
|
||||||
|
generalWidget->setLayout(groupBoxLayout);
|
||||||
|
|
||||||
|
auto horizontalLayout = new QHBoxLayout;
|
||||||
|
horizontalLayout->addWidget(m_useGlobalSettings);
|
||||||
|
horizontalLayout->addItem(createSpacer(QSizePolicy::Expanding, QSizePolicy::Minimum));
|
||||||
|
verticalLayout->addLayout(horizontalLayout);
|
||||||
|
horizontalLayout = new QHBoxLayout;
|
||||||
|
verticalLayout->addItem(createSpacer(QSizePolicy::Minimum, QSizePolicy::Fixed));
|
||||||
|
horizontalLayout->addWidget(generalWidget);
|
||||||
|
horizontalLayout->addItem(createSpacer(QSizePolicy::Expanding, QSizePolicy::Minimum));
|
||||||
|
verticalLayout->addLayout(horizontalLayout);
|
||||||
|
verticalLayout->addItem(createSpacer(QSizePolicy::Minimum, QSizePolicy::Expanding));
|
||||||
|
|
||||||
|
m_useGlobalSettings->setCurrentIndex(m_projectSettings->useGlobalSettings() ? 0 : 1);
|
||||||
|
generalWidget->setDisabled(m_projectSettings->useGlobalSettings());
|
||||||
|
|
||||||
|
populateFrameworks(m_projectSettings->activeFrameworks());
|
||||||
|
|
||||||
|
connect(m_useGlobalSettings, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||||
|
this, [this, generalWidget](int index) {
|
||||||
|
generalWidget->setEnabled(index != 0);
|
||||||
|
m_projectSettings->setUseGlobalSettings(index == 0);
|
||||||
|
});
|
||||||
|
connect(m_activeFrameworks, &QTreeWidget::itemChanged,
|
||||||
|
this, &ProjectTestSettingsWidget::onActiveFrameworkChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTestSettingsWidget::populateFrameworks(const QMap<Core::Id, bool> &frameworks)
|
||||||
|
{
|
||||||
|
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
||||||
|
auto end = frameworks.cend();
|
||||||
|
for (auto it = frameworks.cbegin(); it != end; ++it) {
|
||||||
|
auto *item = new QTreeWidgetItem(m_activeFrameworks,
|
||||||
|
QStringList(frameworkManager->frameworkNameForId(it.key())));
|
||||||
|
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(0, it.value() ? Qt::Checked : Qt::Unchecked);
|
||||||
|
item->setData(0, FrameworkIdRole, it.key().toSetting());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectTestSettingsWidget::onActiveFrameworkChanged(QTreeWidgetItem *item, int column)
|
||||||
|
{
|
||||||
|
auto id = Core::Id::fromSetting(item->data(column, FrameworkIdRole));
|
||||||
|
m_projectSettings->activateFramework(id, item->data(0, Qt::CheckStateRole) == Qt::Checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Autotest
|
||||||
59
src/plugins/autotest/projectsettingswidget.h
Normal file
59
src/plugins/autotest/projectsettingswidget.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2019 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QComboBox;
|
||||||
|
class QTreeWidget;
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace Core { class Id; }
|
||||||
|
namespace ProjectExplorer { class Project; }
|
||||||
|
|
||||||
|
namespace Autotest {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class TestProjectSettings;
|
||||||
|
|
||||||
|
class ProjectTestSettingsWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit ProjectTestSettingsWidget(ProjectExplorer::Project *project,
|
||||||
|
QWidget *parent = nullptr);
|
||||||
|
private:
|
||||||
|
void populateFrameworks(const QMap<Core::Id, bool> &frameworks);
|
||||||
|
void onActiveFrameworkChanged(QTreeWidgetItem *item, int column);
|
||||||
|
TestProjectSettings *m_projectSettings;
|
||||||
|
QComboBox *m_useGlobalSettings = nullptr;
|
||||||
|
QTreeWidget *m_activeFrameworks = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Autotest
|
||||||
103
src/plugins/autotest/testprojectsettings.cpp
Normal file
103
src/plugins/autotest/testprojectsettings.cpp
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2019 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testprojectsettings.h"
|
||||||
|
#include "autotestconstants.h"
|
||||||
|
#include "testframeworkmanager.h"
|
||||||
|
|
||||||
|
#include <projectexplorer/session.h>
|
||||||
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
|
namespace Autotest {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
static const char SK_ACTIVE_FRAMEWORKS[] = "AutoTest.ActiveFrameworks";
|
||||||
|
|
||||||
|
TestProjectSettings::TestProjectSettings(ProjectExplorer::Project *project)
|
||||||
|
: m_project(project)
|
||||||
|
{
|
||||||
|
load();
|
||||||
|
connect(project, &ProjectExplorer::Project::settingsLoaded,
|
||||||
|
this, &TestProjectSettings::load);
|
||||||
|
connect(project, &ProjectExplorer::Project::aboutToSaveSettings,
|
||||||
|
this, &TestProjectSettings::save);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestProjectSettings::~TestProjectSettings()
|
||||||
|
{
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestProjectSettings::setUseGlobalSettings(bool useGlobal)
|
||||||
|
{
|
||||||
|
if (m_useGlobalSettings == useGlobal)
|
||||||
|
return;
|
||||||
|
m_useGlobalSettings = useGlobal;
|
||||||
|
TestTreeModel::instance()->scheduleTestFrameworksSync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestProjectSettings::activateFramework(const Core::Id &id, bool activate)
|
||||||
|
{
|
||||||
|
if (m_activeTestFrameworks.value(id) != activate) {
|
||||||
|
m_activeTestFrameworks[id] = activate;
|
||||||
|
TestTreeModel::instance()->scheduleTestFrameworksSync(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestProjectSettings::load()
|
||||||
|
{
|
||||||
|
const QVariant useGlobal = m_project->namedSettings(Constants::SK_USE_GLOBAL);
|
||||||
|
m_useGlobalSettings = useGlobal.isValid() ? useGlobal.toBool() : true;
|
||||||
|
|
||||||
|
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
||||||
|
const QList<Core::Id> registered = frameworkManager->sortedRegisteredFrameworkIds();
|
||||||
|
const QVariant activeFrameworks = m_project->namedSettings(SK_ACTIVE_FRAMEWORKS);
|
||||||
|
|
||||||
|
m_activeTestFrameworks.clear();
|
||||||
|
if (activeFrameworks.isValid()) {
|
||||||
|
const QMap<QString, QVariant> frameworksMap = activeFrameworks.toMap();
|
||||||
|
for (const Core::Id &id : registered) {
|
||||||
|
const QString idStr = id.toString();
|
||||||
|
bool active = frameworksMap.value(idStr, frameworkManager->isActive(id)).toBool();
|
||||||
|
m_activeTestFrameworks.insert(id, active);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const Core::Id &id : registered)
|
||||||
|
m_activeTestFrameworks.insert(id, frameworkManager->isActive(id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestProjectSettings::save()
|
||||||
|
{
|
||||||
|
m_project->setNamedSettings(Constants::SK_USE_GLOBAL, m_useGlobalSettings);
|
||||||
|
QVariantMap activeFrameworks;
|
||||||
|
auto end = m_activeTestFrameworks.cend();
|
||||||
|
for (auto it = m_activeTestFrameworks.cbegin(); it != end; ++it)
|
||||||
|
activeFrameworks.insert(it.key().toString(), it.value());
|
||||||
|
m_project->setNamedSettings(SK_ACTIVE_FRAMEWORKS, activeFrameworks);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Autotest
|
||||||
56
src/plugins/autotest/testprojectsettings.h
Normal file
56
src/plugins/autotest/testprojectsettings.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2019 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator.
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <projectexplorer/project.h>
|
||||||
|
|
||||||
|
namespace Autotest {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class TestProjectSettings : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
TestProjectSettings(ProjectExplorer::Project *project);
|
||||||
|
~TestProjectSettings();
|
||||||
|
|
||||||
|
void setUseGlobalSettings(bool useGlobal);
|
||||||
|
bool useGlobalSettings() const { return m_useGlobalSettings; }
|
||||||
|
void setActiveFrameworks(const QMap<Core::Id, bool> enabledFrameworks)
|
||||||
|
{ m_activeTestFrameworks = enabledFrameworks; }
|
||||||
|
QMap<Core::Id, bool> activeFrameworks() const { return m_activeTestFrameworks; }
|
||||||
|
void activateFramework(const Core::Id &id, bool activate);
|
||||||
|
private:
|
||||||
|
void load();
|
||||||
|
void save();
|
||||||
|
|
||||||
|
ProjectExplorer::Project *m_project;
|
||||||
|
bool m_useGlobalSettings = true;
|
||||||
|
QMap<Core::Id, bool> m_activeTestFrameworks;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Autotest
|
||||||
@@ -165,7 +165,6 @@ void TestSettingsPage::apply()
|
|||||||
if (!m_widget) // page was not shown at all
|
if (!m_widget) // page was not shown at all
|
||||||
return;
|
return;
|
||||||
const TestSettings newSettings = m_widget->settings();
|
const TestSettings newSettings = m_widget->settings();
|
||||||
bool frameworkSyncNecessary = newSettings.frameworks != m_settings->frameworks;
|
|
||||||
const QList<Core::Id> changedIds = Utils::filtered(newSettings.frameworksGrouping.keys(),
|
const QList<Core::Id> changedIds = Utils::filtered(newSettings.frameworksGrouping.keys(),
|
||||||
[newSettings, this] (const Core::Id &id) {
|
[newSettings, this] (const Core::Id &id) {
|
||||||
return newSettings.frameworksGrouping[id] != m_settings->frameworksGrouping[id];
|
return newSettings.frameworksGrouping[id] != m_settings->frameworksGrouping[id];
|
||||||
@@ -174,9 +173,8 @@ void TestSettingsPage::apply()
|
|||||||
m_settings->toSettings(Core::ICore::settings());
|
m_settings->toSettings(Core::ICore::settings());
|
||||||
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
||||||
frameworkManager->activateFrameworksFromSettings(m_settings);
|
frameworkManager->activateFrameworksFromSettings(m_settings);
|
||||||
if (frameworkSyncNecessary)
|
TestTreeModel::instance()->scheduleTestFrameworksSync(true);
|
||||||
TestTreeModel::instance()->syncTestFrameworks();
|
if (!changedIds.isEmpty())
|
||||||
else if (!changedIds.isEmpty())
|
|
||||||
TestTreeModel::instance()->rebuild(changedIds);
|
TestTreeModel::instance()->rebuild(changedIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "autotestplugin.h"
|
#include "autotestplugin.h"
|
||||||
#include "testcodeparser.h"
|
#include "testcodeparser.h"
|
||||||
#include "testframeworkmanager.h"
|
#include "testframeworkmanager.h"
|
||||||
|
#include "testprojectsettings.h"
|
||||||
#include "testsettings.h"
|
#include "testsettings.h"
|
||||||
#include "testtreeitem.h"
|
#include "testtreeitem.h"
|
||||||
#include "testtreemodel.h"
|
#include "testtreemodel.h"
|
||||||
@@ -53,6 +54,11 @@ TestTreeModel::TestTreeModel(QObject *parent) :
|
|||||||
this, &TestTreeModel::sweep, Qt::QueuedConnection);
|
this, &TestTreeModel::sweep, Qt::QueuedConnection);
|
||||||
connect(m_parser, &TestCodeParser::parsingFailed,
|
connect(m_parser, &TestCodeParser::parsingFailed,
|
||||||
this, &TestTreeModel::sweep, Qt::QueuedConnection);
|
this, &TestTreeModel::sweep, Qt::QueuedConnection);
|
||||||
|
|
||||||
|
connect(ProjectExplorer::SessionManager::instance(),
|
||||||
|
&ProjectExplorer::SessionManager::startupProjectChanged,
|
||||||
|
this, &TestTreeModel::onStartupProjectChanged);
|
||||||
|
connect(&m_syncFrameworksTimer, &QTimer::timeout, this, &TestTreeModel::syncTestFrameworks);
|
||||||
setupParsingConnections();
|
setupParsingConnections();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,13 +206,55 @@ QList<TestTreeItem *> TestTreeModel::testItemsByName(const QString &testName)
|
|||||||
|
|
||||||
void TestTreeModel::syncTestFrameworks()
|
void TestTreeModel::syncTestFrameworks()
|
||||||
{
|
{
|
||||||
|
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
|
||||||
|
if (!project)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QList<Core::Id> sortedIds;
|
||||||
|
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
||||||
|
const QVariant useGlobal = project->namedSettings(Constants::SK_USE_GLOBAL);
|
||||||
|
if (!useGlobal.isValid() || AutotestPlugin::projectSettings(project)->useGlobalSettings()) {
|
||||||
|
sortedIds = frameworkManager->sortedActiveFrameworkIds();
|
||||||
|
} else { // we've got custom project settings
|
||||||
|
const TestProjectSettings *settings = AutotestPlugin::projectSettings(project);
|
||||||
|
const QMap<Core::Id, bool> active = settings->activeFrameworks();
|
||||||
|
sortedIds = Utils::filtered(active.keys(), [active](const Core::Id &id) {
|
||||||
|
return active.value(id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
syncFrameworks(sortedIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestTreeModel::scheduleTestFrameworksSync(bool immediately)
|
||||||
|
{
|
||||||
|
m_syncFrameworksTimer.start(immediately ? 0 : 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestTreeModel::syncFrameworks(const QList<Core::Id> &sortedIds)
|
||||||
|
{
|
||||||
|
TestFrameworkManager *manager = TestFrameworkManager::instance();
|
||||||
|
// pre-check to avoid further processing when frameworks are unchanged
|
||||||
|
Utils::TreeItem *invisibleRoot = rootItem();
|
||||||
|
const int count = invisibleRoot->childCount();
|
||||||
|
if (count == sortedIds.size()) {
|
||||||
|
bool different = false;
|
||||||
|
QList<Core::Id> registered = manager->sortedRegisteredFrameworkIds();
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
if (manager->rootNodeForTestFramework(sortedIds[i]) != invisibleRoot->childAt(i)) {
|
||||||
|
different = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!different)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// remove all currently registered
|
// remove all currently registered
|
||||||
removeTestRootNodes();
|
removeTestRootNodes();
|
||||||
|
|
||||||
TestFrameworkManager *frameworkManager = TestFrameworkManager::instance();
|
|
||||||
QList<Core::Id> sortedIds = frameworkManager->sortedActiveFrameworkIds();
|
|
||||||
for (const Core::Id &id : sortedIds)
|
for (const Core::Id &id : sortedIds)
|
||||||
rootItem()->appendChild(frameworkManager->rootNodeForTestFramework(id));
|
rootItem()->appendChild(manager->rootNodeForTestFramework(id));
|
||||||
|
|
||||||
m_parser->syncTestFrameworks(sortedIds);
|
m_parser->syncTestFrameworks(sortedIds);
|
||||||
emit updatedActiveFrameworks(sortedIds.size());
|
emit updatedActiveFrameworks(sortedIds.size());
|
||||||
@@ -424,6 +472,12 @@ void TestTreeModel::onParseResultReady(const TestParseResultPtr result)
|
|||||||
handleParseResult(result.data(), rootNode);
|
handleParseResult(result.data(), rootNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestTreeModel::onStartupProjectChanged()
|
||||||
|
{
|
||||||
|
m_syncFrameworksTimer.stop();
|
||||||
|
scheduleTestFrameworksSync(true);
|
||||||
|
}
|
||||||
|
|
||||||
void TestTreeModel::handleParseResult(const TestParseResult *result, TestTreeItem *parentNode)
|
void TestTreeModel::handleParseResult(const TestParseResult *result, TestTreeItem *parentNode)
|
||||||
{
|
{
|
||||||
const bool groupingEnabled =
|
const bool groupingEnabled =
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <utils/treemodel.h>
|
#include <utils/treemodel.h>
|
||||||
|
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -58,7 +59,7 @@ public:
|
|||||||
QList<TestConfiguration *> getSelectedTests() const;
|
QList<TestConfiguration *> getSelectedTests() const;
|
||||||
QList<TestConfiguration *> getTestsForFile(const Utils::FilePath &fileName) const;
|
QList<TestConfiguration *> getTestsForFile(const Utils::FilePath &fileName) const;
|
||||||
QList<TestTreeItem *> testItemsByName(const QString &testName);
|
QList<TestTreeItem *> testItemsByName(const QString &testName);
|
||||||
void syncTestFrameworks();
|
void scheduleTestFrameworksSync(bool immediately);
|
||||||
void rebuild(const QList<Core::Id> &frameworkIds);
|
void rebuild(const QList<Core::Id> &frameworkIds);
|
||||||
|
|
||||||
#ifdef WITH_TESTS
|
#ifdef WITH_TESTS
|
||||||
@@ -87,6 +88,7 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void onParseResultReady(const TestParseResultPtr result);
|
void onParseResultReady(const TestParseResultPtr result);
|
||||||
|
void onStartupProjectChanged();
|
||||||
void handleParseResult(const TestParseResult *result, TestTreeItem *rootNode);
|
void handleParseResult(const TestParseResult *result, TestTreeItem *rootNode);
|
||||||
void removeAllTestItems();
|
void removeAllTestItems();
|
||||||
void removeTestRootNodes();
|
void removeTestRootNodes();
|
||||||
@@ -97,9 +99,12 @@ private:
|
|||||||
explicit TestTreeModel(QObject *parent = nullptr);
|
explicit TestTreeModel(QObject *parent = nullptr);
|
||||||
void setupParsingConnections();
|
void setupParsingConnections();
|
||||||
void filterAndInsert(TestTreeItem *item, TestTreeItem *root, bool groupingEnabled);
|
void filterAndInsert(TestTreeItem *item, TestTreeItem *root, bool groupingEnabled);
|
||||||
|
void syncTestFrameworks();
|
||||||
|
void syncFrameworks(const QList<Core::Id> &sortedIds);
|
||||||
QList<TestTreeItem *> testItemsByName(TestTreeItem *root, const QString &testName);
|
QList<TestTreeItem *> testItemsByName(TestTreeItem *root, const QString &testName);
|
||||||
|
|
||||||
TestCodeParser *m_parser;
|
TestCodeParser *m_parser;
|
||||||
|
QTimer m_syncFrameworksTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TestTreeSortFilterModel : public QSortFilterProxyModel
|
class TestTreeSortFilterModel : public QSortFilterProxyModel
|
||||||
|
|||||||
Reference in New Issue
Block a user