summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2019-02-08 09:28:00 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2019-02-08 12:31:02 +0100
commitfbfacd33be482fa3cf0aa5cffaf7006d538a2f92 (patch)
tree92da72786b3740e37004623612c4fc1c9640d30f /src/testlib
parentc1f4286a5cbc1794fe7be5bdbbd6a0bf29ef84d4 (diff)
parent74e04d6ace7aa949db97ae2e46c38a4dc0d4d36a (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
Conflicts: src/android/templates/AndroidManifest.xml src/network/ssl/qsslsocket_mac.cpp src/widgets/styles/qstylesheetstyle.cpp tests/auto/corelib/kernel/qtimer/BLACKLIST tests/auto/testlib/selftests/blacklisted/tst_blacklisted.cpp tests/auto/testlib/selftests/expected_blacklisted.lightxml tests/auto/testlib/selftests/expected_blacklisted.tap tests/auto/testlib/selftests/expected_blacklisted.teamcity tests/auto/testlib/selftests/expected_blacklisted.txt tests/auto/testlib/selftests/expected_blacklisted.xml tests/auto/testlib/selftests/expected_blacklisted.xunitxml tests/auto/testlib/selftests/expected_float.tap tests/auto/testlib/selftests/expected_float.teamcity tests/auto/testlib/selftests/expected_float.txt tests/auto/testlib/selftests/expected_float.xunitxml Done-With: Christian Ehrlicher <ch.ehrlicher@gmx.de> Done-With: Edward Welbourne <edward.welbourne@qt.io> Done-With: Timur Pocheptsov <timur.pocheptsov@qt.io> Change-Id: If93cc432a56ae3ac1b6533d0028e4dc497415a52
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qabstracttestlogger_p.h4
-rw-r--r--src/testlib/qappletestlogger.cpp4
-rw-r--r--src/testlib/qplaintestlogger.cpp4
-rw-r--r--src/testlib/qtaptestlogger.cpp17
-rw-r--r--src/testlib/qteamcitylogger.cpp4
-rw-r--r--src/testlib/qtestcase.cpp55
-rw-r--r--src/testlib/qtestlog.cpp18
-rw-r--r--src/testlib/qtestlog_p.h2
-rw-r--r--src/testlib/qtestresult.cpp13
-rw-r--r--src/testlib/qxmltestlogger.cpp4
-rw-r--r--src/testlib/qxunittestlogger.cpp13
11 files changed, 125 insertions, 13 deletions
diff --git a/src/testlib/qabstracttestlogger_p.h b/src/testlib/qabstracttestlogger_p.h
index 018361b81e..a64e7ea96f 100644
--- a/src/testlib/qabstracttestlogger_p.h
+++ b/src/testlib/qabstracttestlogger_p.h
@@ -69,7 +69,9 @@ public:
Fail,
XPass,
BlacklistedPass,
- BlacklistedFail
+ BlacklistedFail,
+ BlacklistedXPass,
+ BlacklistedXFail
};
enum MessageTypes {
diff --git a/src/testlib/qappletestlogger.cpp b/src/testlib/qappletestlogger.cpp
index 2c1005ad80..8e75da88f8 100644
--- a/src/testlib/qappletestlogger.cpp
+++ b/src/testlib/qappletestlogger.cpp
@@ -101,6 +101,10 @@ static IncidentClassification incidentTypeToClassification(QAbstractTestLogger::
return IncidentClassification(QtWarningMsg, "bpass");
case QAbstractTestLogger::BlacklistedFail:
return IncidentClassification(QtInfoMsg, "bfail");
+ case QAbstractTestLogger::BlacklistedXPass:
+ return IncidentClassification(QtWarningMsg, "bxpass");
+ case QAbstractTestLogger::BlacklistedXFail:
+ return IncidentClassification(QtInfoMsg, "bxfail");
}
return IncidentClassification(QtFatalMsg, nullptr);
}
diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp
index 853515f2d9..ed53dcdde8 100644
--- a/src/testlib/qplaintestlogger.cpp
+++ b/src/testlib/qplaintestlogger.cpp
@@ -89,6 +89,10 @@ namespace QTest {
return "BPASS ";
case QAbstractTestLogger::BlacklistedFail:
return "BFAIL ";
+ case QAbstractTestLogger::BlacklistedXPass:
+ return "BXPASS ";
+ case QAbstractTestLogger::BlacklistedXFail:
+ return "BXFAIL ";
}
return "??????";
}
diff --git a/src/testlib/qtaptestlogger.cpp b/src/testlib/qtaptestlogger.cpp
index 37ab89ac91..540b36e273 100644
--- a/src/testlib/qtaptestlogger.cpp
+++ b/src/testlib/qtaptestlogger.cpp
@@ -43,7 +43,9 @@
#include "qtestresult_p.h"
#include "qtestassert.h"
-#include <QtCore/qregularexpression.h>
+#if QT_CONFIG(regularexpression)
+# include <QtCore/qregularexpression.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -121,13 +123,15 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description,
return;
}
- bool ok = type == Pass || type == XPass || type == BlacklistedPass;
+ bool ok = type == Pass || type == XPass || type == BlacklistedPass || type == BlacklistedXPass;
QTestCharBuffer directive;
- if (type == XFail || type == XPass || type == BlacklistedFail || type == BlacklistedPass)
+ if (type == XFail || type == XPass || type == BlacklistedFail || type == BlacklistedPass
+ || type == BlacklistedXFail || type == BlacklistedXPass) {
// We treat expected or blacklisted failures/passes as TODO-failures/passes,
// which should be treated as soft issues by consumers. Not all do though :/
QTest::qt_asprintf(&directive, " # TODO %s", description);
+ }
int testNumber = QTestLog::totalCount();
if (type == XFail) {
@@ -146,6 +150,7 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description,
outputString(YAML_INDENT "---\n");
if (type != XFail) {
+#if QT_CONFIG(regularexpression)
// This is fragile, but unfortunately testlib doesn't plumb
// the expected and actual values to the loggers (yet).
static QRegularExpression verifyRegex(
@@ -206,6 +211,12 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description,
YAML_INDENT "# %s\n", description);
outputString(unparsableDescription.data());
}
+#else
+ QTestCharBuffer unparsableDescription;
+ QTest::qt_asprintf(&unparsableDescription,
+ YAML_INDENT "# %s\n", description);
+ outputString(unparsableDescription.data());
+#endif
}
if (file) {
diff --git a/src/testlib/qteamcitylogger.cpp b/src/testlib/qteamcitylogger.cpp
index 9cfbe92b7d..577c8e70cd 100644
--- a/src/testlib/qteamcitylogger.cpp
+++ b/src/testlib/qteamcitylogger.cpp
@@ -66,6 +66,10 @@ namespace QTest {
return "BPASS";
case QAbstractTestLogger::BlacklistedFail:
return "BFAIL";
+ case QAbstractTestLogger::BlacklistedXPass:
+ return "BXPASS";
+ case QAbstractTestLogger::BlacklistedXFail:
+ return "BXFAIL";
}
return "??????";
}
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 4263f9f049..840b4071e2 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -2542,7 +2542,7 @@ bool QTest::qCompare(double const &t1, double const &t2, const char *actual, con
*/
#define TO_STRING_IMPL(TYPE, FORMAT) \
-template <> Q_TESTLIB_EXPORT char *QTest::toString<TYPE >(const TYPE &t) \
+template <> Q_TESTLIB_EXPORT char *QTest::toString<TYPE>(const TYPE &t) \
{ \
char *msg = new char[128]; \
qsnprintf(msg, 128, #FORMAT, t); \
@@ -2565,8 +2565,57 @@ TO_STRING_IMPL(quint64, %llu)
TO_STRING_IMPL(bool, %d)
TO_STRING_IMPL(signed char, %hhd)
TO_STRING_IMPL(unsigned char, %hhu)
-TO_STRING_IMPL(float, %g)
-TO_STRING_IMPL(double, %lg)
+
+/*!
+ \internal
+
+ Be consistent about leading 0 in exponent.
+
+ POSIX specifies that %e (hence %g when using it) uses at least two digits in
+ the exponent, requiring a leading 0 on single-digit exponents; (at least)
+ MinGW includes a leading zero also on an already-two-digit exponent,
+ e.g. 9e-040, which differs from more usual platforms. So massage that away.
+ */
+static void massageExponent(char *text)
+{
+ char *p = strchr(text, 'e');
+ if (!p)
+ return;
+ const char *const end = p + strlen(p); // *end is '\0'
+ p += (p[1] == '-' || p[1] == '+') ? 2 : 1;
+ if (p[0] != '0' || end - 2 <= p)
+ return;
+ // We have a leading 0 on an exponent of at least two more digits
+ const char *n = p + 1;
+ while (end - 2 > n && n[0] == '0')
+ ++n;
+ memmove(p, n, end + 1 - n);
+}
+
+// Be consistent about display of infinities and NaNs (snprintf()'s varies,
+// notably on MinGW, despite POSIX documenting "[-]inf" or "[-]infinity" for %f,
+// %e and %g, uppercasing for their capital versions; similar for "nan"):
+#define TO_STRING_FLOAT(TYPE, FORMAT) \
+template <> Q_TESTLIB_EXPORT char *QTest::toString<TYPE>(const TYPE &t) \
+{ \
+ char *msg = new char[128]; \
+ switch (std::fpclassify(t)) { \
+ case FP_INFINITE: \
+ qstrncpy(msg, (t < 0 ? "-inf" : "inf"), 128); \
+ break; \
+ case FP_NAN: \
+ qstrncpy(msg, "nan", 128); \
+ break; \
+ default: \
+ qsnprintf(msg, 128, #FORMAT, t); \
+ massageExponent(msg); \
+ break; \
+ } \
+ return msg; \
+}
+
+TO_STRING_FLOAT(float, %g)
+TO_STRING_FLOAT(double, %.12lg)
template <> Q_TESTLIB_EXPORT char *QTest::toString<qfloat16>(const qfloat16 &t)
{
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index e7150260e5..d5f22fd3da 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -460,6 +460,24 @@ void QTestLog::addBFail(const char *msg, const char *file, int line)
QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedFail, msg, file, line);
}
+void QTestLog::addBXPass(const char *msg, const char *file, int line)
+{
+ QTEST_ASSERT(msg);
+ QTEST_ASSERT(file);
+
+ ++QTest::blacklists;
+
+ QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedXPass, msg, file, line);
+}
+
+void QTestLog::addBXFail(const char *msg, const char *file, int line)
+{
+ QTEST_ASSERT(msg);
+ QTEST_ASSERT(file);
+
+ QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedXFail, msg, file, line);
+}
+
void QTestLog::addSkip(const char *msg, const char *file, int line)
{
QTEST_ASSERT(msg);
diff --git a/src/testlib/qtestlog_p.h b/src/testlib/qtestlog_p.h
index 600c078ce2..0bdd6290e1 100644
--- a/src/testlib/qtestlog_p.h
+++ b/src/testlib/qtestlog_p.h
@@ -80,6 +80,8 @@ public:
static void addXPass(const char *msg, const char *file, int line);
static void addBPass(const char *msg);
static void addBFail(const char *msg, const char *file, int line);
+ static void addBXPass(const char *msg, const char *file, int line);
+ static void addBXFail(const char *msg, const char *file, int line);
static void addSkip(const char *msg, const char *file, int line);
static void addBenchmarkResult(const QBenchmarkResult &result);
diff --git a/src/testlib/qtestresult.cpp b/src/testlib/qtestresult.cpp
index 88e3407c90..a7a4807e06 100644
--- a/src/testlib/qtestresult.cpp
+++ b/src/testlib/qtestresult.cpp
@@ -218,17 +218,24 @@ static bool checkStatement(bool statement, const char *msg, const char *file, in
{
if (statement) {
if (QTest::expectFailMode) {
- QTestLog::addXPass(msg, file, line);
+ if (QTest::blacklistCurrentTest)
+ QTestLog::addBXPass(msg, file, line);
+ else
+ QTestLog::addXPass(msg, file, line);
+
+ QTest::failed = true;
bool doContinue = (QTest::expectFailMode == QTest::Continue);
clearExpectFail();
- QTest::failed = true;
return doContinue;
}
return true;
}
if (QTest::expectFailMode) {
- QTestLog::addXFail(QTest::expectFailComment, file, line);
+ if (QTest::blacklistCurrentTest)
+ QTestLog::addBXFail(QTest::expectFailComment, file, line);
+ else
+ QTestLog::addXFail(QTest::expectFailComment, file, line);
bool doContinue = (QTest::expectFailMode == QTest::Continue);
clearExpectFail();
return doContinue;
diff --git a/src/testlib/qxmltestlogger.cpp b/src/testlib/qxmltestlogger.cpp
index 7153c016c5..c47042c3a0 100644
--- a/src/testlib/qxmltestlogger.cpp
+++ b/src/testlib/qxmltestlogger.cpp
@@ -91,6 +91,10 @@ namespace QTest {
return "bpass";
case QAbstractTestLogger::BlacklistedFail:
return "bfail";
+ case QAbstractTestLogger::BlacklistedXPass:
+ return "bxpass";
+ case QAbstractTestLogger::BlacklistedXFail:
+ return "bxfail";
}
return "??????";
}
diff --git a/src/testlib/qxunittestlogger.cpp b/src/testlib/qxunittestlogger.cpp
index ec33c29ae5..336edb5994 100644
--- a/src/testlib/qxunittestlogger.cpp
+++ b/src/testlib/qxunittestlogger.cpp
@@ -180,6 +180,13 @@ void QXunitTestLogger::addIncident(IncidentTypes type, const char *description,
++failureCounter;
typeBuf = "bfail";
break;
+ case QAbstractTestLogger::BlacklistedXPass:
+ typeBuf = "bxpass";
+ break;
+ case QAbstractTestLogger::BlacklistedXFail:
+ ++failureCounter;
+ typeBuf = "bxfail";
+ break;
default:
typeBuf = "??????";
break;
@@ -212,11 +219,11 @@ void QXunitTestLogger::addIncident(IncidentTypes type, const char *description,
if (!strcmp(oldResult, "pass")) {
overwrite = true;
}
- else if (!strcmp(oldResult, "bpass")) {
+ else if (!strcmp(oldResult, "bpass") || !strcmp(oldResult, "bxfail")) {
overwrite = (type == QAbstractTestLogger::XPass || type == QAbstractTestLogger::Fail) || (type == QAbstractTestLogger::XFail)
- || (type == QAbstractTestLogger::BlacklistedFail);
+ || (type == QAbstractTestLogger::BlacklistedFail) || (type == QAbstractTestLogger::BlacklistedXPass);
}
- else if (!strcmp(oldResult, "bfail")) {
+ else if (!strcmp(oldResult, "bfail") || !strcmp(oldResult, "bxpass")) {
overwrite = (type == QAbstractTestLogger::XPass || type == QAbstractTestLogger::Fail) || (type == QAbstractTestLogger::XFail);
}
else if (!strcmp(oldResult, "xfail")) {