aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltest/quicktest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmltest/quicktest.cpp')
-rw-r--r--src/qmltest/quicktest.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp
index 66f1d861a2..ef026d4573 100644
--- a/src/qmltest/quicktest.cpp
+++ b/src/qmltest/quicktest.cpp
@@ -62,6 +62,8 @@
#include <stdio.h>
#include <QtGui/QGuiApplication>
#include <QtCore/QTranslator>
+#include <QtTest/QSignalSpy>
+
QT_BEGIN_NAMESPACE
class QTestRootObject : public QObject
@@ -145,6 +147,24 @@ void handleCompileErrors(const QFileInfo &fi, QQuickView *view)
results.stopLogging();
}
+static bool qWaitForSignal(QObject *obj, const char* signal, int timeout = 5000)
+{
+ QSignalSpy spy(obj, signal);
+ QElapsedTimer timer;
+ timer.start();
+
+ while (!spy.size()) {
+ int remaining = timeout - int(timer.elapsed());
+ if (remaining <= 0)
+ break;
+ QCoreApplication::processEvents(QEventLoop::AllEvents, remaining);
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ QTest::qSleep(10);
+ }
+
+ return spy.size();
+}
+
int quick_test_main(int argc, char **argv, const char *name, const char *sourceDir)
{
QGuiApplication* app = 0;
@@ -284,10 +304,11 @@ int quick_test_main(int argc, char **argv, const char *name, const char *sourceD
// If the test already quit, then it was performed
// synchronously during setSource(). Otherwise it is
// an asynchronous test and we need to show the window
- // and wait for the quit indication.
+ // and wait for the first frame to be rendered
+ // and then wait for quit indication.
view->show();
- QTest::qWaitForWindowShown(view);
- rootobj.setWindowShown(true);
+ if (qWaitForSignal(view, SIGNAL(frameSwapped())))
+ rootobj.setWindowShown(true);
if (!rootobj.hasQuit && rootobj.hasTestCase())
eventLoop.exec();
}