Align windowShown flag with qml renderer state
authorCharles Yin <charles.yin@nokia.com>
Tue, 12 Jun 2012 04:46:12 +0000 (14:46 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 14 Jun 2012 00:44:19 +0000 (02:44 +0200)
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 <michael.brasser@nokia.com>
src/qmltest/quicktest.cpp
tests/auto/qmltest/pixel/tst_pixel.qml

index 66f1d86..ef026d4 100644 (file)
@@ -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();
         }
index 624f084..d36bce2 100644 (file)
@@ -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);