forked from qt-creator/qt-creator
AutoTest: Fix result tree for google test
Change-Id: I1f4a361a3c4ceb77c221d6549e42a1b7803ef305 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -45,15 +45,15 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface<TestResultPtr> &futu
|
|||||||
|
|
||||||
void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
||||||
{
|
{
|
||||||
static QRegExp newTestStarts(QStringLiteral("^\\[-{10}\\] \\d+ tests? from (.*)$"));
|
static QRegExp newTestStarts("^\\[-{10}\\] \\d+ tests? from (.*)$");
|
||||||
static QRegExp testEnds(QStringLiteral("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$"));
|
static QRegExp testEnds("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$");
|
||||||
static QRegExp newTestSetStarts(QStringLiteral("^\\[ RUN \\] (.*)$"));
|
static QRegExp newTestSetStarts("^\\[ RUN \\] (.*)$");
|
||||||
static QRegExp testSetSuccess(QStringLiteral("^\\[ OK \\] (.*) \\((.*)\\)$"));
|
static QRegExp testSetSuccess("^\\[ OK \\] (.*) \\((.*)\\)$");
|
||||||
static QRegExp testSetFail(QStringLiteral("^\\[ FAILED \\] (.*) \\((.*)\\)$"));
|
static QRegExp testSetFail("^\\[ FAILED \\] (.*) \\((.*)\\)$");
|
||||||
static QRegExp disabledTests(QStringLiteral("^ YOU HAVE (\\d+) DISABLED TESTS?$"));
|
static QRegExp disabledTests("^ YOU HAVE (\\d+) DISABLED TESTS?$");
|
||||||
static QRegExp failureLocation(QStringLiteral("^(.*):(\\d+): Failure$"));
|
static QRegExp failureLocation("^(.*):(\\d+): Failure$");
|
||||||
static QRegExp errorLocation(QStringLiteral("^(.*)\\((\\d+)\\): error:.*$"));
|
static QRegExp errorLocation("^(.*)\\((\\d+)\\): error:.*$");
|
||||||
static QRegExp iterations(QStringLiteral("^Repeating all tests \\(iteration (\\d+)\\) . . .$"));
|
static QRegExp iterations("^Repeating all tests \\(iteration (\\d+)\\) \\. \\. \\.$");
|
||||||
|
|
||||||
QByteArray read = outputLine;
|
QByteArray read = outputLine;
|
||||||
if (!m_unprocessed.isEmpty()) {
|
if (!m_unprocessed.isEmpty()) {
|
||||||
@@ -78,9 +78,12 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
m_iteration = iterations.cap(1).toInt();
|
m_iteration = iterations.cap(1).toInt();
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
} else if (line.startsWith(QStringLiteral("Note:"))) {
|
} else if (line.startsWith(QStringLiteral("Note:"))) {
|
||||||
TestResultPtr testResult = TestResultPtr(new GTestResult());
|
m_description = line;
|
||||||
|
if (m_iteration > 1)
|
||||||
|
m_description.append(' ' + tr("(iteration %1)").arg(m_iteration));
|
||||||
|
TestResultPtr testResult = TestResultPtr(new GTestResult);
|
||||||
testResult->setResult(Result::MessageInternal);
|
testResult->setResult(Result::MessageInternal);
|
||||||
testResult->setDescription(line);
|
testResult->setDescription(m_description);
|
||||||
m_futureInterface.reportResult(testResult);
|
m_futureInterface.reportResult(testResult);
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
} else if (disabledTests.exactMatch(line)) {
|
} else if (disabledTests.exactMatch(line)) {
|
||||||
@@ -92,12 +95,11 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
m_futureInterface.reportResult(testResult);
|
m_futureInterface.reportResult(testResult);
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
}
|
}
|
||||||
return; //continue;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (testEnds.exactMatch(line)) {
|
if (testEnds.exactMatch(line)) {
|
||||||
GTestResult *testResult = new GTestResult(m_currentTestName);
|
GTestResult *testResult = createDefaultResult();
|
||||||
testResult->setTestSetName(m_currentTestSet);
|
|
||||||
testResult->setResult(Result::MessageTestCaseEnd);
|
testResult->setResult(Result::MessageTestCaseEnd);
|
||||||
testResult->setDescription(tr("Test execution took %1").arg(testEnds.cap(2)));
|
testResult->setDescription(tr("Test execution took %1").arg(testEnds.cap(2)));
|
||||||
m_futureInterface.reportResult(TestResultPtr(testResult));
|
m_futureInterface.reportResult(TestResultPtr(testResult));
|
||||||
@@ -105,13 +107,12 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
m_currentTestSet.clear();
|
m_currentTestSet.clear();
|
||||||
} else if (newTestStarts.exactMatch(line)) {
|
} else if (newTestStarts.exactMatch(line)) {
|
||||||
m_currentTestName = newTestStarts.cap(1);
|
m_currentTestName = newTestStarts.cap(1);
|
||||||
TestResultPtr testResult = TestResultPtr(new GTestResult(m_currentTestName));
|
TestResultPtr testResult = TestResultPtr(createDefaultResult());
|
||||||
|
testResult->setResult(Result::MessageTestCaseStart);
|
||||||
if (m_iteration > 1) {
|
if (m_iteration > 1) {
|
||||||
testResult->setResult(Result::MessageTestCaseRepetition);
|
|
||||||
testResult->setDescription(tr("Repeating test case %1 (iteration %2)")
|
testResult->setDescription(tr("Repeating test case %1 (iteration %2)")
|
||||||
.arg(m_currentTestName).arg(m_iteration));
|
.arg(m_currentTestName).arg(m_iteration));
|
||||||
} else {
|
} else {
|
||||||
testResult->setResult(Result::MessageTestCaseStart);
|
|
||||||
testResult->setDescription(tr("Executing test case %1").arg(m_currentTestName));
|
testResult->setDescription(tr("Executing test case %1").arg(m_currentTestName));
|
||||||
}
|
}
|
||||||
m_futureInterface.reportResult(testResult);
|
m_futureInterface.reportResult(testResult);
|
||||||
@@ -123,21 +124,18 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
m_futureInterface.reportResult(testResult);
|
m_futureInterface.reportResult(testResult);
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
} else if (testSetSuccess.exactMatch(line)) {
|
} else if (testSetSuccess.exactMatch(line)) {
|
||||||
GTestResult *testResult = new GTestResult(m_currentTestName);
|
GTestResult *testResult = createDefaultResult();
|
||||||
testResult->setTestSetName(m_currentTestSet);
|
|
||||||
testResult->setResult(Result::Pass);
|
testResult->setResult(Result::Pass);
|
||||||
testResult->setDescription(m_description);
|
testResult->setDescription(m_description);
|
||||||
m_futureInterface.reportResult(TestResultPtr(testResult));
|
m_futureInterface.reportResult(TestResultPtr(testResult));
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
testResult = new GTestResult(m_currentTestName);
|
testResult = createDefaultResult();
|
||||||
testResult->setTestSetName(m_currentTestSet);
|
|
||||||
testResult->setResult(Result::MessageInternal);
|
testResult->setResult(Result::MessageInternal);
|
||||||
testResult->setDescription(tr("Execution took %1.").arg(testSetSuccess.cap(2)));
|
testResult->setDescription(tr("Execution took %1.").arg(testSetSuccess.cap(2)));
|
||||||
m_futureInterface.reportResult(TestResultPtr(testResult));
|
m_futureInterface.reportResult(TestResultPtr(testResult));
|
||||||
m_futureInterface.setProgressValue(m_futureInterface.progressValue() + 1);
|
m_futureInterface.setProgressValue(m_futureInterface.progressValue() + 1);
|
||||||
} else if (testSetFail.exactMatch(line)) {
|
} else if (testSetFail.exactMatch(line)) {
|
||||||
GTestResult *testResult = new GTestResult(m_currentTestName);
|
GTestResult *testResult = createDefaultResult();
|
||||||
testResult->setTestSetName(m_currentTestSet);
|
|
||||||
testResult->setResult(Result::Fail);
|
testResult->setResult(Result::Fail);
|
||||||
m_description.chop(1);
|
m_description.chop(1);
|
||||||
testResult->setDescription(m_description);
|
testResult->setDescription(m_description);
|
||||||
@@ -160,8 +158,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
}
|
}
|
||||||
m_futureInterface.reportResult(TestResultPtr(testResult));
|
m_futureInterface.reportResult(TestResultPtr(testResult));
|
||||||
m_description.clear();
|
m_description.clear();
|
||||||
testResult = new GTestResult(m_currentTestName);
|
testResult = createDefaultResult();
|
||||||
testResult->setTestSetName(m_currentTestSet);
|
|
||||||
testResult->setResult(Result::MessageInternal);
|
testResult->setResult(Result::MessageInternal);
|
||||||
testResult->setDescription(tr("Execution took %1.").arg(testSetFail.cap(2)));
|
testResult->setDescription(tr("Execution took %1.").arg(testSetFail.cap(2)));
|
||||||
m_futureInterface.reportResult(TestResultPtr(testResult));
|
m_futureInterface.reportResult(TestResultPtr(testResult));
|
||||||
@@ -169,5 +166,13 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GTestResult *GTestOutputReader::createDefaultResult() const
|
||||||
|
{
|
||||||
|
GTestResult *result = new GTestResult(m_currentTestName);
|
||||||
|
result->setTestSetName(m_currentTestSet);
|
||||||
|
result->setIteration(m_iteration);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Autotest
|
} // namespace Autotest
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
class GTestResult;
|
||||||
|
|
||||||
class GTestOutputReader : public TestOutputReader
|
class GTestOutputReader : public TestOutputReader
|
||||||
{
|
{
|
||||||
Q_DECLARE_TR_FUNCTIONS(Autotest::Internal::GTestOutputReader)
|
Q_DECLARE_TR_FUNCTIONS(Autotest::Internal::GTestOutputReader)
|
||||||
@@ -44,11 +46,12 @@ protected:
|
|||||||
void processOutput(const QByteArray &outputLine) override;
|
void processOutput(const QByteArray &outputLine) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
GTestResult *createDefaultResult() const;
|
||||||
QString m_currentTestName;
|
QString m_currentTestName;
|
||||||
QString m_currentTestSet;
|
QString m_currentTestSet;
|
||||||
QString m_description;
|
QString m_description;
|
||||||
QByteArray m_unprocessed;
|
QByteArray m_unprocessed;
|
||||||
int m_iteration = 0;
|
int m_iteration = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ bool GTestResult::isDirectParentOf(const TestResult *other, bool *needsIntermedi
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
const GTestResult *gtOther = static_cast<const GTestResult *>(other);
|
const GTestResult *gtOther = static_cast<const GTestResult *>(other);
|
||||||
|
if (m_iteration != gtOther->m_iteration)
|
||||||
|
return false;
|
||||||
return isTest() && gtOther->isTestSet();
|
return isTest() && gtOther->isTestSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,11 +37,13 @@ public:
|
|||||||
const QString outputString(bool selected) const override;
|
const QString outputString(bool selected) const override;
|
||||||
|
|
||||||
void setTestSetName(const QString &testSetName) { m_testSetName = testSetName; }
|
void setTestSetName(const QString &testSetName) { m_testSetName = testSetName; }
|
||||||
|
void setIteration(int iteration) { m_iteration = iteration; }
|
||||||
bool isDirectParentOf(const TestResult *other, bool *needsIntermediate) const override;
|
bool isDirectParentOf(const TestResult *other, bool *needsIntermediate) const override;
|
||||||
private:
|
private:
|
||||||
bool isTest() const { return m_testSetName.isEmpty(); }
|
bool isTest() const { return m_testSetName.isEmpty(); }
|
||||||
bool isTestSet() const { return !m_testSetName.isEmpty(); }
|
bool isTestSet() const { return !m_testSetName.isEmpty(); }
|
||||||
QString m_testSetName;
|
QString m_testSetName;
|
||||||
|
int m_iteration = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ enum Type {
|
|||||||
MessageTestCaseWarn,
|
MessageTestCaseWarn,
|
||||||
MessageTestCaseFail,
|
MessageTestCaseFail,
|
||||||
MessageTestCaseEnd,
|
MessageTestCaseEnd,
|
||||||
MessageTestCaseRepetition,
|
|
||||||
MessageIntermediate,
|
MessageIntermediate,
|
||||||
MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest,
|
MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest,
|
||||||
|
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ void TestResultFilterModel::enableAllResultTypes()
|
|||||||
<< Result::MessageCurrentTest << Result::MessageTestCaseStart
|
<< Result::MessageCurrentTest << Result::MessageTestCaseStart
|
||||||
<< Result::MessageTestCaseSuccess << Result::MessageTestCaseWarn
|
<< Result::MessageTestCaseSuccess << Result::MessageTestCaseWarn
|
||||||
<< Result::MessageTestCaseFail << Result::MessageTestCaseEnd
|
<< Result::MessageTestCaseFail << Result::MessageTestCaseEnd
|
||||||
<< Result::MessageTestCaseRepetition << Result::MessageInfo << Result::MessageSystem;
|
<< Result::MessageInfo << Result::MessageSystem;
|
||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user