AutoTest: Allow grouping of results by application

Add an option to group test results by the application
that contains the test cases.

Fixes: QTCREATORBUG-21740
Change-Id: If4e5c8118cd5dd81b1b75891b4eca85b08e76848
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2019-02-01 12:24:56 +01:00
parent a5317cdaa5
commit 1a58a30685
7 changed files with 52 additions and 3 deletions

View File

@@ -55,6 +55,8 @@ TestResult::TestResult(const QString &id, const QString &name)
const QString TestResult::outputString(bool selected) const const QString TestResult::outputString(bool selected) const
{ {
if (m_result == Result::Application)
return m_id;
return selected ? m_description : m_description.split('\n').first(); return selected ? m_description : m_description.split('\n').first();
} }
@@ -145,6 +147,7 @@ QString TestResult::resultToString(const Result::Type type)
case Result::BlacklistedXFail: case Result::BlacklistedXFail:
return QString("BXFAIL"); return QString("BXFAIL");
case Result::MessageLocation: case Result::MessageLocation:
case Result::Application:
return QString(); return QString();
default: default:
if (type >= Result::INTERNAL_MESSAGES_BEGIN && type <= Result::INTERNAL_MESSAGES_END) if (type >= Result::INTERNAL_MESSAGES_BEGIN && type <= Result::INTERNAL_MESSAGES_END)

View File

@@ -67,6 +67,8 @@ enum Type {
MessageIntermediate, MessageIntermediate,
MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest, MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest,
Application,
Invalid, Invalid,
LAST_TYPE = Invalid LAST_TYPE = Invalid
}; };

View File

@@ -24,9 +24,12 @@
****************************************************************************/ ****************************************************************************/
#include "autotesticons.h" #include "autotesticons.h"
#include "autotestplugin.h"
#include "testresultdelegate.h" #include "testresultdelegate.h"
#include "testresultmodel.h" #include "testresultmodel.h"
#include "testsettings.h"
#include <projectexplorer/projectexplorericons.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QFontMetrics> #include <QFontMetrics>
@@ -62,6 +65,7 @@ static QIcon testResultIcon(Result::Type result) {
QIcon(), QIcon(),
Icons::RESULT_MESSAGEPASSWARN.icon(), Icons::RESULT_MESSAGEPASSWARN.icon(),
Icons::RESULT_MESSAGEFAILWARN.icon(), Icons::RESULT_MESSAGEFAILWARN.icon(),
ProjectExplorer::Icons::DESKTOP_DEVICE.icon(), // for now
}; // provide an icon for unknown?? }; // provide an icon for unknown??
if (result < 0 || result >= Result::MessageInternal) { if (result < 0 || result >= Result::MessageInternal) {
@@ -74,6 +78,8 @@ static QIcon testResultIcon(Result::Type result) {
return icons[16]; return icons[16];
case Result::MessageTestCaseFailWarn: case Result::MessageTestCaseFailWarn:
return icons[17]; return icons[17];
case Result::Application:
return icons[18];
default: default:
return QIcon(); return QIcon();
} }
@@ -224,7 +230,32 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx
m_testResultCount[testResult->result()]++; m_testResultCount[testResult->result()]++;
TestResultItem *newItem = new TestResultItem(testResult); TestResultItem *newItem = new TestResultItem(testResult);
TestResultItem *parentItem = findParentItemFor(newItem);
TestResultItem *root = nullptr;
if (AutotestPlugin::settings()->displayApplication) {
const QString application = testResult->id();
if (!application.isEmpty()) {
for (int row = rootItem()->childCount() - 1; row >= 0; --row) {
TestResultItem *tmp = static_cast<TestResultItem *>(rootItem()->childAt(row));
auto tmpTestResult = tmp->testResult();
if (tmpTestResult->id() == application) {
root = tmp;
break;
}
}
if (!root) {
TestResult *tmpAppResult = new TestResult(application, application);
tmpAppResult->setResult(Result::Application);
root = new TestResultItem(TestResultPtr(tmpAppResult));
if (lastRow >= 0)
rootItem()->insertChild(lastRow, root);
else
rootItem()->appendChild(root);
}
}
}
TestResultItem *parentItem = findParentItemFor(newItem, root);
addFileName(testResult->fileName()); // ensure we calculate the results pane correctly addFileName(testResult->fileName()); // ensure we calculate the results pane correctly
if (parentItem) { if (parentItem) {
parentItem->appendChild(newItem); parentItem->appendChild(newItem);
@@ -373,7 +404,7 @@ void TestResultFilterModel::enableAllResultTypes()
<< Result::MessageTestCaseSuccess << Result::MessageTestCaseSuccessWarn << Result::MessageTestCaseSuccess << Result::MessageTestCaseSuccessWarn
<< Result::MessageTestCaseFail << Result::MessageTestCaseFailWarn << Result::MessageTestCaseFail << Result::MessageTestCaseFailWarn
<< Result::MessageTestCaseEnd << Result::MessageTestCaseEnd
<< Result::MessageInfo << Result::MessageSystem; << Result::MessageInfo << Result::MessageSystem << Result::Application;
invalidateFilter(); invalidateFilter();
} }

View File

@@ -42,6 +42,7 @@ static const char autoScrollKey[] = "AutoScrollResults";
static const char filterScanKey[] = "FilterScan"; static const char filterScanKey[] = "FilterScan";
static const char filtersKey[] = "WhiteListFilters"; static const char filtersKey[] = "WhiteListFilters";
static const char processArgsKey[] = "ProcessArgs"; static const char processArgsKey[] = "ProcessArgs";
static const char displayApplicationKey[] = "DisplayApp";
static const char groupSuffix[] = ".group"; static const char groupSuffix[] = ".group";
constexpr int defaultTimeout = 60000; constexpr int defaultTimeout = 60000;
@@ -60,6 +61,7 @@ void TestSettings::toSettings(QSettings *s) const
s->setValue(limitResultOutputKey, limitResultOutput); s->setValue(limitResultOutputKey, limitResultOutput);
s->setValue(autoScrollKey, autoScroll); s->setValue(autoScrollKey, autoScroll);
s->setValue(processArgsKey, processArgs); s->setValue(processArgsKey, processArgs);
s->setValue(displayApplicationKey, displayApplication);
s->setValue(filterScanKey, filterScan); s->setValue(filterScanKey, filterScan);
s->setValue(filtersKey, whiteListFilters); s->setValue(filtersKey, whiteListFilters);
// store frameworks and their current active and grouping state // store frameworks and their current active and grouping state
@@ -79,6 +81,7 @@ void TestSettings::fromSettings(QSettings *s)
limitResultOutput = s->value(limitResultOutputKey, true).toBool(); limitResultOutput = s->value(limitResultOutputKey, true).toBool();
autoScroll = s->value(autoScrollKey, true).toBool(); autoScroll = s->value(autoScrollKey, true).toBool();
processArgs = s->value(processArgsKey, false).toBool(); processArgs = s->value(processArgsKey, false).toBool();
displayApplication = s->value(displayApplicationKey, false).toBool();
filterScan = s->value(filterScanKey, false).toBool(); filterScan = s->value(filterScanKey, false).toBool();
whiteListFilters = s->value(filtersKey, QStringList()).toStringList(); whiteListFilters = s->value(filtersKey, QStringList()).toStringList();
// try to get settings for registered frameworks // try to get settings for registered frameworks

View File

@@ -49,6 +49,7 @@ struct TestSettings
bool autoScroll = true; bool autoScroll = true;
bool filterScan = false; bool filterScan = false;
bool processArgs = false; bool processArgs = false;
bool displayApplication = false;
QHash<Core::Id, bool> frameworks; QHash<Core::Id, bool> frameworks;
QHash<Core::Id, bool> frameworksGrouping; QHash<Core::Id, bool> frameworksGrouping;
QStringList whiteListFilters; QStringList whiteListFilters;

View File

@@ -152,6 +152,7 @@ void TestSettingsWidget::setSettings(const TestSettings &settings)
m_ui.limitResultOutputCB->setChecked(settings.limitResultOutput); m_ui.limitResultOutputCB->setChecked(settings.limitResultOutput);
m_ui.autoScrollCB->setChecked(settings.autoScroll); m_ui.autoScrollCB->setChecked(settings.autoScroll);
m_ui.processArgsCB->setChecked(settings.processArgs); m_ui.processArgsCB->setChecked(settings.processArgs);
m_ui.displayAppCB->setChecked(settings.displayApplication);
m_ui.filterGroupBox->setChecked(settings.filterScan); m_ui.filterGroupBox->setChecked(settings.filterScan);
populateFrameworksListWidget(settings.frameworks); populateFrameworksListWidget(settings.frameworks);
populateFiltersWidget(settings.whiteListFilters); populateFiltersWidget(settings.whiteListFilters);
@@ -166,6 +167,7 @@ TestSettings TestSettingsWidget::settings() const
result.limitResultOutput = m_ui.limitResultOutputCB->isChecked(); result.limitResultOutput = m_ui.limitResultOutputCB->isChecked();
result.autoScroll = m_ui.autoScrollCB->isChecked(); result.autoScroll = m_ui.autoScrollCB->isChecked();
result.processArgs = m_ui.processArgsCB->isChecked(); result.processArgs = m_ui.processArgsCB->isChecked();
result.displayApplication = m_ui.displayAppCB->isChecked();
result.filterScan = m_ui.filterGroupBox->isChecked(); result.filterScan = m_ui.filterGroupBox->isChecked();
frameworkSettings(result); frameworkSettings(result);
result.whiteListFilters = filters(); result.whiteListFilters = filters();

View File

@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>585</width> <width>585</width>
<height>431</height> <height>458</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -73,6 +73,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="displayAppCB">
<property name="text">
<string>Group results by application</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="processArgsCB"> <widget class="QCheckBox" name="processArgsCB">
<property name="toolTip"> <property name="toolTip">