AutoTest: Allow registering ITestTools

Task-number: QTCREATORBUG-23332
Change-Id: I529b1cc1f110739c264c7a021aada063f697b1db
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2020-10-19 14:46:21 +02:00
parent 81f3452e1c
commit c217f0694d
12 changed files with 293 additions and 40 deletions

View File

@@ -48,9 +48,6 @@ TestSettingsWidget::TestSettingsWidget(QWidget *parent)
m_ui.frameworksWarn->setVisible(false);
m_ui.frameworksWarn->setElideMode(Qt::ElideNone);
m_ui.frameworksWarn->setType(Utils::InfoLabel::Warning);
m_ui.frameworksWarn->setText(tr("No active test frameworks."));
m_ui.frameworksWarn->setToolTip(tr("You will not be able to use the AutoTest plugin without "
"having at least one active test framework."));
connect(m_ui.frameworkTreeWidget, &QTreeWidget::itemChanged,
this, &TestSettingsWidget::onFrameworkItemChanged);
connect(m_ui.resetChoicesButton, &QPushButton::clicked,
@@ -72,7 +69,7 @@ void TestSettingsWidget::setSettings(const TestSettings &settings)
m_ui.openResultsOnFinishCB->setChecked(settings.popupOnFinish);
m_ui.openResultsOnFailCB->setChecked(settings.popupOnFail);
m_ui.runAfterBuildCB->setCurrentIndex(int(settings.runAfterBuild));
populateFrameworksListWidget(settings.frameworks);
populateFrameworksListWidget(settings.frameworks, settings.tools);
}
TestSettings TestSettingsWidget::settings() const
@@ -90,10 +87,22 @@ TestSettings TestSettingsWidget::settings() const
result.popupOnFail = m_ui.openResultsOnFailCB->isChecked();
result.runAfterBuild = RunAfterBuildMode(m_ui.runAfterBuildCB->currentIndex());
testSettings(result);
testToolsSettings(result);
return result;
}
void TestSettingsWidget::populateFrameworksListWidget(const QHash<Utils::Id, bool> &frameworks)
namespace {
enum TestBaseInfo
{
BaseId = Qt::UserRole,
BaseType
};
}
void TestSettingsWidget::populateFrameworksListWidget(const QHash<Utils::Id, bool> &frameworks,
const QHash<Utils::Id, bool> &testTools)
{
const TestFrameworks &registered = TestFrameworkManager::registeredFrameworks();
m_ui.frameworkTreeWidget->clear();
@@ -102,7 +111,8 @@ void TestSettingsWidget::populateFrameworksListWidget(const QHash<Utils::Id, boo
auto item = new QTreeWidgetItem(m_ui.frameworkTreeWidget, QStringList(QLatin1String(framework->name())));
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
item->setCheckState(0, frameworks.value(id) ? Qt::Checked : Qt::Unchecked);
item->setData(0, Qt::UserRole, id.toSetting());
item->setData(0, BaseId, id.toSetting());
item->setData(0, BaseType, ITestBase::Framework);
item->setData(1, Qt::CheckStateRole, framework->grouping() ? Qt::Checked : Qt::Unchecked);
item->setToolTip(0, tr("Enable or disable test frameworks to be handled by the AutoTest "
"plugin."));
@@ -111,33 +121,76 @@ void TestSettingsWidget::populateFrameworksListWidget(const QHash<Utils::Id, boo
toolTip = tr("Enable or disable grouping of test cases by folder.");
item->setToolTip(1, toolTip);
}
// ...and now the test tools
const TestTools &registeredTools = TestFrameworkManager::registeredTestTools();
for (const ITestTool *testTool : registeredTools) {
const Utils::Id id = testTool->id();
auto item = new QTreeWidgetItem(m_ui.frameworkTreeWidget, {QLatin1String(testTool->name())});
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
item->setCheckState(0, testTools.value(id) ? Qt::Checked : Qt::Unchecked);
item->setData(0, BaseId, id.toSetting());
item->setData(0, BaseType, ITestBase::Tool);
}
}
void TestSettingsWidget::testSettings(TestSettings &settings) const
{
const QAbstractItemModel *model = m_ui.frameworkTreeWidget->model();
QTC_ASSERT(model, return);
const int itemCount = model->rowCount();
const int itemCount = TestFrameworkManager::registeredFrameworks().size();
QTC_ASSERT(itemCount <= model->rowCount(), return);
for (int row = 0; row < itemCount; ++row) {
QModelIndex idx = model->index(row, 0);
const Utils::Id id = Utils::Id::fromSetting(idx.data(Qt::UserRole));
const Utils::Id id = Utils::Id::fromSetting(idx.data(BaseId));
settings.frameworks.insert(id, idx.data(Qt::CheckStateRole) == Qt::Checked);
idx = model->index(row, 1);
settings.frameworksGrouping.insert(id, idx.data(Qt::CheckStateRole) == Qt::Checked);
}
}
void TestSettingsWidget::testToolsSettings(TestSettings &settings) const
{
const QAbstractItemModel *model = m_ui.frameworkTreeWidget->model();
QTC_ASSERT(model, return);
// frameworks are listed before tools
int row = TestFrameworkManager::registeredFrameworks().size();
const int end = model->rowCount();
QTC_ASSERT(row <= end, return);
for ( ; row < end; ++row) {
const QModelIndex idx = model->index(row, 0);
const Utils::Id id = Utils::Id::fromSetting(idx.data(BaseId));
settings.tools.insert(id, idx.data(Qt::CheckStateRole) == Qt::Checked);
}
}
void TestSettingsWidget::onFrameworkItemChanged()
{
bool atLeastOneEnabled = false;
int mixed = ITestBase::None;
if (QAbstractItemModel *model = m_ui.frameworkTreeWidget->model()) {
for (int row = 0, count = model->rowCount(); row < count; ++row) {
if (model->index(row, 0).data(Qt::CheckStateRole) == Qt::Checked) {
m_ui.frameworksWarn->setVisible(false);
return;
const QModelIndex idx = model->index(row, 0);
if (idx.data(Qt::CheckStateRole) == Qt::Checked) {
atLeastOneEnabled = true;
mixed |= idx.data(BaseType).toInt();
}
}
}
m_ui.frameworksWarn->setVisible(true);
if (!atLeastOneEnabled || (mixed == (ITestBase::Framework | ITestBase::Tool))) {
if (!atLeastOneEnabled) {
m_ui.frameworksWarn->setText(tr("No active test frameworks or tools."));
m_ui.frameworksWarn->setToolTip(tr("You will not be able to use the AutoTest plugin "
"without having at least one active test framework."));
} else {
m_ui.frameworksWarn->setText(tr("Mixing test frameworks and test tools."));
m_ui.frameworksWarn->setToolTip(tr("Mixing test frameworks and test tools can lead "
"to duplicating run information when using e.g. "
"'Run All Tests'."));
}
}
m_ui.frameworksWarn->setVisible(!atLeastOneEnabled
|| (mixed == (ITestBase::Framework | ITestBase::Tool)));
}
TestSettingsPage::TestSettingsPage(TestSettings *settings)
@@ -176,7 +229,11 @@ void TestSettingsPage::apply()
framework->setGrouping(m_settings->frameworksGrouping.value(framework->id(), false));
}
for (ITestTool *testTool : TestFrameworkManager::registeredTestTools())
testTool->setActive(m_settings->tools.value(testTool->id(), false));
TestTreeModel::instance()->synchronizeTestFrameworks();
TestTreeModel::instance()->synchronizeTestTools();
if (!changedIds.isEmpty())
TestTreeModel::instance()->rebuild(changedIds);
}