AutoTest: Make data tags checkable

Change-Id: I9a1e8c9524a3f8beb3851646fb7b6bf7c8cac557
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2016-10-11 16:00:05 +02:00
parent de3cf47273
commit 4ae49fb856
3 changed files with 54 additions and 8 deletions

View File

@@ -34,6 +34,13 @@
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
QtTestTreeItem::QtTestTreeItem(const QString &name, const QString &filePath, TestTreeItem::Type type)
: TestTreeItem(name, filePath, type)
{
if (type == TestDataTag)
setChecked(Qt::Checked);
}
QtTestTreeItem *QtTestTreeItem::createTestItem(const TestParseResult *result) QtTestTreeItem *QtTestTreeItem::createTestItem(const TestParseResult *result)
{ {
QtTestTreeItem *item = new QtTestTreeItem(result->displayName, result->fileName, QtTestTreeItem *item = new QtTestTreeItem(result->displayName, result->fileName,
@@ -55,7 +62,6 @@ QVariant QtTestTreeItem::data(int column, int role) const
case Root: case Root:
case TestDataFunction: case TestDataFunction:
case TestSpecialFunction: case TestSpecialFunction:
case TestDataTag:
return QVariant(); return QVariant();
default: default:
return checked(); return checked();
@@ -72,6 +78,19 @@ QVariant QtTestTreeItem::data(int column, int role) const
return TestTreeItem::data(column, role); return TestTreeItem::data(column, role);
} }
Qt::ItemFlags QtTestTreeItem::flags(int column) const
{
static const Qt::ItemFlags defaultFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
switch (type()) {
case TestDataTag:
return defaultFlags | Qt::ItemIsUserCheckable;
case TestFunctionOrSet:
return defaultFlags | Qt::ItemIsAutoTristate | Qt::ItemIsUserCheckable;
default:
return TestTreeItem::flags(column);
}
}
bool QtTestTreeItem::canProvideTestConfiguration() const bool QtTestTreeItem::canProvideTestConfiguration() const
{ {
switch (type()) { switch (type()) {
@@ -193,8 +212,17 @@ QList<TestConfiguration *> QtTestTreeItem::getSelectedTestConfigurations() const
QStringList testCases; QStringList testCases;
for (int grandChildRow = 0; grandChildRow < grandChildCount; ++grandChildRow) { for (int grandChildRow = 0; grandChildRow < grandChildCount; ++grandChildRow) {
const TestTreeItem *grandChild = child->childItem(grandChildRow); const TestTreeItem *grandChild = child->childItem(grandChildRow);
if (grandChild->checked() == Qt::Checked) if (grandChild->checked() == Qt::Checked) {
testCases << grandChild->name(); testCases << grandChild->name();
} else if (grandChild->checked() == Qt::PartiallyChecked) {
const int dtCount = grandChild->childCount();
const QString funcName = grandChild->name();
for (int dtRow = 0; dtRow < dtCount; ++dtRow) {
const TestTreeItem *dataTag = grandChild->childItem(dtRow);
if (dataTag->checked() == Qt::Checked)
testCases << funcName + ':' + dataTag->name();
}
}
} }
testConfiguration = new QtTestConfiguration(); testConfiguration = new QtTestConfiguration();

View File

@@ -34,11 +34,12 @@ class QtTestTreeItem : public TestTreeItem
{ {
public: public:
explicit QtTestTreeItem(const QString &name = QString(), const QString &filePath = QString(), explicit QtTestTreeItem(const QString &name = QString(), const QString &filePath = QString(),
Type type = Root) : TestTreeItem(name, filePath, type) {} Type type = Root);
static QtTestTreeItem *createTestItem(const TestParseResult *result); static QtTestTreeItem *createTestItem(const TestParseResult *result);
QVariant data(int column, int role) const override; QVariant data(int column, int role) const override;
Qt::ItemFlags flags(int column) const override;
bool canProvideTestConfiguration() const override; bool canProvideTestConfiguration() const override;
bool canProvideDebugConfiguration() const override; bool canProvideDebugConfiguration() const override;
TestConfiguration *testConfiguration() const override; TestConfiguration *testConfiguration() const override;

View File

@@ -157,16 +157,23 @@ bool TestTreeItem::modifyLineAndColumn(unsigned line, unsigned column)
void TestTreeItem::setChecked(const Qt::CheckState checkState) void TestTreeItem::setChecked(const Qt::CheckState checkState)
{ {
switch (m_type) { switch (m_type) {
case TestFunctionOrSet: { case TestDataTag: {
m_checked = (checkState == Qt::Unchecked ? Qt::Unchecked : Qt::Checked); m_checked = (checkState == Qt::Unchecked ? Qt::Unchecked : Qt::Checked);
parentItem()->revalidateCheckState(); if (auto parent = parentItem())
parent->revalidateCheckState();
break; break;
} }
case TestFunctionOrSet:
case TestCase: { case TestCase: {
Qt::CheckState usedState = (checkState == Qt::Unchecked ? Qt::Unchecked : Qt::Checked); Qt::CheckState usedState = (checkState == Qt::Unchecked ? Qt::Unchecked : Qt::Checked);
for (int row = 0, count = childCount(); row < count; ++row) for (int row = 0, count = childCount(); row < count; ++row)
childItem(row)->setChecked(usedState); childItem(row)->setChecked(usedState);
m_checked = usedState; m_checked = usedState;
if (m_type == TestFunctionOrSet) {
if (auto parent = parentItem())
parent->revalidateCheckState();
}
break;
} }
default: default:
return; return;
@@ -178,6 +185,7 @@ Qt::CheckState TestTreeItem::checked() const
switch (m_type) { switch (m_type) {
case TestCase: case TestCase:
case TestFunctionOrSet: case TestFunctionOrSet:
case TestDataTag:
return m_checked; return m_checked;
default: default:
return Qt::Unchecked; return Qt::Unchecked;
@@ -278,10 +286,14 @@ bool TestTreeItem::lessThan(const TestTreeItem *other, SortMode mode) const
void TestTreeItem::revalidateCheckState() void TestTreeItem::revalidateCheckState()
{ {
if (childCount() == 0) const Type ttiType = type();
if (ttiType != TestCase && ttiType != TestFunctionOrSet)
return;
if (childCount() == 0) // can this happen? (we're calling revalidateCS() on parentItem()
return; return;
bool foundChecked = false; bool foundChecked = false;
bool foundUnchecked = false; bool foundUnchecked = false;
bool foundPartiallyChecked = false;
for (int row = 0, count = childCount(); row < count; ++row) { for (int row = 0, count = childCount(); row < count; ++row) {
TestTreeItem *child = childItem(row); TestTreeItem *child = childItem(row);
switch (child->type()) { switch (child->type()) {
@@ -292,14 +304,19 @@ void TestTreeItem::revalidateCheckState()
break; break;
} }
foundChecked |= (child->checked() != Qt::Unchecked); foundChecked |= (child->checked() == Qt::Checked);
foundUnchecked |= (child->checked() == Qt::Unchecked); foundUnchecked |= (child->checked() == Qt::Unchecked);
if (foundChecked && foundUnchecked) { foundPartiallyChecked |= (child->checked() == Qt::PartiallyChecked);
if (foundPartiallyChecked || (foundChecked && foundUnchecked)) {
m_checked = Qt::PartiallyChecked; m_checked = Qt::PartiallyChecked;
if (ttiType == TestFunctionOrSet)
parentItem()->revalidateCheckState();
return; return;
} }
} }
m_checked = (foundUnchecked ? Qt::Unchecked : Qt::Checked); m_checked = (foundUnchecked ? Qt::Unchecked : Qt::Checked);
if (ttiType == TestFunctionOrSet)
parentItem()->revalidateCheckState();
} }
inline bool TestTreeItem::modifyFilePath(const QString &filePath) inline bool TestTreeItem::modifyFilePath(const QString &filePath)