diff options
Diffstat (limited to 'tests')
44 files changed, 1553 insertions, 178 deletions
diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp index 610d80d559..022ba8c440 100644 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp +++ b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp @@ -84,7 +84,8 @@ QQmlEngineDebugClient::QQmlEngineDebugClient( QQmlDebugConnection *connection) : QQmlDebugClient(QLatin1String("QmlDebugger"), connection), m_nextId(0), - m_valid(false) + m_valid(false), + m_connection(connection) { } @@ -467,6 +468,9 @@ void QQmlEngineDebugClient::messageReceived(const QByteArray &data) { m_valid = false; QDataStream ds(data); + ds.setVersion(m_connection->dataStreamVersion()); + + int queryId; QByteArray type; ds >> type >> queryId; diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h index 1d4b95a9e3..2712692389 100644 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h +++ b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h @@ -242,6 +242,8 @@ private: QmlDebugObjectReference m_object; QList<QmlDebugObjectReference> m_objects; QVariant m_exprResult; + + QQmlDebugConnection *m_connection; }; #endif // QQMLENGINEDEBUGCLIENT_H diff --git a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp index dbf28a5471..d5a5f10634 100644 --- a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp +++ b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp @@ -267,8 +267,8 @@ void tst_qqmlcomponent::qmlCreateParentReference() void tst_qqmlcomponent::async() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine); @@ -287,8 +287,8 @@ void tst_qqmlcomponent::async() void tst_qqmlcomponent::asyncHierarchy() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); // ensure that the item hierarchy is compiled correctly. diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index a1e36b42e6..770d6b8197 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -4171,8 +4171,8 @@ void tst_qqmlecmascript::importScripts() QFETCH(QStringList, propertyNames); QFETCH(QVariantList, propertyValues); - TestHTTPServer server(8111); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(8111), qPrintable(server.errorString())); server.serveDirectory(dataDirectory() + "/remote"); QStringList importPathList = engine.importPathList(); @@ -5999,8 +5999,8 @@ void tst_qqmlecmascript::include() // Remote - error { - TestHTTPServer server(8111); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(8111), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine, testFileUrl("include_remote_missing.qml")); @@ -6024,8 +6024,8 @@ void tst_qqmlecmascript::includeRemoteSuccess() #endif // Remote - success - TestHTTPServer server(8111); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(8111), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine, testFileUrl("include_remote.qml")); diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 3561635351..be417df325 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -2298,7 +2298,8 @@ void tst_qqmllanguage::basicRemote() QFETCH(QString, type); QFETCH(QString, error); - TestHTTPServer server(14447); + TestHTTPServer server; + QVERIFY2(server.listen(14447), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine, url); @@ -2342,7 +2343,8 @@ void tst_qqmllanguage::importsRemote() QFETCH(QString, type); QFETCH(QString, error); - TestHTTPServer server(14447); + TestHTTPServer server; + QVERIFY2(server.listen(14447), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); testType(qml,type,error); @@ -2434,7 +2436,8 @@ void tst_qqmllanguage::importsInstalledRemote() QFETCH(QString, type); QFETCH(QString, error); - TestHTTPServer server(14447); + TestHTTPServer server; + QVERIFY2(server.listen(14447), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QString serverdir = "http://127.0.0.1:14447/lib/"; @@ -2500,7 +2503,8 @@ void tst_qqmllanguage::importsPath() QFETCH(QString, qml); QFETCH(QString, value); - TestHTTPServer server(14447); + TestHTTPServer server; + QVERIFY2(server.listen(14447), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); engine.setImportPathList(QStringList(defaultImportPathList) << importPath); @@ -3076,7 +3080,8 @@ void tst_qqmllanguage::registeredCompositeType() // QTBUG-18268 void tst_qqmllanguage::remoteLoadCrash() { - TestHTTPServer server(14448); + TestHTTPServer server; + QVERIFY2(server.listen(14448), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine); @@ -3566,7 +3571,8 @@ void tst_qqmllanguage::compositeSingletonQmlDirError() // Load a remote composite singleton type via qmldir that defines the type as a singleton void tst_qqmllanguage::compositeSingletonRemote() { - TestHTTPServer server(14447); + TestHTTPServer server; + QVERIFY2(server.listen(14447), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine, testFile("singletonTest15.qml")); diff --git a/tests/auto/qml/qqmlmoduleplugin/tst_qqmlmoduleplugin.cpp b/tests/auto/qml/qqmlmoduleplugin/tst_qqmlmoduleplugin.cpp index 15be1fdbc0..1861b37bea 100644 --- a/tests/auto/qml/qqmlmoduleplugin/tst_qqmlmoduleplugin.cpp +++ b/tests/auto/qml/qqmlmoduleplugin/tst_qqmlmoduleplugin.cpp @@ -247,8 +247,8 @@ void tst_qqmlmoduleplugin::importPluginWithQmlFile() void tst_qqmlmoduleplugin::remoteImportWithQuotedUrl() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(m_dataImportsDirectory); QQmlEngine engine; @@ -268,8 +268,8 @@ void tst_qqmlmoduleplugin::remoteImportWithQuotedUrl() void tst_qqmlmoduleplugin::remoteImportWithUnquotedUri() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(m_dataImportsDirectory); QQmlEngine engine; diff --git a/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp b/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp index 17becb3714..e1ccde2c42 100644 --- a/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp +++ b/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp @@ -240,13 +240,12 @@ void tst_qqmlxmlhttprequest::open() QFETCH(QString, url); QFETCH(bool, remote); - QScopedPointer<TestHTTPServer> server; // ensure deletion in case test fails + TestHTTPServer server; if (remote) { - server.reset(new TestHTTPServer(SERVER_PORT)); - QVERIFY(server->isValid()); - QVERIFY(server->wait(testFileUrl("open_network.expect"), - testFileUrl("open_network.reply"), - testFileUrl("testdocument.html"))); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); + QVERIFY(server.wait(testFileUrl("open_network.expect"), + testFileUrl("open_network.reply"), + testFileUrl("testdocument.html"))); } QQmlComponent component(&engine, qmlFile); @@ -322,8 +321,8 @@ void tst_qqmlxmlhttprequest::open_arg_count() // Test valid setRequestHeader() calls void tst_qqmlxmlhttprequest::setRequestHeader() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("setRequestHeader.expect"), testFileUrl("setRequestHeader.reply"), testFileUrl("testdocument.html"))); @@ -340,8 +339,8 @@ void tst_qqmlxmlhttprequest::setRequestHeader() // Test valid setRequestHeader() calls with different header cases void tst_qqmlxmlhttprequest::setRequestHeader_caseInsensitive() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("setRequestHeader.expect"), testFileUrl("setRequestHeader.reply"), testFileUrl("testdocument.html"))); @@ -397,8 +396,8 @@ void tst_qqmlxmlhttprequest::setRequestHeader_illegalName() { QFETCH(QString, name); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("open_network.expect"), testFileUrl("open_network.reply"), testFileUrl("testdocument.html"))); @@ -423,8 +422,8 @@ void tst_qqmlxmlhttprequest::setRequestHeader_illegalName() // Test that attempting to set a header after a request is sent throws an exception void tst_qqmlxmlhttprequest::setRequestHeader_sent() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("open_network.expect"), testFileUrl("open_network.reply"), testFileUrl("testdocument.html"))); @@ -475,8 +474,8 @@ void tst_qqmlxmlhttprequest::send_alreadySent() void tst_qqmlxmlhttprequest::send_ignoreData() { { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("send_ignoreData_GET.expect"), testFileUrl("send_ignoreData.reply"), testFileUrl("testdocument.html"))); @@ -492,8 +491,8 @@ void tst_qqmlxmlhttprequest::send_ignoreData() } { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("send_ignoreData_HEAD.expect"), testFileUrl("send_ignoreData.reply"), QUrl())); @@ -509,8 +508,8 @@ void tst_qqmlxmlhttprequest::send_ignoreData() } { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("send_ignoreData_DELETE.expect"), testFileUrl("send_ignoreData.reply"), QUrl())); @@ -532,8 +531,8 @@ void tst_qqmlxmlhttprequest::send_withdata() QFETCH(QString, file_expected); QFETCH(QString, file_qml); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl(file_expected), testFileUrl("send_data.reply"), testFileUrl("testdocument.html"))); @@ -602,8 +601,8 @@ void tst_qqmlxmlhttprequest::abort_opened() // Test abort() aborts in progress send void tst_qqmlxmlhttprequest::abort() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("abort.expect"), testFileUrl("abort.reply"), testFileUrl("testdocument.html"))); @@ -626,8 +625,8 @@ void tst_qqmlxmlhttprequest::getResponseHeader() { QQmlEngine engine; // Avoid cookie contamination - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("getResponseHeader.expect"), testFileUrl("getResponseHeader.reply"), testFileUrl("testdocument.html"))); @@ -693,8 +692,8 @@ void tst_qqmlxmlhttprequest::getAllResponseHeaders() { QQmlEngine engine; // Avoid cookie contamination - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("getResponseHeader.expect"), testFileUrl("getResponseHeader.reply"), testFileUrl("testdocument.html"))); @@ -754,8 +753,8 @@ void tst_qqmlxmlhttprequest::status() QFETCH(QUrl, replyUrl); QFETCH(int, status); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("status.expect"), replyUrl, testFileUrl("testdocument.html"))); @@ -793,8 +792,8 @@ void tst_qqmlxmlhttprequest::statusText() QFETCH(QUrl, replyUrl); QFETCH(QString, statusText); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("status.expect"), replyUrl, testFileUrl("testdocument.html"))); @@ -833,8 +832,8 @@ void tst_qqmlxmlhttprequest::responseText() QFETCH(QUrl, bodyUrl); QFETCH(QString, responseText); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); QVERIFY(server.wait(testFileUrl("status.expect"), replyUrl, bodyUrl)); @@ -934,8 +933,8 @@ void tst_qqmlxmlhttprequest::invalidMethodUsage() void tst_qqmlxmlhttprequest::redirects() { { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirecttarget.html"); server.serveDirectory(dataDirectory()); @@ -951,8 +950,8 @@ void tst_qqmlxmlhttprequest::redirects() } { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirectmissing.html"); server.serveDirectory(dataDirectory()); @@ -968,8 +967,8 @@ void tst_qqmlxmlhttprequest::redirects() } { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirect.html"); server.serveDirectory(dataDirectory()); @@ -1070,8 +1069,8 @@ void tst_qqmlxmlhttprequest::stateChangeCallingContext() // ensure that we don't crash by attempting to evaluate // without a valid calling context. - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory(), TestHTTPServer::Delay); QQmlComponent component(&engine, testFileUrl("stateChangeCallingContext.qml")); diff --git a/tests/auto/qmltest/item/tst_layerInPositioner.qml b/tests/auto/qmltest/item/tst_layerInPositioner.qml new file mode 100644 index 0000000000..9144fe1d8f --- /dev/null +++ b/tests/auto/qmltest/item/tst_layerInPositioner.qml @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtTest 1.0 + +Item { + id: root; + width: 400 + height: 400 + + TestCase { + id: testCase + name: "transparentForPositioner" + when: windowShown + function test_endresult() { + var image = grabImage(root); + + // Row of red, green, blue and white box inside blue + // At 10,10, spanning 10x10 pixels each + verify(image.pixel(10, 10) == Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(20, 10) == Qt.rgba(0, 1, 0, 1)); + verify(image.pixel(30, 10) == Qt.rgba(0, 0, 1, 1)); + + // Column of red, green, blue and white box inside blue + // At 10,30, spanning 10x10 pixels each + verify(image.pixel(10, 30) == Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(10, 40) == Qt.rgba(0, 1, 0, 1)); + verify(image.pixel(10, 50) == Qt.rgba(0, 0, 1, 1)); + + // Flow of red, green, blue and white box inside blue + // At 30,30, spanning 10x10 pixels each, wrapping after two boxes + verify(image.pixel(30, 30) == Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(40, 30) == Qt.rgba(0, 1, 0, 1)); + verify(image.pixel(30, 40) == Qt.rgba(0, 0, 1, 1)); + + // Flow of red, green, blue and white box inside blue + // At 100,10, spanning 10x10 pixels each, wrapping after two boxes + verify(image.pixel(60, 10) == Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(70, 10) == Qt.rgba(0, 1, 0, 1)); + verify(image.pixel(60, 20) == Qt.rgba(0, 0, 1, 1)); + } + } + + Component { + id: greenPassThrough + ShaderEffect { + fragmentShader: + " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = texture2D(source, qt_TexCoord0) * vec4(0, 1, 0, 1); + } + " + } + } + + Row { + id: theRow + x: 10 + y: 10 + Rectangle { + width: 10 + height: 10 + color: "#ff0000" + layer.enabled: true + } + + Rectangle { + width: 10 + height: 10 + color: "#ffffff" + layer.enabled: true + layer.effect: greenPassThrough + } + + Rectangle { + id: blueInRow + width: 10 + height: 10 + color: "#0000ff" + } + } + + Column { + id: theColumn + x: 10 + y: 30 + Rectangle { + width: 10 + height: 10 + color: "#ff0000" + layer.enabled: true + } + + Rectangle { + width: 10 + height: 10 + color: "#ffffff" + layer.enabled: true + layer.effect: greenPassThrough + } + + Rectangle { + id: blueInColumn + width: 10 + height: 10 + color: "#0000ff" + } + } + + Flow { + id: theFlow + x: 30 + y: 30 + width: 20 + Rectangle { + width: 10 + height: 10 + color: "#ff0000" + layer.enabled: true + } + + Rectangle { + width: 10 + height: 10 + color: "#ffffff" + layer.enabled: true + layer.effect: greenPassThrough + } + + Rectangle { + id: blueInFlow + width: 10 + height: 10 + color: "#0000ff" + } + } + + Grid { + id: theGrid + x: 60 + y: 10 + columns: 2 + Rectangle { + width: 10 + height: 10 + color: "#ff0000" + layer.enabled: true + } + + Rectangle { + width: 10 + height: 10 + color: "#ffffff" + layer.enabled: true + layer.effect: greenPassThrough + } + + Rectangle { + id: blueInGrid + width: 10 + height: 10 + color: "#0000ff" + } + } + +} diff --git a/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml b/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml new file mode 100644 index 0000000000..4f827bbf33 --- /dev/null +++ b/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml @@ -0,0 +1,160 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtTest 1.0 + +Item { + id: root; + width: 400 + height: 400 + + TestCase { + id: testCase + name: "item-grabber" + when: imageOnDisk.ready && imageOnDiskSmall.ready && imageInCache.ready && imageInCacheSmall.ready + function test_endresult() { + var image = grabImage(root); + + // imageOnDisk at (0, 0) - (100x100) + compare(imageOnDisk.width, 100); + compare(imageOnDisk.height, 100); + verify(image.pixel(0, 0) === Qt.rgba(1, 0, 0, 1)); // Use verify because compare doesn't support colors (QTBUG-34878) + verify(image.pixel(99, 99) === Qt.rgba(0, 0, 1, 1)); + + // imageOnDiskSmall at (100, 0) - 50x50 + compare(imageOnDiskSmall.width, 50); + compare(imageOnDiskSmall.height, 50); + verify(image.pixel(100, 0) === Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(149, 49) === Qt.rgba(0, 0, 1, 1)); + + // imageInCache at (0, 100) - 100x100 + compare(imageInCache.width, 100); + compare(imageInCache.height, 100); + verify(image.pixel(0, 100) === Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(99, 199) === Qt.rgba(0, 0, 1, 1)); + + // imageInCacheSmall at (100, 100) - 50x50 + compare(imageInCacheSmall.width, 50); + compare(imageInCacheSmall.height, 50); + verify(image.pixel(100, 100) === Qt.rgba(1, 0, 0, 1)); + verify(image.pixel(149, 149) === Qt.rgba(0, 0, 1, 1)); + + // After all that has been going on, it should only have been called that one time.. + compare(imageOnDisk.callCount, 1); + } + + onWindowShownChanged: { + box.grabToImage(imageOnDisk.handleGrab); + box.grabToImage(imageOnDiskSmall.handleGrab, Qt.size(50, 50)); + box.grabToImage(imageInCache.handleGrab); + box.grabToImage(imageInCacheSmall.handleGrab, Qt.size(50, 50)); + } + + } + + Rectangle { + id: box + width: 100 + height: 100 + color: "red"; + + visible: false + + Rectangle { + anchors.bottom: parent.bottom; + anchors.right: parent.right; + width: 10 + height: 10 + color: "blue"; + } + } + + Image { + id: imageOnDisk + x: 0 + y: 0 + property int callCount: 0; + property bool ready: false; + function handleGrab(result) { + if (!result.saveToFile("image.png")) + print("Error: Failed to save image to disk..."); + source = "image.png"; + ready = true; + ++callCount; + } + } + + Image { + id: imageOnDiskSmall + x: 100 + y: 0 + property bool ready: false; + function handleGrab(result) { + if (!result.saveToFile("image_small.png")) + print("Error: Failed to save image to disk..."); + source = "image_small.png"; + ready = true; + } + } + + Image { + id: imageInCache + x: 0 + y: 100 + property bool ready: false; + function handleGrab(result) { + source = result.url; + ready = true; + } + } + + Image { + id: imageInCacheSmall + x: 100 + y: 100 + property bool ready: false; + function handleGrab(result) { + source = result.url; + ready = true; + } + } +} diff --git a/tests/auto/qmltest/shadersource/tst_DynamicallyCreated.qml b/tests/auto/qmltest/shadersource/tst_DynamicallyCreated.qml new file mode 100644 index 0000000000..ba0289fadc --- /dev/null +++ b/tests/auto/qmltest/shadersource/tst_DynamicallyCreated.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Window 2.0 +import QtTest 1.0 + +Item { + width: 100 + height: 100 + + Window { + id: win + + width: 100 + height: 100 + + property bool rendered: false; + visible: true + + title: "QML window" + + onFrameSwapped: { + if (shaderSource.sourceItem) { + rendered = true; + } else { + var com = Qt.createQmlObject('import QtQuick 2.2; Rectangle { color: "red"; width: 100; height: 100 }', win); + shaderSource.sourceItem = com; + } + } + + ShaderEffectSource { + id: shaderSource + } + + } + + TestCase { + when: win.rendered; + name: "shadersource-dynamic-sourceobject" + function test_endresult() { + var image = grabImage(shaderSource); + compare(image.pixel(0, 0), Qt.rgba(1, 0, 0, 1)); + } + } +} diff --git a/tests/auto/qmltest/shadersource/tst_SourceInOtherWindow.qml b/tests/auto/qmltest/shadersource/tst_SourceInOtherWindow.qml new file mode 100644 index 0000000000..d9959d7fad --- /dev/null +++ b/tests/auto/qmltest/shadersource/tst_SourceInOtherWindow.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.0 + +import QtTest 1.0 + +Item { + Rectangle { + id: box + color: "red" + } + + Window { + id: childWindow + + width: 100 + height: 100 + + property bool rendered: false; + visible: true + onFrameSwapped: rendered = true; + + ShaderEffectSource { + id: theSource + sourceItem: box + } + + ShaderEffect { + property variant source: theSource; + anchors.fill: parent + } + } + + TestCase { + name: "shadersource-from-other-window" + when: childWindow.isRendered + function test_endresult() { + verify(true); // that we got here without problems... + } + } +} diff --git a/tests/auto/qmltest/shadersource/tst_SourcedFromOtherWindow.qml b/tests/auto/qmltest/shadersource/tst_SourcedFromOtherWindow.qml new file mode 100644 index 0000000000..436705befc --- /dev/null +++ b/tests/auto/qmltest/shadersource/tst_SourcedFromOtherWindow.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.0 + +import QtTest 1.0 + +Item { + Rectangle { + id: box + color: "red" + } + + ShaderEffectSource { + id: theSource + sourceItem: box + } + + Window { + id: childWindow + + width: 100 + height: 100 + + property bool rendered: false; + visible: true + onFrameSwapped: rendered = true; + + ShaderEffect { + property variant source: theSource; + anchors.fill: parent + } + } + + TestCase { + name: "shadersource-from-other-window" + when: childWindow.isRendered + function test_endresult() { + verify(true); // that we got here without problems... + } + } +} diff --git a/tests/auto/quick/nodes/tst_nodestest.cpp b/tests/auto/quick/nodes/tst_nodestest.cpp index 662e78ef6c..212337957e 100644 --- a/tests/auto/quick/nodes/tst_nodestest.cpp +++ b/tests/auto/quick/nodes/tst_nodestest.cpp @@ -52,6 +52,8 @@ #include <QtQuick/private/qsgcontext_p.h> #include <QtQuick/qsgsimplerectnode.h> +#include <QtQuick/qsgsimpletexturenode.h> +#include <QtQuick/private/qsgtexture_p.h> class NodesTest : public QObject { @@ -74,6 +76,8 @@ private Q_SLOTS: void isBlockedCheck(); + void textureNodeTextureOwnership(); + private: QOffscreenSurface *surface; QOpenGLContext *context; @@ -259,6 +263,32 @@ void NodesTest::isBlockedCheck() QVERIFY(!updater.isNodeBlocked(node, &root)); } +void NodesTest::textureNodeTextureOwnership() +{ + { // Check that it is not deleted by default + QPointer<QSGTexture> texture(new QSGPlainTexture()); + + QSGSimpleTextureNode *tn = new QSGSimpleTextureNode(); + QVERIFY(!tn->ownsTexture()); + + tn->setTexture(texture); + delete tn; + QVERIFY(!texture.isNull()); + } + + { // Check that it is deleted when we so desire + QPointer<QSGTexture> texture(new QSGPlainTexture()); + + QSGSimpleTextureNode *tn = new QSGSimpleTextureNode(); + tn->setOwnsTexture(true); + QVERIFY(tn->ownsTexture()); + + tn->setTexture(texture); + delete tn; + QVERIFY(texture.isNull()); + } +} + QTEST_MAIN(NodesTest); #include "tst_nodestest.moc" diff --git a/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp b/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp index d10963b579..49bbb3a4c5 100644 --- a/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp +++ b/tests/auto/quick/qquickanimatedimage/tst_qquickanimatedimage.cpp @@ -259,8 +259,8 @@ void tst_qquickanimatedimage::remote() QFETCH(QString, fileName); QFETCH(bool, paused); - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -324,8 +324,8 @@ void tst_qquickanimatedimage::invalidSource() void tst_qquickanimatedimage::sourceSizeChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -390,8 +390,8 @@ void tst_qquickanimatedimage::sourceSizeChanges() void tst_qquickanimatedimage::qtbug_16520() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -413,8 +413,8 @@ void tst_qquickanimatedimage::qtbug_16520() void tst_qquickanimatedimage::progressAndStatusChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; diff --git a/tests/auto/quick/qquickapplication/tst_qquickapplication.cpp b/tests/auto/quick/qquickapplication/tst_qquickapplication.cpp index dfcef43a7e..0993d03ee4 100644 --- a/tests/auto/quick/qquickapplication/tst_qquickapplication.cpp +++ b/tests/auto/quick/qquickapplication/tst_qquickapplication.cpp @@ -60,6 +60,7 @@ private slots: void state(); void layoutDirection(); void inputMethod(); + void cleanup(); private: QQmlEngine engine; @@ -69,6 +70,14 @@ tst_qquickapplication::tst_qquickapplication() { } +void tst_qquickapplication::cleanup() +{ + if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ApplicationState)) { + QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationInactive); + QTest::waitForEvents(); + } +} + void tst_qquickapplication::active() { QQmlComponent component(&engine); @@ -98,12 +107,19 @@ void tst_qquickapplication::active() QVERIFY(item->property("active").toBool()); QVERIFY(item->property("active2").toBool()); - // not active again QWindowSystemInterface::handleWindowActivated(0); +#ifdef Q_OS_OSX + // OS X has the concept of "reactivation" + QTRY_VERIFY(QGuiApplication::focusWindow() != &window); + QVERIFY(item->property("active").toBool()); + QVERIFY(item->property("active2").toBool()); +#else + // not active again QTRY_VERIFY(QGuiApplication::focusWindow() != &window); QVERIFY(!item->property("active").toBool()); QVERIFY(!item->property("active2").toBool()); +#endif } void tst_qquickapplication::state() @@ -117,6 +133,7 @@ void tst_qquickapplication::state() " target: Qt.application; " " onStateChanged: state2 = Qt.application.state; " " } " + " Component.onCompleted: state2 = Qt.application.state; " "}", QUrl::fromLocalFile("")); QQuickItem *item = qobject_cast<QQuickItem *>(component.create()); QVERIFY(item); diff --git a/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp b/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp index 4e7b6522dd..c02a5c7a87 100644 --- a/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp +++ b/tests/auto/quick/qquickborderimage/tst_qquickborderimage.cpp @@ -143,11 +143,10 @@ void tst_qquickborderimage::imageSource() QFETCH(bool, remote); QFETCH(QString, error); - TestHTTPServer *server = 0; + TestHTTPServer server; if (remote) { - server = new TestHTTPServer(SERVER_PORT); - QVERIFY(server->isValid()); - server->serveDirectory(dataDirectory()); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); + server.serveDirectory(dataDirectory()); } if (!error.isEmpty()) @@ -177,7 +176,6 @@ void tst_qquickborderimage::imageSource() } delete obj; - delete server; } void tst_qquickborderimage::clearSource() @@ -292,11 +290,11 @@ void tst_qquickborderimage::sciSource() QFETCH(bool, valid); bool remote = source.startsWith("http"); - TestHTTPServer *server = 0; + + TestHTTPServer server; if (remote) { - server = new TestHTTPServer(SERVER_PORT); - QVERIFY(server->isValid()); - server->serveDirectory(dataDirectory()); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); + server.serveDirectory(dataDirectory()); } QString componentStr = "import QtQuick 2.0\nBorderImage { source: \"" + source + "\"; width: 300; height: 300 }"; @@ -325,7 +323,6 @@ void tst_qquickborderimage::sciSource() } delete obj; - delete server; } void tst_qquickborderimage::sciSource_data() @@ -435,11 +432,10 @@ void tst_qquickborderimage::statusChanges() QFETCH(bool, remote); QFETCH(QQuickImageBase::Status, finalStatus); - TestHTTPServer *server = 0; + TestHTTPServer server; if (remote) { - server = new TestHTTPServer(SERVER_PORT); - QVERIFY(server->isValid()); - server->serveDirectory(dataDirectory(), TestHTTPServer::Delay); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); + server.serveDirectory(dataDirectory()); } QString componentStr = "import QtQuick 2.0\nBorderImage { width: 300; height: 300 }"; @@ -452,18 +448,17 @@ void tst_qquickborderimage::statusChanges() QVERIFY(obj != 0); obj->setSource(source); if (remote) - server->sendDelayedItem(); + server.sendDelayedItem(); QTRY_VERIFY(obj->status() == finalStatus); QCOMPARE(spy.count(), emissions); delete obj; - delete server; } void tst_qquickborderimage::sourceSizeChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -528,8 +523,8 @@ void tst_qquickborderimage::sourceSizeChanges() void tst_qquickborderimage::progressAndStatusChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index 8ab86bf2d3..7cc3350b05 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -100,7 +100,7 @@ private slots: void pressDelayWithLoader(); private: - void flickWithTouch(QWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to); + void flickWithTouch(QQuickWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to); QQmlEngine engine; }; @@ -1349,20 +1349,18 @@ void tst_qquickflickable::flickTwiceUsingTouches() QTRY_VERIFY(contentYAfterSecondFlick > (contentYAfterFirstFlick + 80.0f)); } -void tst_qquickflickable::flickWithTouch(QWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to) +void tst_qquickflickable::flickWithTouch(QQuickWindow *window, QTouchDevice *touchDevice, const QPoint &from, const QPoint &to) { - QTest::touchEvent(window, touchDevice) - .press(0, from, window); - QTest::qWait(1); + QTest::touchEvent(window, touchDevice).press(0, from, window); + QQuickTouchUtils::flush(window); + QPoint diff = to - from; for (int i = 1; i <= 8; ++i) { - QTest::touchEvent(window, touchDevice) - .move(0, from + i*diff/8, window); - QTest::qWait(1); + QTest::touchEvent(window, touchDevice).move(0, from + i*diff/8, window); + QQuickTouchUtils::flush(window); } - QTest::touchEvent(window, touchDevice) - .release(0, to, window); - QTest::qWait(1); + QTest::touchEvent(window, touchDevice).release(0, to, window); + QQuickTouchUtils::flush(window); } void tst_qquickflickable::nestedStopAtBounds_data() diff --git a/tests/auto/quick/qquickfontloader/tst_qquickfontloader.cpp b/tests/auto/quick/qquickfontloader/tst_qquickfontloader.cpp index bcb496eab7..5c2bbf1650 100644 --- a/tests/auto/quick/qquickfontloader/tst_qquickfontloader.cpp +++ b/tests/auto/quick/qquickfontloader/tst_qquickfontloader.cpp @@ -75,8 +75,7 @@ private: TestHTTPServer server; }; -tst_qquickfontloader::tst_qquickfontloader() : - server(SERVER_PORT) +tst_qquickfontloader::tst_qquickfontloader() { } @@ -84,7 +83,7 @@ void tst_qquickfontloader::initTestCase() { QQmlDataTest::initTestCase(); server.serveDirectory(dataDirectory()); - QVERIFY(server.isValid()); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); } void tst_qquickfontloader::noFont() diff --git a/tests/auto/quick/qquickimage/tst_qquickimage.cpp b/tests/auto/quick/qquickimage/tst_qquickimage.cpp index 0e012c5c6a..7951cb07cf 100644 --- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp +++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp @@ -177,9 +177,9 @@ void tst_qquickimage::imageSource() QFETCH(bool, cache); QFETCH(QString, error); - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; if (remote) { - QVERIFY(server.isValid()); + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png"); } @@ -529,8 +529,8 @@ void tst_qquickimage::noLoading() { qRegisterMetaType<QQuickImageBase::Status>(); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png"); @@ -690,8 +690,8 @@ void tst_qquickimage::nullPixmapPaint() void tst_qquickimage::imageCrash_QTBUG_22125() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory(), TestHTTPServer::Delay); { @@ -761,8 +761,8 @@ void tst_qquickimage::sourceSize() void tst_qquickimage::sourceSizeChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -827,8 +827,8 @@ void tst_qquickimage::sourceSizeChanges() void tst_qquickimage::progressAndStatusChanges() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(14449), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlEngine engine; @@ -935,8 +935,8 @@ void tst_qquickimage::correctStatus() void tst_qquickimage::highdpi() { - TestHTTPServer server(14449); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QString componentStr = "import QtQuick 2.0\nImage { source: srcImage ; }"; diff --git a/tests/auto/quick/qquickitem/qquickitem.pro b/tests/auto/quick/qquickitem/qquickitem.pro index d4bd0874d8..1d8ae0148b 100644 --- a/tests/auto/quick/qquickitem/qquickitem.pro +++ b/tests/auto/quick/qquickitem/qquickitem.pro @@ -3,6 +3,7 @@ TARGET = tst_qquickitem SOURCES += tst_qquickitem.cpp include (../../shared/util.pri) +include (../shared/util.pri) macx:CONFIG -= app_bundle diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp index 2db510a69e..40327b0666 100644 --- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp +++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp @@ -51,6 +51,7 @@ #include <QTimer> #include <QQmlEngine> #include "../../shared/util.h" +#include "../shared/viewtestutil.h" class TestItem : public QQuickItem { @@ -1313,6 +1314,7 @@ void tst_qquickitem::touchEventAcceptIgnore() item->touchEventReached = false; bool accepted = window.event(&event); + QQuickTouchUtils::flush(&window); QVERIFY(item->touchEventReached); @@ -1336,6 +1338,7 @@ void tst_qquickitem::touchEventAcceptIgnore() item->touchEventReached = false; bool accepted = window.event(&event); + QQuickTouchUtils::flush(&window); QCOMPARE(item->touchEventReached, itemSupportsTouch); @@ -1359,6 +1362,7 @@ void tst_qquickitem::touchEventAcceptIgnore() item->touchEventReached = false; bool accepted = window.event(&event); + QQuickTouchUtils::flush(&window); QCOMPARE(item->touchEventReached, itemSupportsTouch); diff --git a/tests/auto/quick/qquickitem2/data/grabToImage.qml b/tests/auto/quick/qquickitem2/data/grabToImage.qml new file mode 100644 index 0000000000..9f25210ee2 --- /dev/null +++ b/tests/auto/quick/qquickitem2/data/grabToImage.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + width: 320 + height: 480 + Rectangle { + objectName: "myItem"; + width: 100 + height: 100 + color: "red" + Rectangle { + anchors.right: parent.right + anchors.bottom: parent.bottom + width: 10 + height: 10 + color: "blue" + } + } +} diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp index 6778d6a8b6..9d2188253a 100644 --- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp +++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp @@ -91,6 +91,7 @@ private slots: void keyNavigation_RightToLeft(); void keyNavigation_skipNotVisible(); void keyNavigation_implicitSetting(); + void keyNavigation_focusReason(); void layoutMirroring(); void layoutMirroringIllegalParent(); void smooth(); @@ -120,6 +121,8 @@ private slots: void contains(); void childAt(); + void grab(); + private: QQmlEngine engine; bool qt_tab_all_widgets() { @@ -215,6 +218,21 @@ public: int mKey; }; +class FocusEventFilter : public QObject +{ +protected: + bool eventFilter(QObject *watched, QEvent *event) { + if ((event->type() == QEvent::FocusIn) || (event->type() == QEvent::FocusOut)) { + QFocusEvent *focusEvent = static_cast<QFocusEvent *>(event); + lastFocusReason = focusEvent->reason(); + return false; + } else + return QObject::eventFilter(watched, event); + } +public: + Qt::FocusReason lastFocusReason; +}; + QML_DECLARE_TYPE(KeyTestItem); class HollowTestItem : public QQuickItem @@ -1961,6 +1979,62 @@ void tst_QQuickItem::keyNavigation_implicitSetting() delete window; } +void tst_QQuickItem::keyNavigation_focusReason() +{ + QQuickView *window = new QQuickView(0); + window->setBaseSize(QSize(240,320)); + + FocusEventFilter focusEventFilter; + + window->setSource(testFileUrl("keynavigationtest.qml")); + window->show(); + window->requestActivate(); + + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + // install event filter on first item + QQuickItem *item = findItem<QQuickItem>(window->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + item->installEventFilter(&focusEventFilter); + + //install event filter on second item + item = findItem<QQuickItem>(window->rootObject(), "item2"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + //install event filter on third item + item = findItem<QQuickItem>(window->rootObject(), "item3"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + //install event filter on last item + item = findItem<QQuickItem>(window->rootObject(), "item4"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + // tab + QKeyEvent key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::TabFocusReason); + + // backtab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::BacktabFocusReason); + + // some arbitrary cursor key + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::OtherFocusReason); + + delete window; +} + void tst_QQuickItem::smooth() { QQmlComponent component(&engine); @@ -2737,6 +2811,41 @@ void tst_QQuickItem::childAt() QCOMPARE(parent.childAt(300, 300), static_cast<QQuickItem *>(0)); } +void tst_QQuickItem::grab() +{ + QQuickView view; + view.setSource(testFileUrl("grabToImage.qml")); + view.show(); + QTest::qWaitForWindowExposed(&view); + + QQuickItem *root = qobject_cast<QQuickItem *>(view.rootObject()); + QVERIFY(root); + QQuickItem *item = root->findChild<QQuickItem *>("myItem"); + QVERIFY(item); + + { // Default size (item is 100x100) + QSharedPointer<QQuickItemGrabResult> result = item->grabToImage(); + QSignalSpy spy(result.data(), SIGNAL(ready())); + QTRY_VERIFY(spy.size() > 0); + QVERIFY(!result->url().isEmpty()); + QImage image = result->image(); + QCOMPARE(image.pixel(0, 0), qRgb(255, 0, 0)); + QCOMPARE(image.pixel(99, 99), qRgb(0, 0, 255)); + } + + { // Smaller size + QSharedPointer<QQuickItemGrabResult> result = item->grabToImage(QSize(50, 50)); + QVERIFY(!result.isNull()); + QSignalSpy spy(result.data(), SIGNAL(ready())); + QTRY_VERIFY(spy.size() > 0); + QVERIFY(!result->url().isEmpty()); + QImage image = result->image(); + QCOMPARE(image.pixel(0, 0), qRgb(255, 0, 0)); + QCOMPARE(image.pixel(49, 49), qRgb(0, 0, 255)); + } + +} + QTEST_MAIN(tst_QQuickItem) diff --git a/tests/auto/quick/qquickloader/tst_qquickloader.cpp b/tests/auto/quick/qquickloader/tst_qquickloader.cpp index 877bb59613..9ac2663f24 100644 --- a/tests/auto/quick/qquickloader/tst_qquickloader.cpp +++ b/tests/auto/quick/qquickloader/tst_qquickloader.cpp @@ -446,8 +446,8 @@ void tst_QQuickLoader::noResize() void tst_QQuickLoader::networkRequestUrl() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QQmlComponent component(&engine); @@ -470,8 +470,8 @@ void tst_QQuickLoader::networkRequestUrl() /* XXX Component waits until all dependencies are loaded. Is this actually possible? */ void tst_QQuickLoader::networkComponent() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory(), TestHTTPServer::Delay); QQmlComponent component(&engine); @@ -503,8 +503,8 @@ void tst_QQuickLoader::networkComponent() void tst_QQuickLoader::failNetworkRequest() { - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); QTest::ignoreMessage(QtWarningMsg, SERVER_ADDR "/IDontExist.qml: File not found"); @@ -718,8 +718,8 @@ void tst_QQuickLoader::initialPropertyValues() QFETCH(QStringList, propertyNames); QFETCH(QVariantList, propertyValues); - TestHTTPServer server(SERVER_PORT); - QVERIFY(server.isValid()); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory()); foreach (const QString &warning, expectedWarnings) diff --git a/tests/auto/quick/qquickmultipointtoucharea/qquickmultipointtoucharea.pro b/tests/auto/quick/qquickmultipointtoucharea/qquickmultipointtoucharea.pro index d3abc198d9..5724a7179e 100644 --- a/tests/auto/quick/qquickmultipointtoucharea/qquickmultipointtoucharea.pro +++ b/tests/auto/quick/qquickmultipointtoucharea/qquickmultipointtoucharea.pro @@ -8,6 +8,7 @@ SOURCES += tst_qquickmultipointtoucharea.cpp TESTDATA = data/* include(../../shared/util.pri) +include(../shared/util.pri) QT += core-private gui-private qml-private quick-private testlib DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp b/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp index 1d4932c432..842babddd9 100644 --- a/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp +++ b/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp @@ -48,12 +48,14 @@ #include <QtQuick/qquickview.h> #include <QtGui/QScreen> #include "../../shared/util.h" +#include "../shared/viewtestutil.h" class tst_QQuickMultiPointTouchArea : public QQmlDataTest { Q_OBJECT public: tst_QQuickMultiPointTouchArea() : device(0) { } + private slots: void initTestCase() { QQmlDataTest::initTestCase(); @@ -118,6 +120,7 @@ void tst_QQuickMultiPointTouchArea::signalTest() QTest::QTouchEventSequence sequence = QTest::touchEvent(window.data(), device); sequence.press(0, p1).press(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(area->property("touchPointPressCount").toInt(), 2); QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0); @@ -126,6 +129,7 @@ void tst_QQuickMultiPointTouchArea::signalTest() QMetaObject::invokeMethod(area, "clearCounts"); sequence.stationary(0).stationary(1).press(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(area->property("touchPointPressCount").toInt(), 1); QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0); @@ -136,6 +140,7 @@ void tst_QQuickMultiPointTouchArea::signalTest() p1 -= QPoint(10,10); p2 += QPoint(10,10); sequence.move(0, p1).move(1, p2).stationary(2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(area->property("touchPointPressCount").toInt(), 0); QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2); @@ -146,6 +151,7 @@ void tst_QQuickMultiPointTouchArea::signalTest() p3 += QPoint(10,10); sequence.release(0, p1).release(1, p2) .move(2, p3).press(3, p4).press(4, p5).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(area->property("touchPointPressCount").toInt(), 2); QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1); @@ -154,6 +160,7 @@ void tst_QQuickMultiPointTouchArea::signalTest() QMetaObject::invokeMethod(area, "clearCounts"); sequence.release(2, p3).release(3, p4).release(4, p5).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(area->property("touchPointPressCount").toInt(), 0); QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0); @@ -177,12 +184,14 @@ void tst_QQuickMultiPointTouchArea::release() QTest::QTouchEventSequence sequence = QTest::touchEvent(window.data(), device); sequence.press(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), true); p1 += QPoint(0,10); sequence.move(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), true); QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110)); @@ -190,6 +199,7 @@ void tst_QQuickMultiPointTouchArea::release() p1 += QPoint(4,10); sequence.release(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); //test that a release without a prior move to the release position successfully updates the point's position QCOMPARE(point1->pressed(), false); @@ -216,12 +226,14 @@ void tst_QQuickMultiPointTouchArea::reuse() QTest::QTouchEventSequence sequence = QTest::touchEvent(window.data(), device); sequence.press(0, p1).press(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), true); QCOMPARE(point2->pressed(), true); QCOMPARE(point3->pressed(), false); sequence.release(0, p1).stationary(1).press(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); //we shouldn't reuse point 1 yet QCOMPARE(point1->pressed(), false); @@ -230,24 +242,28 @@ void tst_QQuickMultiPointTouchArea::reuse() //back to base state (no touches) sequence.release(1, p2).release(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), false); QCOMPARE(point2->pressed(), false); QCOMPARE(point3->pressed(), false); sequence.press(0, p1).press(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), true); QCOMPARE(point2->pressed(), true); QCOMPARE(point3->pressed(), false); sequence.release(0, p1).stationary(1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point1->pressed(), false); QCOMPARE(point2->pressed(), true); QCOMPARE(point3->pressed(), false); sequence.press(4, p4).stationary(1).commit(); + QQuickTouchUtils::flush(window.data()); //the new touch point should reuse point 1 QCOMPARE(point1->pressed(), true); @@ -283,6 +299,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() QTest::QTouchEventSequence sequence = QTest::touchEvent(window.data(), device); sequence.press(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); @@ -291,6 +308,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() QCOMPARE(point23->pressed(), false); sequence.stationary(0).press(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -304,6 +322,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() p1 += QPoint(0,10); p2 += QPoint(5,0); sequence.move(0, p1).move(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -315,6 +334,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100)); sequence.stationary(0).stationary(1).press(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -323,6 +343,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() QCOMPARE(point23->pressed(), false); sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -342,6 +363,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() p4 += QPoint(1,-1); p5 += QPoint(-7,10); sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -356,6 +378,7 @@ void tst_QQuickMultiPointTouchArea::nonOverlapping() QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30)); sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); @@ -388,6 +411,7 @@ void tst_QQuickMultiPointTouchArea::nested() QTest::QTouchEventSequence sequence = QTest::touchEvent(window.data(), device); sequence.press(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); @@ -396,6 +420,7 @@ void tst_QQuickMultiPointTouchArea::nested() QCOMPARE(point23->pressed(), false); sequence.stationary(0).press(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -409,6 +434,7 @@ void tst_QQuickMultiPointTouchArea::nested() p1 += QPoint(0,10); p2 += QPoint(5,0); sequence.move(0, p1).move(1, p2).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -420,6 +446,7 @@ void tst_QQuickMultiPointTouchArea::nested() QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100)); sequence.stationary(0).stationary(1).press(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -435,6 +462,7 @@ void tst_QQuickMultiPointTouchArea::nested() QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180)); sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -455,6 +483,7 @@ void tst_QQuickMultiPointTouchArea::nested() p2 += QPoint(17,17); p3 += QPoint(3,0); sequence.move(0, p1).move(1, p2).move(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -472,6 +501,7 @@ void tst_QQuickMultiPointTouchArea::nested() p2 += QPoint(17,17); p3 += QPoint(3,0); sequence.move(0, p1).move(1, p2).move(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); @@ -489,6 +519,7 @@ void tst_QQuickMultiPointTouchArea::nested() sequence.release(0, p1).release(1, p2).release(2, p3).commit(); sequence.press(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); @@ -497,11 +528,13 @@ void tst_QQuickMultiPointTouchArea::nested() QCOMPARE(point23->pressed(), false); sequence.release(0, p1).commit(); + QQuickTouchUtils::flush(window.data()); //test with grabbing turned off window->rootObject()->setProperty("grabInnerArea", false); sequence.press(0, p1).press(1, p2).press(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -513,6 +546,7 @@ void tst_QQuickMultiPointTouchArea::nested() p2 -= QPoint(17,17); p3 -= QPoint(3,0); sequence.move(0, p1).move(1, p2).move(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -530,6 +564,7 @@ void tst_QQuickMultiPointTouchArea::nested() p2 -= QPoint(17,17); p3 -= QPoint(3,0); sequence.move(0, p1).move(1, p2).move(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -545,6 +580,7 @@ void tst_QQuickMultiPointTouchArea::nested() QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180)); sequence.release(0, p1).release(1, p2).release(2, p3).commit(); + QQuickTouchUtils::flush(window.data()); } void tst_QQuickMultiPointTouchArea::inFlickable() @@ -569,25 +605,30 @@ void tst_QQuickMultiPointTouchArea::inFlickable() //moving one point vertically QTest::touchEvent(window.data(), device).press(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QVERIFY(flickable->contentY() < 0); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); QTest::touchEvent(window.data(), device).release(0, p1); - QTest::qWait(50); + QQuickTouchUtils::flush(window.data()); QTRY_VERIFY(!flickable->isMoving()); @@ -595,6 +636,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() p1 = QPoint(20,100); QTest::touchEvent(window.data(), device).press(0, p1).press(1, p2); QTest::mousePress(window.data(), Qt::LeftButton, 0, p1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); @@ -604,18 +646,22 @@ void tst_QQuickMultiPointTouchArea::inFlickable() p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); QVERIFY(flickable->contentY() < 0); QCOMPARE(point11->pressed(), false); @@ -625,7 +671,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QTest::touchEvent(window.data(), device).release(0, p1).release(1, p2); QTest::mouseRelease(window.data(), Qt::LeftButton, 0, p1); - QTest::qWait(50); + QQuickTouchUtils::flush(window.data()); QTRY_VERIFY(!flickable->isMoving()); @@ -633,6 +679,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() p1 = QPoint(20,100); p2 = QPoint(40,100); QTest::touchEvent(window.data(), device).press(0, p1).press(1, p2); + QQuickTouchUtils::flush(window.data()); // ensure that mouse events do not fall through to the Flickable mpta->setMaximumTouchPoints(3); QTest::mousePress(window.data(), Qt::LeftButton, 0, p1); @@ -643,34 +690,42 @@ void tst_QQuickMultiPointTouchArea::inFlickable() p1 += QPoint(15,0); p2 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(15,0); p2 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(15,0); p2 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(15,0); p2 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); p2 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); QVERIFY(flickable->contentY() == 0); QCOMPARE(point11->pressed(), true); @@ -678,7 +733,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QTest::touchEvent(window.data(), device).release(0, p1).release(1, p2); QTest::mouseRelease(window.data(), Qt::LeftButton, 0, p1); - QTest::qWait(50); + QQuickTouchUtils::flush(window.data()); } // test that dragging out of a Flickable containing a MPTA doesn't harm Flickable's state. @@ -699,28 +754,34 @@ void tst_QQuickMultiPointTouchArea::inFlickable2() // move point horizontally, out of Flickable area QTest::touchEvent(window.data(), device).press(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mousePress(window.data(), Qt::LeftButton, 0, p1); p1 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mouseMove(window.data(), p1); p1 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mouseMove(window.data(), p1); p1 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mouseMove(window.data(), p1); p1 += QPoint(15,0); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mouseMove(window.data(), p1); QVERIFY(!flickable->isMoving()); QVERIFY(point11->pressed()); QTest::touchEvent(window.data(), device).release(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::mouseRelease(window.data(), Qt::LeftButton, 0, p1); QTest::qWait(50); @@ -729,26 +790,32 @@ void tst_QQuickMultiPointTouchArea::inFlickable2() // Check that we can still move the Flickable p1 = QPoint(50,100); QTest::touchEvent(window.data(), device).press(0, p1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(point11->pressed(), true); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); p1 += QPoint(0,15); QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); QVERIFY(flickable->contentY() < 0); QVERIFY(flickable->isMoving()); QCOMPARE(point11->pressed(), true); QTest::touchEvent(window.data(), device).release(0, p1); + QQuickTouchUtils::flush(window.data()); QTest::qWait(50); QTRY_VERIFY(!flickable->isMoving()); @@ -859,7 +926,9 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() // Touch both, release one, manipulate other touchpoint with mouse QTest::touchEvent(window.data(), device).press(1, touch1); + QQuickTouchUtils::flush(window.data()); QTest::touchEvent(window.data(), device).press(2, touch2); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -867,12 +936,14 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() QTest::touchEvent(window.data(), device).release(1, touch1); touch1.setY(20); QTest::mousePress(window.data(), Qt::LeftButton, 0, touch1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); QCOMPARE(touch2rect->property("y").toInt(), touch2.y()); QTest::touchEvent(window.data(), device).release(2, touch2); QTest::mouseRelease(window.data(), Qt::LeftButton, 0, touch1); + QQuickTouchUtils::flush(window.data()); // Start with mouse, move it, touch second point, move it QTest::mousePress(window.data(), Qt::LeftButton, 0, touch1); @@ -882,12 +953,14 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); touch2.setX(60); QTest::touchEvent(window.data(), device).press(3, touch2); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); QCOMPARE(touch2rect->property("y").toInt(), touch2.y()); touch2.setY(150); QTest::touchEvent(window.data(), device).move(3, touch2); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -895,6 +968,7 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() // Touch third point - nothing happens QTest::touchEvent(window.data(), device).press(4, touch3); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -903,7 +977,9 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() // Release all QTest::mouseRelease(window.data(), Qt::LeftButton, 0, touch1); QTest::touchEvent(window.data(), device).release(3, touch2); + QQuickTouchUtils::flush(window.data()); QTest::touchEvent(window.data(), device).release(4, touch3); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -922,12 +998,14 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() QCOMPARE(touch1rect->property("x").toInt(), mouse1.x()); QCOMPARE(touch1rect->property("y").toInt(), mouse1.y()); QTest::touchEvent(window.data(), device).press(1, touch1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), mouse1.x()); QCOMPARE(touch1rect->property("y").toInt(), mouse1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch1.x()); QCOMPARE(touch2rect->property("y").toInt(), touch1.y()); QTest::touchEvent(window.data(), device).press(2, touch2).press(3, touch3).press(4, touch4); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), mouse1.x()); QCOMPARE(touch1rect->property("y").toInt(), mouse1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch1.x()); @@ -942,6 +1020,7 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() // Release all QTest::mouseRelease(window.data(), Qt::LeftButton, 0, mouse1); QTest::touchEvent(window.data(), device).release(1, touch1).release(2, touch2).release(3, touch3).release(4, touch4); + QQuickTouchUtils::flush(window.data()); } dualmpta->setProperty("mouseEnabled", false); @@ -964,13 +1043,16 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() QCOMPARE(touch1rect->property("y").toInt(), 10); QTest::touchEvent(window.data(), device).press(1, touch1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); touch1.setY(150); QTest::touchEvent(window.data(), device).move(1, touch1); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QTest::touchEvent(window.data(), device).press(2, touch2); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -979,7 +1061,9 @@ void tst_QQuickMultiPointTouchArea::mouseAsTouchpoint() // Release all QTest::mouseRelease(window.data(), Qt::LeftButton, 0, mouse1); QTest::touchEvent(window.data(), device).release(1, touch1); + QQuickTouchUtils::flush(window.data()); QTest::touchEvent(window.data(), device).release(2, touch2); + QQuickTouchUtils::flush(window.data()); QCOMPARE(touch1rect->property("x").toInt(), touch1.x()); QCOMPARE(touch1rect->property("y").toInt(), touch1.y()); QCOMPARE(touch2rect->property("x").toInt(), touch2.x()); @@ -1028,7 +1112,6 @@ void tst_QQuickMultiPointTouchArea::transformedTouchArea_data() QTest::newRow("3rd point inside") << QPoint(140, 260) << QPoint(260, 140) << QPoint(200, 140) << 0 << 0 << 1; - QTest::newRow("all points inside") << QPoint(200, 140) << QPoint(200, 260) << QPoint(140, 200) << 1 << 2 << 3; diff --git a/tests/auto/quick/qquickpincharea/qquickpincharea.pro b/tests/auto/quick/qquickpincharea/qquickpincharea.pro index 970ce48851..fa14afa261 100644 --- a/tests/auto/quick/qquickpincharea/qquickpincharea.pro +++ b/tests/auto/quick/qquickpincharea/qquickpincharea.pro @@ -6,6 +6,7 @@ macx:CONFIG -= app_bundle SOURCES += tst_qquickpincharea.cpp include (../../shared/util.pri) +include (../shared/util.pri) TESTDATA = data/* diff --git a/tests/auto/quick/qquickpincharea/tst_qquickpincharea.cpp b/tests/auto/quick/qquickpincharea/tst_qquickpincharea.cpp index b9d314b63e..1dbce1b730 100644 --- a/tests/auto/quick/qquickpincharea/tst_qquickpincharea.cpp +++ b/tests/auto/quick/qquickpincharea/tst_qquickpincharea.cpp @@ -48,6 +48,7 @@ #include <QtQuick/qquickview.h> #include <QtQml/qqmlcontext.h> #include "../../shared/util.h" +#include "../shared/viewtestutil.h" class tst_QQuickPinchArea: public QQmlDataTest { @@ -232,15 +233,18 @@ void tst_QQuickPinchArea::scale() { QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. Otherwise if we let it // be destroyed and then start a new sequence, point 0 will default to being // stationary at 0, 0, and PinchArea will filter out that touchpoint because // it is outside its bounds. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(root->property("scale").toReal(), 1.0); QVERIFY(root->property("pinchActive").toBool()); @@ -248,6 +252,7 @@ void tst_QQuickPinchArea::scale() p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(root->property("scale").toReal(), 1.5); QCOMPARE(root->property("center").toPointF(), QPointF(40, 40)); // blackrect is at 50,50 @@ -260,8 +265,10 @@ void tst_QQuickPinchArea::scale() { QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(blackRect->scale(), 2.0); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); } QVERIFY(!root->property("pinchActive").toBool()); } @@ -293,12 +300,15 @@ void tst_QQuickPinchArea::pan() { QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 += QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(root->property("scale").toReal(), 1.0); QVERIFY(root->property("pinchActive").toBool()); @@ -306,6 +316,7 @@ void tst_QQuickPinchArea::pan() p1 += QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); } QCOMPARE(root->property("center").toPointF(), QPointF(60, 60)); // blackrect is at 50,50 @@ -316,11 +327,13 @@ void tst_QQuickPinchArea::pan() p1 += QPoint(100,100); p2 += QPoint(100,100); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); QCOMPARE(blackRect->x(), 140.0); QCOMPARE(blackRect->y(), 160.0); QTest::touchEvent(window, device).release(0, p1, window).release(1, p2, window); + QQuickTouchUtils::flush(window); QVERIFY(!root->property("pinchActive").toBool()); } @@ -355,12 +368,15 @@ void tst_QQuickPinchArea::retouch() { QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(root->property("scale").toReal(), 1.0); QVERIFY(root->property("pinchActive").toBool()); @@ -368,6 +384,7 @@ void tst_QQuickPinchArea::retouch() p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1,window).move(1, p2,window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(startedSpy.count(), 1); @@ -382,6 +399,7 @@ void tst_QQuickPinchArea::retouch() // Hold down the first finger but release the second one pinchSequence.stationary(0).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(startedSpy.count(), 1); QCOMPARE(finishedSpy.count(), 0); @@ -390,9 +408,11 @@ void tst_QQuickPinchArea::retouch() // Keep holding down the first finger and re-touch the second one, then move them both pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); // Lifting and retouching results in onPinchStarted being called again QCOMPARE(startedSpy.count(), 2); @@ -401,6 +421,7 @@ void tst_QQuickPinchArea::retouch() QCOMPARE(window->rootObject()->property("pointCount").toInt(), 2); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QVERIFY(!root->property("pinchActive").toBool()); QCOMPARE(startedSpy.count(), 2); @@ -456,14 +477,18 @@ void tst_QQuickPinchArea::transformedPinchArea() QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(view, device); // start pinch pinchSequence.press(0, p1, view).commit(); + QQuickTouchUtils::flush(view); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. pinchSequence.stationary(0).press(1, p2, view).commit(); + QQuickTouchUtils::flush(view); pinchSequence.stationary(0).move(1, p2 + QPoint(threshold * 2, 0), view).commit(); + QQuickTouchUtils::flush(view); QCOMPARE(pinchArea->property("pinching").toBool(), shouldPinch); // release pinch pinchSequence.release(0, p1, view).release(1, p2, view).commit(); + QQuickTouchUtils::flush(view); QCOMPARE(pinchArea->property("pinching").toBool(), false); } } diff --git a/tests/auto/quick/qquickpixmapcache/tst_qquickpixmapcache.cpp b/tests/auto/quick/qquickpixmapcache/tst_qquickpixmapcache.cpp index 75bd468aef..f104154205 100644 --- a/tests/auto/quick/qquickpixmapcache/tst_qquickpixmapcache.cpp +++ b/tests/auto/quick/qquickpixmapcache/tst_qquickpixmapcache.cpp @@ -59,7 +59,7 @@ class tst_qquickpixmapcache : public QQmlDataTest { Q_OBJECT public: - tst_qquickpixmapcache() : server(14452) {} + tst_qquickpixmapcache() {} private slots: void initTestCase(); @@ -116,6 +116,8 @@ void tst_qquickpixmapcache::initTestCase() { QQmlDataTest::initTestCase(); + QVERIFY2(server.listen(14452), qPrintable(server.errorString())); + // This avoids a race condition/deadlock bug in network config // manager when it is accessed by the HTTP server thread before // anything else. Bug report can be found at: @@ -379,7 +381,8 @@ void tst_qquickpixmapcache::shrinkcache() void createNetworkServer() { QEventLoop eventLoop; - TestHTTPServer server(14453); + TestHTTPServer server; + QVERIFY2(server.listen(14453), qPrintable(server.errorString())); server.serveDirectory(QQmlDataTest::instance()->testFile("http")); QTimer::singleShot(100, &eventLoop, SLOT(quit())); eventLoop.exec(); @@ -407,7 +410,8 @@ void tst_qquickpixmapcache::networkCrash() // QTBUG-22125 void tst_qquickpixmapcache::lockingCrash() { - TestHTTPServer server(14453); + TestHTTPServer server; + QVERIFY2(server.listen(14453), qPrintable(server.errorString())); server.serveDirectory(testFile("http"), TestHTTPServer::Delay); { diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp index 0b6998146e..3859fa8424 100644 --- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp +++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp @@ -2022,7 +2022,8 @@ void tst_qquicktext::embeddedImages() QFETCH(QUrl, qmlfile); QFETCH(QString, error); - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(testFile("http")); if (!error.isEmpty()) @@ -2760,7 +2761,8 @@ void tst_qquicktext::imgTagsBaseUrl() QFETCH(QUrl, contextUrl); QFETCH(qreal, imgHeight); - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(testFile("")); QByteArray baseUrlFragment; diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index 45d23abbf6..88b9c2d792 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -2603,7 +2603,8 @@ void tst_qquicktextedit::cursorDelegate() void tst_qquicktextedit::remoteCursorDelegate() { - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory(), TestHTTPServer::Delay); QQuickView view; @@ -2740,7 +2741,8 @@ void tst_qquicktextedit::delegateLoading() QFETCH(QString, qmlfile); QFETCH(QString, error); - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(testFile("httpfail"), TestHTTPServer::Disconnect); server.serveDirectory(testFile("httpslow"), TestHTTPServer::Delay); server.serveDirectory(testFile("http")); @@ -5214,7 +5216,8 @@ void tst_qquicktextedit::embeddedImages() QFETCH(QUrl, qmlfile); QFETCH(QString, error); - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(testFile("http")); if (!error.isEmpty()) diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index e125c33a56..684229aa07 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -2853,7 +2853,8 @@ void tst_qquicktextinput::cursorDelegate() void tst_qquicktextinput::remoteCursorDelegate() { - TestHTTPServer server(SERVER_PORT); + TestHTTPServer server; + QVERIFY2(server.listen(SERVER_PORT), qPrintable(server.errorString())); server.serveDirectory(dataDirectory(), TestHTTPServer::Delay); QQuickView view; diff --git a/tests/auto/quick/qquickwindow/qquickwindow.pro b/tests/auto/quick/qquickwindow/qquickwindow.pro index 6bce209df9..e95b7dbb10 100644 --- a/tests/auto/quick/qquickwindow/qquickwindow.pro +++ b/tests/auto/quick/qquickwindow/qquickwindow.pro @@ -3,6 +3,7 @@ TARGET = tst_qquickwindow SOURCES += tst_qquickwindow.cpp include (../../shared/util.pri) +include(../shared/util.pri) macx:CONFIG -= app_bundle diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index b05146fa3a..a2e2980223 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -49,6 +49,7 @@ #include <QtQuick/private/qquickrectangle_p.h> #include "../../shared/util.h" #include "../shared/visualtestutil.h" +#include "../shared/viewtestutil.h" #include <QSignalSpy> #include <qpa/qwindowsysteminterface.h> #include <private/qquickwindow_p.h> @@ -327,6 +328,7 @@ private slots: void animationsWhileHidden(); void focusObject(); + void focusReason(); void ignoreUnhandledMouseEvents(); @@ -359,6 +361,9 @@ private slots: void contentItemSize(); + void defaultSurfaceFormat(); + void glslVersion(); + private: QTouchDevice *touchDevice; QTouchDevice *touchDeviceWithVelocity; @@ -392,7 +397,7 @@ void tst_qquickwindow::aboutToStopSignal() window.hide(); - QVERIFY(spy.count() > 0); + QTRY_VERIFY(spy.count() > 0); } //If the item calls update inside updatePaintNode, it should schedule another sync pass @@ -519,7 +524,7 @@ void tst_qquickwindow::touchEvent_basic() // press multiple points QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window) .press(1, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); QVERIFY(middleItem->lastEvent.touchPoints.isEmpty()); QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1); @@ -530,9 +535,9 @@ void tst_qquickwindow::touchEvent_basic() // touch point on top item moves to bottom item, but top item should still receive the event QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).move(0, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchUpdate, window, Qt::TouchPointMoved, makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos), pos))); @@ -540,9 +545,9 @@ void tst_qquickwindow::touchEvent_basic() // touch point on bottom item moves to top item, but bottom item should still receive the event QTest::touchEvent(window, touchDevice).press(0, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).move(0, topItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1); COMPARE_TOUCH_DATA(bottomItem->lastEvent, makeTouchData(QEvent::TouchUpdate, window, Qt::TouchPointMoved, makeTouchPoint(bottomItem, bottomItem->mapFromItem(topItem, pos), pos))); @@ -550,10 +555,10 @@ void tst_qquickwindow::touchEvent_basic() // a single stationary press on an item shouldn't cause an event QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).stationary(0) .press(1, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); // received press only, not stationary QVERIFY(middleItem->lastEvent.touchPoints.isEmpty()); QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1); @@ -565,12 +570,13 @@ void tst_qquickwindow::touchEvent_basic() // Otherwise you will get an assertion failure: // ASSERT: "itemForTouchPointId.isEmpty()" in file items/qquickwindow.cpp QTest::touchEvent(window, touchDevice).release(0, pos.toPoint(), window).release(1, pos.toPoint(), window); + QQuickTouchUtils::flush(window); // move touch point from top item to bottom, and release QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(),window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); COMPARE_TOUCH_DATA(topItem->lastEvent, makeTouchData(QEvent::TouchEnd, window, Qt::TouchPointReleased, makeTouchPoint(topItem, topItem->mapFromItem(bottomItem, pos), pos))); @@ -579,12 +585,12 @@ void tst_qquickwindow::touchEvent_basic() // release while another point is pressed QTest::touchEvent(window, touchDevice).press(0, topItem->mapToScene(pos).toPoint(),window) .press(1, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).move(0, bottomItem->mapToScene(pos).toPoint(), window); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, touchDevice).release(0, bottomItem->mapToScene(pos).toPoint(), window) .stationary(1); - QTest::qWait(50); + QQuickTouchUtils::flush(window); QCOMPARE(topItem->lastEvent.touchPoints.count(), 1); QVERIFY(middleItem->lastEvent.touchPoints.isEmpty()); QCOMPARE(bottomItem->lastEvent.touchPoints.count(), 1); @@ -832,12 +838,15 @@ void tst_qquickwindow::touchEvent_velocity() tp.area = QRectF(pos, QSizeF(4, 4)); points << tp; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); points[0].state = Qt::TouchPointMoved; points[0].area.adjust(5, 5, 5, 5); QVector2D velocity(1.5, 2.5); points[0].velocity = velocity; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); - QCoreApplication::processEvents(); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); QCOMPARE(item->touchEventCount, 2); QCOMPARE(item->lastEvent.touchPoints.count(), 1); QCOMPARE(item->lastVelocity, velocity); @@ -849,7 +858,8 @@ void tst_qquickwindow::touchEvent_velocity() QVector2D transformedVelocity = transformMatrix.mapVector(velocity).toVector2D(); points[0].area.adjust(5, 5, 5, 5); QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); - QCoreApplication::processEvents(); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); QCOMPARE(item->lastVelocity, transformedVelocity); QPoint itemLocalPos = item->mapFromScene(window->mapFromGlobal(points[0].area.center().toPoint())).toPoint(); QPoint itemLocalPosFromEvent = item->lastEvent.touchPoints[0].pos().toPoint(); @@ -857,7 +867,8 @@ void tst_qquickwindow::touchEvent_velocity() points[0].state = Qt::TouchPointReleased; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); - QCoreApplication::processEvents(); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); delete item; } @@ -889,14 +900,19 @@ void tst_qquickwindow::mouseFromTouch_basic() tp.area = QRectF(pos, QSizeF(4, 4)); points << tp; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); points[0].state = Qt::TouchPointMoved; points[0].area.adjust(5, 5, 5, 5); QVector2D velocity(1.5, 2.5); points[0].velocity = velocity; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); points[0].state = Qt::TouchPointReleased; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); - QCoreApplication::processEvents(); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); // The item should have received a mouse press, move, and release. QCOMPARE(item->mousePressNum, 1); @@ -915,16 +931,20 @@ void tst_qquickwindow::mouseFromTouch_basic() points[0].velocity = velocity; points[0].area = QRectF(pos, QSizeF(4, 4)); QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); points[0].state = Qt::TouchPointMoved; points[0].area.adjust(5, 5, 5, 5); QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); - QCoreApplication::processEvents(); + QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); QCOMPARE(item->lastMousePos.toPoint(), item->mapFromScene(window->mapFromGlobal(points[0].area.center().toPoint())).toPoint()); QCOMPARE(item->lastVelocityFromMouseMove, transformedVelocity); points[0].state = Qt::TouchPointReleased; QWindowSystemInterface::handleTouchEvent(window, touchDeviceWithVelocity, points); QCoreApplication::processEvents(); + QQuickTouchUtils::flush(window); delete item; } @@ -1272,6 +1292,33 @@ void tst_qquickwindow::focusObject() QCOMPARE(focusObjectSpy.count(), 3); } +void tst_qquickwindow::focusReason() +{ + QQuickWindow *window = new QQuickWindow; + QScopedPointer<QQuickWindow> cleanup(window); + window->resize(200, 200); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickItem *firstItem = new QQuickItem; + firstItem->setSize(QSizeF(100, 100)); + firstItem->setParentItem(window->contentItem()); + + QQuickItem *secondItem = new QQuickItem; + secondItem->setSize(QSizeF(100, 100)); + secondItem->setParentItem(window->contentItem()); + + firstItem->forceActiveFocus(Qt::OtherFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::OtherFocusReason); + + secondItem->forceActiveFocus(Qt::TabFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::TabFocusReason); + + firstItem->forceActiveFocus(Qt::BacktabFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::BacktabFocusReason); + +} + void tst_qquickwindow::ignoreUnhandledMouseEvents() { QQuickWindow *window = new QQuickWindow; @@ -1828,6 +1875,79 @@ void tst_qquickwindow::contentItemSize() QCOMPARE(QSizeF(rect->width(), rect->height()), size); } +void tst_qquickwindow::defaultSurfaceFormat() +{ + // It is quite difficult to verify anything for real since the resulting format after + // surface/context creation can be anything, depending on the platform and drivers, + // and many options and settings may fail in various configurations, but test at + // least using some harmless settings to check that the global, static format is + // taken into account in the requested format. + + QSurfaceFormat savedDefaultFormat = QQuickWindow::defaultFormat(); + + // Verify that depth and stencil are set, as they should be, unless they are disabled + // via environment variables. + QVERIFY(savedDefaultFormat.depthBufferSize() >= 16); + QVERIFY(savedDefaultFormat.stencilBufferSize() >= 8); + + QSurfaceFormat format = savedDefaultFormat; + format.setSwapInterval(0); + format.setRedBufferSize(8); + format.setGreenBufferSize(8); + format.setBlueBufferSize(8); + format.setProfile(QSurfaceFormat::CompatibilityProfile); + format.setOption(QSurfaceFormat::DebugContext); + QQuickWindow::setDefaultFormat(format); + + QQuickWindow window; + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + + const QSurfaceFormat reqFmt = window.requestedFormat(); + QCOMPARE(format.swapInterval(), reqFmt.swapInterval()); + QCOMPARE(format.redBufferSize(), reqFmt.redBufferSize()); + QCOMPARE(format.greenBufferSize(), reqFmt.greenBufferSize()); + QCOMPARE(format.blueBufferSize(), reqFmt.blueBufferSize()); + QCOMPARE(format.profile(), reqFmt.profile()); + QCOMPARE(int(format.options()), int(reqFmt.options())); + + QQuickWindow::setDefaultFormat(savedDefaultFormat); +} + +void tst_qquickwindow::glslVersion() +{ + QQuickWindow window; + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + + // Core profile is never requested by default. + QVERIFY(!window.glslIsCoreProfile()); + + // Get the format from the context, not the window. The actual OpenGL version and + // related settings are associated with the context and are only written back to the + // context's format. + QSurfaceFormat format = window.openglContext()->format(); + + if (format.renderableType() == QSurfaceFormat::OpenGL) { + if (format.majorVersion() == 2) + QCOMPARE(window.glslVersion(), QString()); + else if (format.majorVersion() == 3) + QVERIFY(window.glslVersion().startsWith('3') + || window.glslVersion() == QStringLiteral("130") + || window.glslVersion() == QStringLiteral("140") + || window.glslVersion() == QStringLiteral("150")); + else if (format.majorVersion() == 4) + QVERIFY(window.glslVersion().startsWith('4')); + QVERIFY(!window.glslVersion().contains(QStringLiteral("core"))); + QVERIFY(!window.glslVersion().contains(QStringLiteral("es"))); + } else if (format.renderableType() == QSurfaceFormat::OpenGLES) { + if (format.majorVersion() == 2) + QCOMPARE(window.glslVersion(), QString()); + else + QVERIFY(window.glslVersion().contains(QStringLiteral("es"))); + } +} + QTEST_MAIN(tst_qquickwindow) #include "tst_qquickwindow.moc" diff --git a/tests/auto/quick/rendernode/data/matrix.qml b/tests/auto/quick/rendernode/data/matrix.qml new file mode 100644 index 0000000000..8b721e5075 --- /dev/null +++ b/tests/auto/quick/rendernode/data/matrix.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import RenderNode 1.0 + +Item { + width: 320 + height: 480 + + Item { x: 10; y: 10; width: 10; height: 10; + StateRecorder { x: 10; y: 10; objectName: "no-clip; no-rotation"; } + } + + Item { x: 10; y: 10; width: 10; height: 10; clip: true + StateRecorder { x: 10; y: 10; objectName: "parent-clip; no-rotation"; } + } + + Item { x: 10; y: 10; width: 10; height: 10; + StateRecorder { x: 10; y: 10; objectName: "self-clip; no-rotation"; clip: true } + } + + + Item { x: 10; y: 10; width: 10; height: 10; rotation: 90 + StateRecorder { x: 10; y: 10; objectName: "no-clip; parent-rotation"; } + } + + Item { x: 10; y: 10; width: 10; height: 10; clip: true; rotation: 90 + StateRecorder { x: 10; y: 10; objectName: "parent-clip; parent-rotation"; } + } + + Item { x: 10; y: 10; width: 10; height: 10; rotation: 90 + StateRecorder { x: 10; y: 10; objectName: "self-clip; parent-rotation"; clip: true } + } + + + Item { x: 10; y: 10; width: 10; height: 10; + StateRecorder { x: 10; y: 10; objectName: "no-clip; self-rotation"; rotation: 90 } + } + + Item { x: 10; y: 10; width: 10; height: 10; clip: true; + StateRecorder { x: 10; y: 10; objectName: "parent-clip; self-rotation"; rotation: 90} + } + + Item { x: 10; y: 10; width: 10; height: 10; + StateRecorder { x: 10; y: 10; objectName: "self-clip; self-rotation"; clip: true; rotation: 90 } + } + +} diff --git a/tests/auto/quick/rendernode/rendernode.pro b/tests/auto/quick/rendernode/rendernode.pro index b55b7b0bec..bedcefde86 100644 --- a/tests/auto/quick/rendernode/rendernode.pro +++ b/tests/auto/quick/rendernode/rendernode.pro @@ -14,4 +14,6 @@ QT += core-private gui-private qml-private quick-private testlib OTHER_FILES += \ data/RenderOrder.qml \ data/MessUpState.qml \ + data/matrix.qml + DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/quick/rendernode/tst_rendernode.cpp b/tests/auto/quick/rendernode/tst_rendernode.cpp index 06338e09e2..98e31329a0 100644 --- a/tests/auto/quick/rendernode/tst_rendernode.cpp +++ b/tests/auto/quick/rendernode/tst_rendernode.cpp @@ -72,6 +72,7 @@ public: private slots: void renderOrder(); void messUpState(); + void matrix(); }; class ClearNode : public QSGRenderNode @@ -261,6 +262,84 @@ void tst_rendernode::messUpState() QCOMPARE(fb.pixel(x2, y5), qRgb(0x00, 0x00, 0x00)); } +class StateRecordingRenderNode : public QSGRenderNode +{ +public: + StateFlags changedStates() { return StateFlags(-1); } + void render(const RenderState &) { + matrices[name] = *matrix(); + + } + + QString name; + static QHash<QString, QMatrix4x4> matrices; +}; + +QHash<QString, QMatrix4x4> StateRecordingRenderNode::matrices; + +class StateRecordingRenderNodeItem : public QQuickItem +{ + Q_OBJECT +public: + StateRecordingRenderNodeItem() { setFlag(ItemHasContents, true); } + QSGNode *updatePaintNode(QSGNode *r, UpdatePaintNodeData *) { + if (r) + return r; + StateRecordingRenderNode *rn = new StateRecordingRenderNode(); + rn->name = objectName(); + return rn; + } +}; + +void tst_rendernode::matrix() +{ + qmlRegisterType<StateRecordingRenderNodeItem>("RenderNode", 1, 0, "StateRecorder"); + StateRecordingRenderNode::matrices.clear(); + runTest("matrix.qml"); + + QMatrix4x4 noRotateOffset; + noRotateOffset.translate(20, 20); + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("no-clip; no-rotation")); + QCOMPARE(result, noRotateOffset); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("parent-clip; no-rotation")); + QCOMPARE(result, noRotateOffset); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("self-clip; no-rotation")); + QCOMPARE(result, noRotateOffset); + } + + QMatrix4x4 parentRotation; + parentRotation.translate(10, 10); // parent at x/y: 10 + parentRotation.translate(5, 5); // rotate 90 around center (width/height: 10) + parentRotation.rotate(90, 0, 0, 1); + parentRotation.translate(-5, -5); + parentRotation.translate(10, 10); // StateRecorder at: x/y: 10 + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("no-clip; parent-rotation")); + QCOMPARE(result, parentRotation); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("parent-clip; parent-rotation")); + QCOMPARE(result, parentRotation); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("self-clip; parent-rotation")); + QCOMPARE(result, parentRotation); + } + + QMatrix4x4 selfRotation; + selfRotation.translate(10, 10); // parent at x/y: 10 + selfRotation.translate(10, 10); // StateRecorder at: x/y: 10 + selfRotation.rotate(90, 0, 0, 1); // rotate 90, width/height: 0 + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("no-clip; self-rotation")); + QCOMPARE(result, selfRotation); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("parent-clip; self-rotation")); + QCOMPARE(result, selfRotation); + } + { QMatrix4x4 result = StateRecordingRenderNode::matrices.value(QStringLiteral("self-clip; self-rotation")); + QCOMPARE(result, selfRotation); + } +} + QTEST_MAIN(tst_rendernode) diff --git a/tests/auto/quick/shared/viewtestutil.cpp b/tests/auto/quick/shared/viewtestutil.cpp index 0e3964d52d..aa6d7c4a93 100644 --- a/tests/auto/quick/shared/viewtestutil.cpp +++ b/tests/auto/quick/shared/viewtestutil.cpp @@ -47,6 +47,9 @@ #include <QtTest/QTest> +#include <private/qquickwindow_p.h> + + QQuickView *QQuickViewTestUtil::createView() { QQuickView *window = new QQuickView(0); @@ -341,3 +344,23 @@ QList<QPair<QString,QString> > QQuickViewTestUtil::ListRange::getModelDataValues return data; } +namespace QQuickTouchUtils { + + /* QQuickWindow does event compression and only delivers events just + * before it is about to render the next frame. Since some tests + * rely on events being delivered immediately AND that no other + * event processing has occurred in the meanwhile, we flush the + * event manually and immediately. + */ + void flush(QQuickWindow *window) { + if (!window) + return; + QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); + if (!wd || !wd->delayedTouch) + return; + wd->reallyDeliverTouchEvent(wd->delayedTouch); + delete wd->delayedTouch; + wd->delayedTouch = 0; + } + +} diff --git a/tests/auto/quick/shared/viewtestutil.h b/tests/auto/quick/shared/viewtestutil.h index 5b0b10b69c..e10966ddba 100644 --- a/tests/auto/quick/shared/viewtestutil.h +++ b/tests/auto/quick/shared/viewtestutil.h @@ -166,6 +166,10 @@ namespace QQuickViewTestUtil } } +namespace QQuickTouchUtils { + void flush(QQuickWindow *window); +} + Q_DECLARE_METATYPE(QQuickViewTestUtil::QaimModel*) Q_DECLARE_METATYPE(QQuickViewTestUtil::ListChange) Q_DECLARE_METATYPE(QList<QQuickViewTestUtil::ListChange>) diff --git a/tests/auto/quick/touchmouse/touchmouse.pro b/tests/auto/quick/touchmouse/touchmouse.pro index 445bee08ae..7d23dfc0ae 100644 --- a/tests/auto/quick/touchmouse/touchmouse.pro +++ b/tests/auto/quick/touchmouse/touchmouse.pro @@ -8,6 +8,7 @@ macx:CONFIG -= app_bundle SOURCES += tst_touchmouse.cpp include (../../shared/util.pri) +include (../shared/util.pri) TESTDATA = data/* diff --git a/tests/auto/quick/touchmouse/tst_touchmouse.cpp b/tests/auto/quick/touchmouse/tst_touchmouse.cpp index 5b4ad0ffa3..1d947b4d8c 100644 --- a/tests/auto/quick/touchmouse/tst_touchmouse.cpp +++ b/tests/auto/quick/touchmouse/tst_touchmouse.cpp @@ -58,6 +58,7 @@ #include <QtQml/qqmlproperty.h> #include "../../shared/util.h" +#include "../shared/viewtestutil.h" struct Event { @@ -221,12 +222,15 @@ void tst_TouchMouse::simpleTouchEvent() QPoint p1; p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 1); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 1); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 1); eventItem1->eventList.clear(); @@ -234,11 +238,14 @@ void tst_TouchMouse::simpleTouchEvent() eventItem1->acceptTouch = true; p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 1); p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 3); eventItem1->eventList.clear(); @@ -251,6 +258,7 @@ void tst_TouchMouse::simpleTouchEvent() eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); @@ -268,10 +276,12 @@ void tst_TouchMouse::simpleTouchEvent() p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchUpdate); QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseMove); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 6); QCOMPARE(eventItem1->eventList.at(4).type, QEvent::TouchEnd); QCOMPARE(eventItem1->eventList.at(5).type, QEvent::MouseButtonRelease); @@ -286,13 +296,16 @@ void tst_TouchMouse::simpleTouchEvent() eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); eventItem1->eventList.clear(); @@ -304,13 +317,16 @@ void tst_TouchMouse::simpleTouchEvent() eventItem1->setAcceptedMouseButtons(Qt::LeftButton); p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 1); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::TouchUpdate); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 3); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd); eventItem1->eventList.clear(); @@ -376,6 +392,7 @@ void tst_TouchMouse::mouse() // item 2 doesn't accept anything, thus it sees a touch pass by QPoint p1 = QPoint(30, 30); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); @@ -412,14 +429,17 @@ void tst_TouchMouse::touchOverMouse() QCOMPARE(eventItem1->eventList.size(), 0); QPoint p1 = QPoint(20, 20); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 0); QCOMPARE(eventItem2->eventList.size(), 1); QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin); p1 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem2->eventList.size(), 2); QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchUpdate); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem2->eventList.size(), 3); QCOMPARE(eventItem2->eventList.at(2).type, QEvent::TouchEnd); eventItem2->eventList.clear(); @@ -456,6 +476,7 @@ void tst_TouchMouse::mouseOverTouch() QPoint p1 = QPoint(20, 20); QTest::qWait(qApp->styleHints()->mouseDoubleClickInterval() + 10); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 0); QCOMPARE(eventItem2->eventList.size(), 2); QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin); @@ -510,10 +531,12 @@ void tst_TouchMouse::buttonOnFlickable() QCOMPARE(eventItem1->eventList.size(), 0); QPoint p1 = QPoint(20, 130); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QTRY_COMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(2).type, QEvent::TouchEnd); QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease); @@ -522,9 +545,11 @@ void tst_TouchMouse::buttonOnFlickable() // touch button p1 = QPoint(10, 310); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem2->eventList.size(), 1); QCOMPARE(eventItem2->eventList.at(0).type, QEvent::TouchBegin); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem2->eventList.size(), 2); QCOMPARE(eventItem2->eventList.at(1).type, QEvent::TouchEnd); QCOMPARE(eventItem1->eventList.size(), 0); @@ -536,8 +561,10 @@ void tst_TouchMouse::buttonOnFlickable() // click above button, no events please p1 = QPoint(10, 90); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 0); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 0); eventItem1->eventList.clear(); @@ -548,6 +575,7 @@ void tst_TouchMouse::buttonOnFlickable() QCOMPARE(eventItem1->eventList.size(), 0); p1 = QPoint(10, 110); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); @@ -560,12 +588,13 @@ void tst_TouchMouse::buttonOnFlickable() p1 += QPoint(0, -10); QPoint p2 = p1 + QPoint(0, -10); QPoint p3 = p2 + QPoint(0, -10); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p1, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p2, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p3, window); + QQuickTouchUtils::flush(window); // we cannot really know when the events get grabbed away QVERIFY(eventItem1->eventList.size() >= 4); @@ -578,6 +607,7 @@ void tst_TouchMouse::buttonOnFlickable() QVERIFY(flickable->isMovingVertically()); QTest::touchEvent(window, device).release(0, p3, window); + QQuickTouchUtils::flush(window); delete window; } @@ -625,6 +655,7 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() QCOMPARE(eventItem1->eventList.size(), 0); QPoint p1 = QPoint(10, 110); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); // Flickable initially steals events QCOMPARE(eventItem1->eventList.size(), 0); // but we'll get the delayed mouse press after a delay @@ -641,12 +672,13 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() p1 += QPoint(0, -10); QPoint p2 = p1 + QPoint(0, -10); QPoint p3 = p2 + QPoint(0, -10); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p1, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p2, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).move(0, p3, window); + QQuickTouchUtils::flush(window); QVERIFY(flickable->isMovingVertically()); // flickable should have the mouse grab, and have moved the itemForTouchPointId @@ -656,6 +688,7 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable() QCOMPARE(windowPriv->itemForTouchPointId[0], flickable); QTest::touchEvent(window, device).release(0, p3, window); + QQuickTouchUtils::flush(window); // We should not have received any synthesised mouse events from Qt gui. QCOMPARE(filteredEventList.count(), 0); @@ -709,7 +742,9 @@ void tst_TouchMouse::buttonOnTouch() // Normal touch click QPoint p1 = QPoint(10, 110); QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(eventItem1->eventList.size(), 4); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress); @@ -730,7 +765,9 @@ void tst_TouchMouse::buttonOnTouch() // Start the events after each other QTest::touchEvent(window, device).press(0, p1, window); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).stationary(0).press(1, p2, window); + QQuickTouchUtils::flush(window); QCOMPARE(button1->scale(), 1.0); @@ -738,20 +775,24 @@ void tst_TouchMouse::buttonOnTouch() p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); // QCOMPARE(button1->scale(), 1.5); qDebug() << "Button scale: " << button1->scale(); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); // QCOMPARE(button1->scale(), 2.0); qDebug() << "Button scale: " << button1->scale(); QTest::touchEvent(window, device).release(0, p1, window).release(1, p2, window); + QQuickTouchUtils::flush(window); // QVERIFY(eventItem1->eventList.isEmpty()); // QCOMPARE(button1->scale(), 2.0); qDebug() << "Button scale: " << button1->scale(); @@ -765,6 +806,7 @@ void tst_TouchMouse::buttonOnTouch() p1 = QPoint(40, 110); p2 = QPoint(60, 110); QTest::touchEvent(window, device).press(0, p1, window).press(1, p2, window); + QQuickTouchUtils::flush(window); QCOMPARE(button1->scale(), 1.0); QCOMPARE(eventItem1->eventList.count(), 2); QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin); @@ -774,20 +816,24 @@ void tst_TouchMouse::buttonOnTouch() p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); //QCOMPARE(button1->scale(), 1.5); qDebug() << button1->scale(); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); QTest::touchEvent(window, device).move(0, p1, window).move(1, p2, window); + QQuickTouchUtils::flush(window); qDebug() << button1->scale(); //QCOMPARE(button1->scale(), 2.0); QTest::touchEvent(window, device).release(0, p1, window).release(1, p2, window); + QQuickTouchUtils::flush(window); // QCOMPARE(eventItem1->eventList.size(), 99); qDebug() << button1->scale(); //QCOMPARE(button1->scale(), 2.0); @@ -816,18 +862,22 @@ void tst_TouchMouse::pinchOnFlickable() QVERIFY(flickable->contentX() == 0.0); QPoint p = QPoint(100, 100); QTest::touchEvent(window, device).press(0, p, window); + QQuickTouchUtils::flush(window); QCOMPARE(rect->position(), QPointF(200.0, 200.0)); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); - QTest::qWait(10); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p, window); + QQuickTouchUtils::flush(window); QGuiApplication::processEvents(); QTest::qWait(10); @@ -840,27 +890,35 @@ void tst_TouchMouse::pinchOnFlickable() QPoint p2 = QPoint(60, 20); QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); + QQuickTouchUtils::flush(window); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. Otherwise if we let it // be destroyed and then start a new sequence, point 0 will default to being // stationary at 0, 0, and PinchArea will filter out that touchpoint because // it is outside its bounds. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(rect->scale(), 1.0); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QVERIFY(rect->scale() > 1.0); } @@ -885,17 +943,22 @@ void tst_TouchMouse::flickableOnPinch() QVERIFY(flickable->contentX() == 0.0); QPoint p = QPoint(100, 100); QTest::touchEvent(window, device).press(0, p, window); + QQuickTouchUtils::flush(window); QCOMPARE(rect->position(), QPointF(200.0, 200.0)); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); QTest::qWait(1000); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p, window); + QQuickTouchUtils::flush(window); QTest::qWait(1000); @@ -909,26 +972,33 @@ void tst_TouchMouse::flickableOnPinch() QPoint p2 = QPoint(60, 20); QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. Otherwise if we let it // be destroyed and then start a new sequence, point 0 will default to being // stationary at 0, 0, and PinchArea will filter out that touchpoint because // it is outside its bounds. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(rect->scale(), 1.0); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QVERIFY(rect->scale() > 1.0); } @@ -953,16 +1023,19 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() QVERIFY(flickable->contentX() == 0.0); QPoint p = QPoint(100, 100); QTest::touchEvent(window, device).press(0, p, window); + QQuickTouchUtils::flush(window); QCOMPARE(rect->position(), QPointF(200.0, 200.0)); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); - QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); QTest::touchEvent(window, device).move(0, p, window); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p, window); - QGuiApplication::processEvents(); + QQuickTouchUtils::flush(window); //QVERIFY(flickable->isMovingHorizontally()); @@ -975,26 +1048,33 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() QPoint p2 = QPoint(60, 20); QTest::QTouchEventSequence pinchSequence = QTest::touchEvent(window, device); pinchSequence.press(0, p1, window).commit(); + QQuickTouchUtils::flush(window); // In order for the stationary point to remember its previous position, // we have to reuse the same pinchSequence object. Otherwise if we let it // be destroyed and then start a new sequence, point 0 will default to being // stationary at 0, 0, and PinchArea will filter out that touchpoint because // it is outside its bounds. pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10,10); p2 += QPoint(10,10); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(rect->scale(), 1.0); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(10, 0); p2 += QPoint(10, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QVERIFY(rect->scale() > 1.0); // PinchArea should steal the event after flicking started @@ -1002,14 +1082,18 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() flickable->setContentX(0.0); p = QPoint(100, 100); pinchSequence.press(0, p, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(rect->position(), QPointF(200.0, 200.0)); p -= QPoint(10, 0); pinchSequence.move(0, p, window).commit(); + QQuickTouchUtils::flush(window); p -= QPoint(10, 0); pinchSequence.move(0, p, window).commit(); + QQuickTouchUtils::flush(window); QGuiApplication::processEvents(); p -= QPoint(10, 0); pinchSequence.move(0, p, window).commit(); + QQuickTouchUtils::flush(window); QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window); qDebug() << "Mouse Grabber: " << windowPriv->mouseGrabberItem << " itemForTouchPointId: " << windowPriv->itemForTouchPointId; @@ -1019,20 +1103,26 @@ void tst_TouchMouse::mouseOnFlickableOnPinch() p1 = QPoint(40, 100); p2 = QPoint(60, 100); pinchSequence.stationary(0).press(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QCOMPARE(rect->scale(), 1.0); p1 -= QPoint(5, 0); p2 += QPoint(5, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(5, 0); p2 += QPoint(5, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); p1 -= QPoint(5, 0); p2 += QPoint(5, 0); pinchSequence.move(0, p1, window).move(1, p2, window).commit(); + QQuickTouchUtils::flush(window); pinchSequence.release(0, p1, window).release(1, p2, window).commit(); + QQuickTouchUtils::flush(window); QVERIFY(rect->scale() > 1.0); pinchSequence.release(0, p, window).commit(); + QQuickTouchUtils::flush(window); } /* @@ -1066,16 +1156,17 @@ void tst_TouchMouse::tapOnDismissiveTopMouseAreaClicksBottomOne() // tap the front mouse area (see qml file) QPoint p1(20, 20); QTest::touchEvent(window, device).press(0, p1, window); - QTest::qWait(1); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(bottomClickedSpy.count(), 1); QCOMPARE(bottomDoubleClickedSpy.count(), 0); - QTest::qWait(15); QTest::touchEvent(window, device).press(0, p1, window); - QTest::qWait(1); + QQuickTouchUtils::flush(window); QTest::touchEvent(window, device).release(0, p1, window); + QQuickTouchUtils::flush(window); QCOMPARE(bottomClickedSpy.count(), 1); QCOMPARE(bottomDoubleClickedSpy.count(), 1); diff --git a/tests/auto/shared/testhttpserver.cpp b/tests/auto/shared/testhttpserver.cpp index d3de584084..231f22b35b 100644 --- a/tests/auto/shared/testhttpserver.cpp +++ b/tests/auto/shared/testhttpserver.cpp @@ -71,7 +71,8 @@ slowFiles/slowMain.qml \endcode it can be added like this: \code -TestHTTPServer server(14445); +TestHTTPServer server; +QVERIFY2(server.listen(14445), qPrintable(server.errorString())); server.serveDirectory("disconnect", TestHTTPServer::Disconnect); server.serveDirectory("files"); server.serveDirectory("slowFiles", TestHTTPServer::Delay); @@ -87,17 +88,21 @@ The following request urls will then result in the appropriate action: \row \li http://localhost:14445/slowMain.qml \li slowMain.qml returned after 500ms \endtable */ -TestHTTPServer::TestHTTPServer(quint16 port) +TestHTTPServer::TestHTTPServer() : m_state(AwaitingHeader) { QObject::connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection())); - server.listen(QHostAddress::LocalHost, port); } -bool TestHTTPServer::isValid() const +bool TestHTTPServer::listen(quint16 port) { - return server.isListening(); + return server.listen(QHostAddress::LocalHost, port); +} + +QString TestHTTPServer::errorString() const +{ + return server.errorString(); } bool TestHTTPServer::serveDirectory(const QString &dir, Mode mode) diff --git a/tests/auto/shared/testhttpserver.h b/tests/auto/shared/testhttpserver.h index ae7d137143..a71386ddec 100644 --- a/tests/auto/shared/testhttpserver.h +++ b/tests/auto/shared/testhttpserver.h @@ -51,9 +51,10 @@ class TestHTTPServer : public QObject { Q_OBJECT public: - TestHTTPServer(quint16 port); + TestHTTPServer(); - bool isValid() const; + bool listen(quint16 port); + QString errorString() const; enum Mode { Normal, Delay, Disconnect }; bool serveDirectory(const QString &, Mode = Normal); diff --git a/tests/manual/httpserver/main.cpp b/tests/manual/httpserver/main.cpp index ea729547ce..4ad44508b0 100644 --- a/tests/manual/httpserver/main.cpp +++ b/tests/manual/httpserver/main.cpp @@ -112,7 +112,11 @@ int main(int argc, char *argv[]) << "\":\n\n" << QDir(directory).entryList(QDir::Files).join(QLatin1Char('\n')) << "\n\non http://localhost:" << port << '\n'; - TestHTTPServer server(port); + TestHTTPServer server; + if (!server.listen(port)) { + std::wcout << "Couldn't listen on port " << port << server.errorString().toLocal8Bit(); + exit(-1); + } server.serveDirectory(directory); return a.exec(); |