From 4276def0405d22e7cbfb75465a42b5a68e7472fe Mon Sep 17 00:00:00 2001 From: Charles Yin Date: Tue, 12 Jun 2012 14:46:12 +1000 Subject: [PATCH] Align windowShown flag with qml renderer state Previously, we set windowShown to true once the window is active, this is not enough for some tests as the initial rendering may not be finished yet and will give the wrong result for some tests which require reading back pixels. Change-Id: Idd67329d207aaf1734a795b40a5bcc40093cf6b8 Reviewed-by: Michael Brasser --- src/qmltest/quicktest.cpp | 27 ++++++++++++++++++++++++--- tests/auto/qmltest/pixel/tst_pixel.qml | 1 - 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp index 66f1d86..ef026d4 100644 --- a/src/qmltest/quicktest.cpp +++ b/src/qmltest/quicktest.cpp @@ -62,6 +62,8 @@ #include #include #include +#include + 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(); } diff --git a/tests/auto/qmltest/pixel/tst_pixel.qml b/tests/auto/qmltest/pixel/tst_pixel.qml index 624f084..d36bce2 100644 --- a/tests/auto/qmltest/pixel/tst_pixel.qml +++ b/tests/auto/qmltest/pixel/tst_pixel.qml @@ -52,7 +52,6 @@ Rectangle { when: windowShown function test_pixel() { - wait(200); var img = grabImage(rect); compare(img.pixel(20, 20), Qt.rgba(255, 0, 0, 255)); compare(img.red(1,1), 255); -- 2.7.4