summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Faure <faure@kde.org>2012-07-14 01:37:53 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-25 13:31:14 +0200
commit790aca0ea1bbd33a8ff29c83c0ab0bd968304f03 (patch)
treed8b708fe722a72baeb040630160081532e19cf10 /src
parent3a27d4b480214072d972ac67561f2ee4010f8baa (diff)
Add QSignalSpy::wait() method.
Change-Id: I1f3b49e3dee19bf0b1d2933c6e6ad7972186e0d0 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com> Reviewed-by: Jason McDonald <jason.mcdonald@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/testlib/qsignalspy.h17
-rw-r--r--src/testlib/qsignalspy.qdoc9
-rw-r--r--src/testlib/qtestcase.cpp2
-rw-r--r--src/testlib/qtesteventloop.h7
4 files changed, 31 insertions, 4 deletions
diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h
index 70944baadf..18def8f6c4 100644
--- a/src/testlib/qsignalspy.h
+++ b/src/testlib/qsignalspy.h
@@ -47,6 +47,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qmetaobject.h>
#include <QtCore/qvariant.h>
+#include <QtTest/qtesteventloop.h>
QT_BEGIN_HEADER
@@ -59,6 +60,7 @@ class QSignalSpy: public QObject, public QList<QList<QVariant> >
{
public:
QSignalSpy(QObject *obj, const char *aSignal)
+ : m_waiting(false)
{
#ifdef Q_CC_BOR
const int memberOffset = QObject::staticMetaObject.methodCount();
@@ -100,6 +102,15 @@ public:
inline bool isValid() const { return !sig.isEmpty(); }
inline QByteArray signal() const { return sig; }
+ bool wait(int timeout = 5000)
+ {
+ Q_ASSERT(!m_waiting);
+ const int origCount = count();
+ m_waiting = true;
+ m_loop.enterLoopMSecs(timeout);
+ m_waiting = false;
+ return count() > origCount;
+ }
int qt_metacall(QMetaObject::Call call, int methodId, void **a)
{
@@ -139,12 +150,18 @@ private:
list << QVariant(type, a[i + 1]);
}
append(list);
+
+ if (m_waiting)
+ m_loop.exitLoop();
}
// the full, normalized signal name
QByteArray sig;
// holds the QMetaType types for the argument list of the signal
QList<int> args;
+
+ QTestEventLoop m_loop;
+ bool m_waiting;
};
QT_END_NAMESPACE
diff --git a/src/testlib/qsignalspy.qdoc b/src/testlib/qsignalspy.qdoc
index 7ce0a51505..e9e1f4d5e6 100644
--- a/src/testlib/qsignalspy.qdoc
+++ b/src/testlib/qsignalspy.qdoc
@@ -86,3 +86,12 @@
\internal
*/
+/*! \fn QSignalSpy::wait(int timeout) const
+
+ \since 5.0
+
+ Starts an event loop that runs until the given signal is received.
+ Optionally the event loop can return earlier on a \a timeout (in milliseconds).
+
+ Returns true if the signal was emitted at least once in \a timeout milliseconds, otherwise returns false.
+*/
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index bf402181c1..296bc96c4b 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -856,7 +856,7 @@ QT_BEGIN_NAMESPACE
The code above will wait until the network server is responding for a
maximum of about 12.5 seconds.
- \sa QTest::qSleep()
+ \sa QTest::qSleep(), QSignalSpy::wait()
*/
/*! \fn bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
diff --git a/src/testlib/qtesteventloop.h b/src/testlib/qtesteventloop.h
index 98d69963ca..3f08a93b69 100644
--- a/src/testlib/qtesteventloop.h
+++ b/src/testlib/qtesteventloop.h
@@ -61,8 +61,9 @@ class Q_TESTLIB_EXPORT QTestEventLoop : public QObject
public:
inline QTestEventLoop(QObject *aParent = 0)
: QObject(aParent), inLoop(false), _timeout(false), timerId(-1), loop(0) {}
- inline void enterLoop(int secs);
+ inline void enterLoopMSecs(int ms);
+ inline void enterLoop(int secs) { enterLoopMSecs(secs * 1000); }
inline void changeInterval(int secs)
{ killTimer(timerId); timerId = startTimer(secs * 1000); }
@@ -92,7 +93,7 @@ private:
QEventLoop *loop;
};
-inline void QTestEventLoop::enterLoop(int secs)
+inline void QTestEventLoop::enterLoopMSecs(int ms)
{
Q_ASSERT(!loop);
@@ -101,7 +102,7 @@ inline void QTestEventLoop::enterLoop(int secs)
inLoop = true;
_timeout = false;
- timerId = startTimer(secs * 1000);
+ timerId = startTimer(ms);
loop = &l;
l.exec();