From e4eb4c3d0fa8f5985554aec12e40fc51d6d1cc84 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 13 Dec 2017 13:10:00 +0100 Subject: [PATCH] AutoTest: Correct updating of summary items If we get no finish message for a test case or function we did not update the result of the summary item. This patch fixes this and also updates the respective parents accordingly. Change-Id: I98a8c69735f89d592f6152dbbc7a632e285c3a4d Reviewed-by: David Schulz --- src/plugins/autotest/testresultmodel.cpp | 102 ++++++++++++----------- src/plugins/autotest/testresultmodel.h | 4 +- 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index a41fc64b011..94aa6d4c31d 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -101,52 +101,48 @@ void TestResultItem::updateDescription(const QString &description) m_testResult->setDescription(description); } -void TestResultItem::updateResult() +void TestResultItem::updateResult(bool &changed, Result::Type addedChildType) { - if (!TestResult::isMessageCaseStart(m_testResult->result())) + changed = false; + const Result::Type old = m_testResult->result(); + if (old == Result::MessageTestCaseFailWarn) // can't become worse + return; + if (!TestResult::isMessageCaseStart(old)) return; Result::Type newResult = Result::MessageTestCaseSuccess; - bool withWarning = false; - for (Utils::TreeItem *child : *this) { - const TestResult *current = static_cast(child)->testResult(); - if (current) { - switch (current->result()) { - case Result::Fail: - case Result::MessageFatal: - case Result::UnexpectedPass: - case Result::MessageTestCaseFail: - newResult = Result::MessageTestCaseFail; - break; - case Result::ExpectedFail: - case Result::MessageWarn: - case Result::Skip: - case Result::BlacklistedFail: - case Result::BlacklistedPass: - case Result::MessageTestCaseSuccessWarn: - case Result::MessageTestCaseFailWarn: - withWarning = true; - break; - default: {} - } - } + switch (addedChildType) { + case Result::Fail: + case Result::MessageFatal: + case Result::MessageSystem: + case Result::UnexpectedPass: + case Result::MessageTestCaseFail: + newResult = (old == Result::MessageTestCaseSuccessWarn) ? Result::MessageTestCaseFailWarn + : Result::MessageTestCaseFail; + break; + case Result::MessageTestCaseFailWarn: + newResult = Result::MessageTestCaseFailWarn; + break; + case Result::ExpectedFail: + case Result::MessageWarn: + case Result::Skip: + case Result::BlacklistedFail: + case Result::BlacklistedPass: + case Result::MessageTestCaseSuccessWarn: + newResult = (old == Result::MessageTestCaseFail) ? Result::MessageTestCaseFailWarn + : Result::MessageTestCaseSuccessWarn; + break; + case Result::Pass: + case Result::MessageTestCaseSuccess: + newResult = (old == Result::MessageIntermediate || old == Result::MessageTestCaseStart) + ? Result::MessageTestCaseSuccess : old; + break; + default: + return; } - if (withWarning) { - m_testResult->setResult(newResult == Result::MessageTestCaseSuccess - ? Result::MessageTestCaseSuccessWarn - : Result::MessageTestCaseFailWarn); - } else { + changed = old != newResult; + if (changed) m_testResult->setResult(newResult); - } -} - -void TestResultItem::updateIntermediateChildren() -{ - for (Utils::TreeItem *child : *this) { - TestResultItem *childItem = static_cast(child); - if (childItem->testResult()->result() == Result::MessageIntermediate) - childItem->updateResult(); - } } TestResultItem *TestResultItem::intermediateFor(const TestResultItem *item) const @@ -181,6 +177,22 @@ TestResultModel::TestResultModel(QObject *parent) { } +void TestResultModel::updateParent(const TestResultItem *item) +{ + QTC_ASSERT(item, return); + QTC_ASSERT(item->testResult(), return); + Utils::TreeItem *parentItem = item->parent(); + if (parentItem == rootItem()) // do not update invisible root item + return; + bool changed = false; + TestResultItem *parentResultItem = static_cast(parentItem); + parentResultItem->updateResult(changed, item->testResult()->result()); + if (!changed) + return; + emit dataChanged(parentItem->index(), parentItem->index()); + updateParent(parentResultItem); +} + void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoExpand) { const int lastRow = rootItem()->childCount() - 1; @@ -211,15 +223,7 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx parentItem->appendChild(newItem); if (autoExpand) parentItem->expand(); - if (testResult->result() == Result::MessageTestCaseEnd) { - if (parentItem->childCount()) { - parentItem->updateIntermediateChildren(); - emit dataChanged(parentItem->firstChild()->index(), - parentItem->lastChild()->index()); - } - parentItem->updateResult(); - emit dataChanged(parentItem->index(), parentItem->index()); - } + updateParent(newItem); } else { if (lastRow >= 0) { TestResultItem *current = static_cast(rootItem()->childAt(lastRow)); diff --git a/src/plugins/autotest/testresultmodel.h b/src/plugins/autotest/testresultmodel.h index 56643c8fd99..7b151d9b7d9 100644 --- a/src/plugins/autotest/testresultmodel.h +++ b/src/plugins/autotest/testresultmodel.h @@ -45,8 +45,7 @@ public: QVariant data(int column, int role) const override; const TestResult *testResult() const { return m_testResult.data(); } void updateDescription(const QString &description); - void updateResult(); - void updateIntermediateChildren(); + void updateResult(bool &changed, Result::Type addedChildType); TestResultItem *intermediateFor(const TestResultItem *item) const; TestResultItem *createAndAddIntermediateFor(const TestResultItem *child); @@ -77,6 +76,7 @@ private: void addFileName(const QString &fileName); TestResultItem *findParentItemFor(const TestResultItem *item, const TestResultItem *startItem = 0) const; + void updateParent(const TestResultItem *item); QMap m_testResultCount; int m_widthOfLineNumber = 0; int m_maxWidthOfFileName = 0;