diff options
Diffstat (limited to 'src/testlib')
-rw-r--r-- | src/testlib/qtest.h | 16 | ||||
-rw-r--r-- | src/testlib/qtestcase.cpp | 66 | ||||
-rw-r--r-- | src/testlib/qtestcase.h | 1 |
3 files changed, 72 insertions, 11 deletions
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h index ac1d6cc9ef..7c9a7b2b3f 100644 --- a/src/testlib/qtest.h +++ b/src/testlib/qtest.h @@ -66,14 +66,14 @@ QT_BEGIN_NAMESPACE namespace QTest { -template<> inline char *toString(const QLatin1String &str) +template<> inline char *toString(const QString &str) { - return qstrdup(qPrintable(QString(str))); + return QTest::toPrettyUnicode(reinterpret_cast<const ushort *>(str.constData()), str.length()); } -template<> inline char *toString(const QString &str) +template<> inline char *toString(const QLatin1String &str) { - return qstrdup(qPrintable(str)); + return toString(QString(str)); } template<> inline char *toString(const QByteArray &ba) @@ -195,15 +195,15 @@ inline bool qCompare(QList<T> const &t1, QList<T> const &t2, const char *actual, const int expectedSize = t2.count(); if (actualSize != expectedSize) { qsnprintf(msg, sizeof(msg), "Compared lists have different sizes.\n" - " Actual (%s) size: '%d'\n" - " Expected (%s) size: '%d'", actual, actualSize, expected, expectedSize); + " Actual (%s) size: %d\n" + " Expected (%s) size: %d", actual, actualSize, expected, expectedSize); isOk = false; } for (int i = 0; isOk && i < actualSize; ++i) { if (!(t1.at(i) == t2.at(i))) { qsnprintf(msg, sizeof(msg), "Compared lists differ at index %d.\n" - " Actual (%s): '%s'\n" - " Expected (%s): '%s'", i, actual, toString(t1.at(i)), + " Actual (%s): %s\n" + " Expected (%s): %s", i, actual, toString(t1.at(i)), expected, toString(t2.at(i))); isOk = false; } diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 0d7a017f89..6c1df8815c 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1894,6 +1894,12 @@ void *fetchData(QTestData *data, const char *tagName, int typeId) return data->data(idx); } +static char toHex(ushort value) +{ + static const char hexdigits[] = "0123456789ABCDEF"; + return hexdigits[value & 0xF]; +} + /*! \fn char* QTest::toHexRepresentation(const char *ba, int length) @@ -1937,16 +1943,15 @@ char *toHexRepresentation(const char *ba, int length) result[size - 1] = '\0'; } - const char toHex[] = "0123456789ABCDEF"; int i = 0; int o = 0; while (true) { const char at = ba[i]; - result[o] = toHex[(at >> 4) & 0x0F]; + result[o] = toHex(at >> 4); ++o; - result[o] = toHex[at & 0x0F]; + result[o] = toHex(at); ++i; ++o; @@ -1961,6 +1966,61 @@ char *toHexRepresentation(const char *ba, int length) return result; } +/*! + \internal + Returns the same QString but with only the ASCII characters still shown; + everything else is replaced with \c {\uXXXX}. +*/ +char *toPrettyUnicode(const ushort *p, int length) +{ + // keep it simple for the vast majority of cases + QScopedArrayPointer<char> buffer(new char[length * 6 + 3]); + const ushort *end = p + length; + char *dst = buffer.data(); + + *dst++ = '"'; + for ( ; p != end; ++p) { + if (*p < 0x7f && *p >= 0x20 && *p != '\\') { + *dst++ = *p; + continue; + } + + // write as an escape sequence + *dst++ = '\\'; + switch (*p) { + case 0x22: + case 0x5c: + *dst++ = uchar(*p); + break; + case 0x8: + *dst++ = 'b'; + break; + case 0xc: + *dst++ = 'f'; + break; + case 0xa: + *dst++ = 'n'; + break; + case 0xd: + *dst++ = 'r'; + break; + case 0x9: + *dst++ = 't'; + break; + default: + *dst++ = 'u'; + *dst++ = toHex(*p >> 12); + *dst++ = toHex(*p >> 8); + *dst++ = toHex(*p >> 4); + *dst++ = toHex(*p); + } + } + + *dst++ = '"'; + *dst++ = '\0'; + return buffer.take(); +} + static void qInvokeTestMethods(QObject *testObject) { const QMetaObject *metaObject = testObject->metaObject(); diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 05da33c400..b715d83383 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -233,6 +233,7 @@ namespace QTest Q_TESTLIB_EXPORT char *toHexRepresentation(const char *ba, int length); + Q_TESTLIB_EXPORT char *toPrettyUnicode(const ushort *unicode, int length); Q_TESTLIB_EXPORT char *toString(const char *); Q_TESTLIB_EXPORT char *toString(const void *); |