http://macieira.org/~thiago/qt-5.3/QtTest.diff
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index ac1d6cc..7c9a7b2 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.h b/src/testlib/qtestcase.h
index ba727b5..d9c8a43 100644
--- a/src/testlib/qtestcase.h
+++ b/src/testlib/qtestcase.h
@@ -51,8 +51,14 @@
 
 #include <string.h>
 
+#ifndef QT_NO_EXCEPTIONS
+#  include <exception>
+#endif // QT_NO_EXCEPTIONS
+
+
 QT_BEGIN_NAMESPACE
 
+class QRegularExpression;
 
 #define QVERIFY(statement) \
 do {\
@@ -83,38 +89,88 @@ do {\
         return;\
 } while (0)
 
-// Will try to wait for the expression to become true while allowing event processing
-#define QTRY_VERIFY_WITH_TIMEOUT(__expr, __timeout) \
+
+#ifndef QT_NO_EXCEPTIONS
+
+#  define QVERIFY_EXCEPTION_THROWN(expression, exceptiontype) \
     do {\
-    const int __step = 50; \
-    const int __timeoutValue = __timeout; \
+        QT_TRY {\
+            QT_TRY {\
+                expression;\
+                QTest::qFail("Expected exception of type " #exceptiontype " to be thrown" \
+                             " but no exception caught", __FILE__, __LINE__);\
+                return;\
+            } QT_CATCH (const exceptiontype &) {\
+            }\
+        } QT_CATCH (const std::exception &e) {\
+            QByteArray msg = QByteArray() + "Expected exception of type " #exceptiontype \
+                             " to be thrown but std::exception caught with message: " + e.what(); \
+            QTest::qFail(msg.constData(), __FILE__, __LINE__);\
+            return;\
+        } QT_CATCH (...) {\
+            QTest::qFail("Expected exception of type " #exceptiontype " to be thrown" \
+                         " but unknown exception caught", __FILE__, __LINE__);\
+            return;\
+        }\
+    } while (0)
+
+#else // QT_NO_EXCEPTIONS
+
+/*
+ * The expression passed to the macro should throw an exception and we can't
+ * catch it because Qt has been compiled without exception support. We can't
+ * skip the expression because it may have side effects and must be executed.
+ * So, users must use Qt with exception support enabled if they use exceptions
+ * in their code.
+ */
+#  define QVERIFY_EXCEPTION_THROWN(expression, exceptiontype) \
+    Q_STATIC_ASSERT_X(false, "Support of exceptions is disabled")
+
+#endif // !QT_NO_EXCEPTIONS
+
+
+#define QTRY_LOOP_IMPL(__expr, __timeoutValue, __step) \
     if (!(__expr)) { \
         QTest::qWait(0); \
     } \
-    for (int __i = 0; __i < __timeoutValue && !(__expr); __i+=__step) { \
+    int __i = 0; \
+    for (; __i < __timeoutValue && !(__expr); __i += __step) { \
         QTest::qWait(__step); \
+    }
+
+#define QTRY_TIMEOUT_DEBUG_IMPL(__expr, __timeoutValue, __step)\
+    if (!(__expr)) { \
+        QTRY_LOOP_IMPL((__expr), (2 * __timeoutValue), __step);\
+        if (__expr) { \
+            QString msg = QString::fromUtf8("QTestLib: This test case check (\"%1\") failed because the requested timeout (%2 ms) was too short, %3 ms would have been sufficient this time."); \
+            msg = msg.arg(QString::fromUtf8(#__expr)).arg(__timeoutValue).arg(__timeoutValue + __i); \
+            QFAIL(qPrintable(msg)); \
         } \
+    }
+
+#define QTRY_IMPL(__expr, __timeout)\
+    const int __step = 50; \
+    const int __timeoutValue = __timeout; \
+    QTRY_LOOP_IMPL((__expr), __timeoutValue, __step); \
+    QTRY_TIMEOUT_DEBUG_IMPL((__expr), __timeoutValue, __step)\
+
+// Will try to wait for the expression to become true while allowing event processing
+#define QTRY_VERIFY_WITH_TIMEOUT(__expr, __timeout) \
+do { \
+    QTRY_IMPL((__expr), __timeout);\
     QVERIFY(__expr); \
 } while (0)
 
-#define QTRY_VERIFY(__expr) QTRY_VERIFY_WITH_TIMEOUT(__expr, 5000)
+#define QTRY_VERIFY(__expr) QTRY_VERIFY_WITH_TIMEOUT((__expr), 5000)
 
 // Will try to wait for the comparison to become successful while allowing event processing
-
 #define QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, __timeout) \
 do { \
-    const int __step = 50; \
-    const int __timeoutValue = __timeout; \
-    if ((__expr) != (__expected)) { \
-        QTest::qWait(0); \
-    } \
-    for (int __i = 0; __i < __timeoutValue && ((__expr) != (__expected)); __i+=__step) { \
-        QTest::qWait(__step); \
-    } \
-    QCOMPARE(__expr, __expected); \
+    QTRY_IMPL(((__expr) == (__expected)), __timeout);\
+    QCOMPARE((__expr), __expected); \
 } while (0)
 
-#define QTRY_COMPARE(__expr, __expected) QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, 5000)
+#define QTRY_COMPARE(__expr, __expected) QTRY_COMPARE_WITH_TIMEOUT((__expr), __expected, 5000)
 
 #define QSKIP_INTERNAL(statement) \
 do {\
@@ -177,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 *);
 
@@ -191,6 +248,7 @@ namespace QTest
                            const char *file, int line);
     Q_TESTLIB_EXPORT void qWarn(const char *message, const char *file = 0, int line = 0);
     Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const char *message);
+    Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern);
 
     Q_TESTLIB_EXPORT QString qFindTestData(const char* basepath, const char* file = 0, int line = 0, const char* builddir = 0);
     Q_TESTLIB_EXPORT QString qFindTestData(const QString& basepath, const char* file = 0, int line = 0, const char* builddir = 0);
diff --git a/src/testlib/qtestkeyboard.h b/src/testlib/qtestkeyboard.h
index 8788067..d693d66 100644
--- a/src/testlib/qtestkeyboard.h
+++ b/src/testlib/qtestkeyboard.h
@@ -151,17 +151,17 @@ namespace QTest
                                 Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { sendKeyEvent(action, window, key, keyToAscii(key), modifier, delay); }
 
-    inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Click, window, key, modifier, delay); }
-    inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Click, window, key, modifier, delay); }
-    inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Release, window, key, modifier, delay); }
-    inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Release, window, key, modifier, delay); }
-    inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Press, window, key, modifier, delay); }
-    inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+    Q_DECL_UNUSED inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
     { keyEvent(Press, window, key, modifier, delay); }
 
 #ifdef QT_WIDGETS_LIB
diff --git a/src/testlib/qtestsystem.h b/src/testlib/qtestsystem.h
index 2a719e9..f859ff16 100644
--- a/src/testlib/qtestsystem.h
+++ b/src/testlib/qtestsystem.h
@@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
 
 namespace QTest
 {
-    inline static void qWait(int ms)
+    Q_DECL_UNUSED inline static void qWait(int ms)
     {
         Q_ASSERT(QCoreApplication::instance());
 
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to