summaryrefslogtreecommitdiffstats
path: root/src/testlib/qtestlog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib/qtestlog.cpp')
-rw-r--r--src/testlib/qtestlog.cpp68
1 files changed, 62 insertions, 6 deletions
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index c90850e786..4f0e3a43bc 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -111,6 +111,7 @@ namespace QTest {
int passes = 0;
int skips = 0;
int blacklists = 0;
+ enum { Unresolved, Passed, Skipped, Suppressed, Failed } currentTestState;
struct IgnoreResultList
{
@@ -345,19 +346,27 @@ void QTestLog::clearIgnoreMessages()
QTest::IgnoreResultList::clearList(QTest::ignoreResultList);
}
+
void QTestLog::clearFailOnWarnings()
{
QTest::failOnWarningList.clear();
}
+void QTestLog::clearCurrentTestState()
+{
+ QTest::currentTestState = QTest::Unresolved;
+}
+
void QTestLog::addPass(const char *msg)
{
if (printAvailableTags)
return;
QTEST_ASSERT(msg);
+ Q_ASSERT(QTest::currentTestState == QTest::Unresolved);
++QTest::passes;
+ QTest::currentTestState = QTest::Passed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::Pass, msg);
@@ -367,8 +376,18 @@ void QTestLog::addFail(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
- ++QTest::fails;
+ if (QTest::currentTestState == QTest::Unresolved) {
+ ++QTest::fails;
+ } else {
+ // After an XPASS/Continue, or fail or skip in a function the test
+ // calls, we can subsequently fail.
+ Q_ASSERT(QTest::currentTestState == QTest::Failed
+ || QTest::currentTestState == QTest::Skipped);
+ }
+ // It is up to particular loggers to decide whether to report such
+ // subsequent failures; they may carry useful information.
+ QTest::currentTestState = QTest::Failed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::Fail, msg, file, line);
}
@@ -387,8 +406,16 @@ void QTestLog::addXPass(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
- ++QTest::fails;
+ if (QTest::currentTestState == QTest::Unresolved) {
+ ++QTest::fails;
+ } else {
+ // After an XPASS/Continue, we can subsequently XPASS again.
+ // Likewise after a fail or skip in a function called by the test.
+ Q_ASSERT(QTest::currentTestState == QTest::Failed
+ || QTest::currentTestState == QTest::Skipped);
+ }
+ QTest::currentTestState = QTest::Failed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::XPass, msg, file, line);
}
@@ -396,8 +423,10 @@ void QTestLog::addXPass(const char *msg, const char *file, int line)
void QTestLog::addBPass(const char *msg)
{
QTEST_ASSERT(msg);
+ Q_ASSERT(QTest::currentTestState == QTest::Unresolved);
- ++QTest::blacklists;
+ ++QTest::blacklists; // Not passes ?
+ QTest::currentTestState = QTest::Suppressed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::BlacklistedPass, msg);
@@ -407,8 +436,16 @@ void QTestLog::addBFail(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
- ++QTest::blacklists;
+ if (QTest::currentTestState == QTest::Unresolved) {
+ ++QTest::blacklists;
+ } else {
+ // After a BXPASS/Continue, we can subsequently fail.
+ // Likewise after a fail or skip in a function called by a test.
+ Q_ASSERT(QTest::currentTestState == QTest::Suppressed
+ || QTest::currentTestState == QTest::Skipped);
+ }
+ QTest::currentTestState = QTest::Suppressed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::BlacklistedFail, msg, file, line);
}
@@ -417,8 +454,16 @@ void QTestLog::addBXPass(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
- ++QTest::blacklists;
+ if (QTest::currentTestState == QTest::Unresolved) {
+ ++QTest::blacklists;
+ } else {
+ // After a BXPASS/Continue, we may BXPASS again.
+ // Likewise after a fail or skip in a function called by a test.
+ Q_ASSERT(QTest::currentTestState == QTest::Suppressed
+ || QTest::currentTestState == QTest::Skipped);
+ }
+ QTest::currentTestState = QTest::Suppressed;
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::BlacklistedXPass, msg, file, line);
}
@@ -437,7 +482,18 @@ void QTestLog::addSkip(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
- ++QTest::skips;
+ if (QTest::currentTestState == QTest::Unresolved) {
+ ++QTest::skips;
+ QTest::currentTestState = QTest::Skipped;
+ } else {
+ // After an B?XPASS/Continue, we might subsequently skip.
+ // Likewise after a skip in a function called by a test.
+ Q_ASSERT(QTest::currentTestState == QTest::Suppressed
+ || QTest::currentTestState == QTest::Failed
+ || QTest::currentTestState == QTest::Skipped);
+ }
+ // It is up to particular loggers to decide whether to report such
+ // subsequent skips; they may carry useful information.
FOREACH_TEST_LOGGER
logger->addIncident(QAbstractTestLogger::Skip, msg, file, line);