aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quick/qquickpathview/tst_qquickpathview.cpp')
-rw-r--r--tests/auto/quick/qquickpathview/tst_qquickpathview.cpp668
1 files changed, 435 insertions, 233 deletions
diff --git a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
index 733281c20d..1b06e0047b 100644
--- a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
+++ b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtQuick/qquickview.h>
@@ -38,23 +13,25 @@
#include <QtQuick/private/qquickpath_p.h>
#include <QtQuick/private/qquicktext_p.h>
#include <QtQuick/private/qquickrectangle_p.h>
+#include <QtQuick/private/qquickmousearea_p.h>
#include <QtQuickTest/QtQuickTest>
#include <QtQmlModels/private/qqmllistmodel_p.h>
#include <QtQml/private/qqmlvaluetype_p.h>
#include <QtGui/qstandarditemmodel.h>
#include <QStringListModel>
#include <QFile>
+#include <QEvent>
-#include "../../shared/util.h"
-#include "../shared/viewtestutil.h"
-#include "../shared/visualtestutil.h"
+#include <QtQuickTestUtils/private/qmlutils_p.h>
+#include <QtQuickTestUtils/private/viewtestutils_p.h>
+#include <QtQuickTestUtils/private/visualtestutils_p.h>
#include <math.h>
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
-using namespace QQuickViewTestUtil;
-using namespace QQuickVisualTestUtil;
+using namespace QQuickViewTestUtils;
+using namespace QQuickVisualTestUtils;
Q_DECLARE_METATYPE(QQuickPathView::HighlightRangeMode)
Q_DECLARE_METATYPE(QQuickPathView::PositionMode)
@@ -153,6 +130,14 @@ private slots:
void objectModelMove();
void requiredPropertiesInDelegate();
void requiredPropertiesInDelegatePreventUnrelated();
+ void touchMove();
+ void mousePressAfterFlick();
+ void qtbug90479();
+ void overCached();
+ void qtbug46487();
+
+private:
+ QScopedPointer<QPointingDevice> touchDevice = QScopedPointer<QPointingDevice>(QTest::createTouchDevice());
};
class TestObject : public QObject
@@ -186,6 +171,7 @@ private:
};
tst_QQuickPathView::tst_QQuickPathView()
+ : QQmlDataTest(QT_QMLTEST_DATADIR)
{
}
@@ -230,7 +216,7 @@ void tst_QQuickPathView::items()
QCOMPARE(pathview->count(), model.count());
QCOMPARE(window->rootObject()->property("count").toInt(), model.count());
- QCOMPARE(pathview->childItems().count(), model.count()+1); // assumes all are visible, including highlight
+ QCOMPARE(pathview->childItems().size(), model.count()+1); // assumes all are visible, including highlight
for (int i = 0; i < model.count(); ++i) {
QQuickText *name = findItem<QQuickText>(pathview, "textName", i);
@@ -700,7 +686,7 @@ void tst_QQuickPathView::consecutiveModelChanges()
else
pathview->setOffset(4);
- for (int i=0; i<changes.count(); i++) {
+ for (int i=0; i<changes.size(); i++) {
switch (changes[i].type) {
case ListChange::Inserted:
{
@@ -720,15 +706,15 @@ void tst_QQuickPathView::consecutiveModelChanges()
pathview->setCurrentIndex(changes[i].index);
break;
case ListChange::Polish:
- QQuickTest::qWaitForItemPolished(pathview);
+ QQuickTest::qWaitForPolish(pathview);
break;
default:
continue;
}
}
- QQuickTest::qWaitForItemPolished(pathview);
+ QQuickTest::qWaitForPolish(pathview);
- QCOMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), count);
+ QCOMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), count);
QCOMPARE(pathview->count(), count);
QTRY_COMPARE(pathview->offset(), offset);
@@ -831,7 +817,7 @@ void tst_QQuickPathView::dataModel()
QTest::qWait(100);
QCOMPARE(window->rootObject()->property("viewCount").toInt(), model.count());
- QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 14);
+ QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 14);
QCOMPARE(pathview->currentIndex(), 0);
QCOMPARE(pathview->currentItem(), findItem<QQuickItem>(pathview, "wrapper", 0));
@@ -851,7 +837,7 @@ void tst_QQuickPathView::dataModel()
QMetaObject::invokeMethod(window->rootObject(), "checkProperties");
QVERIFY(!testObject->error());
- QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 5);
+ QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 5);
QQuickRectangle *testItem = findItem<QQuickRectangle>(pathview, "wrapper", 4);
QVERIFY(testItem != nullptr);
@@ -864,7 +850,7 @@ void tst_QQuickPathView::dataModel()
model.insertItem(2, "pink", "2");
- QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 5);
+ QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 5);
QCOMPARE(pathview->currentIndex(), 1);
QCOMPARE(pathview->currentItem(), findItem<QQuickItem>(pathview, "wrapper", 1));
@@ -872,24 +858,23 @@ void tst_QQuickPathView::dataModel()
QCOMPARE(text->text(), model.name(2));
model.removeItem(3);
- QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 5);
+ QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 5);
text = findItem<QQuickText>(pathview, "myText", 3);
QVERIFY(text);
QCOMPARE(text->text(), model.name(3));
QCOMPARE(pathview->currentItem(), findItem<QQuickItem>(pathview, "wrapper", 1));
model.moveItem(3, 5);
- QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 5);
- QList<QQuickItem*> items = findItems<QQuickItem>(pathview, "wrapper");
- foreach (QQuickItem *item, items) {
+ QTRY_COMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 5);
+ const QList<QQuickItem *> items = findItems<QQuickItem>(pathview, "wrapper");
+ for (QQuickItem *item : items)
QVERIFY(item->property("onPath").toBool());
- }
QCOMPARE(pathview->currentItem(), findItem<QQuickItem>(pathview, "wrapper", 1));
// QTBUG-14199
pathview->setOffset(7);
pathview->setOffset(0);
- QCOMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), 5);
+ QCOMPARE(findItems<QQuickItem>(pathview, "wrapper").size(), 5);
pathview->setCurrentIndex(model.count()-1);
QTRY_COMPARE(pathview->offset(), 1.0);
@@ -1140,7 +1125,7 @@ void tst_QQuickPathView::setCurrentIndex()
pathview->setSnapMode(QQuickPathView::SnapToItem);
pathview->setCurrentIndex(3);
QTRY_COMPARE(pathview->currentIndex(), 3);
- QCOMPARE(currentIndexSpy.count(), 1);
+ QCOMPARE(currentIndexSpy.size(), 1);
}
void tst_QQuickPathView::setCurrentIndexWrap()
@@ -1161,8 +1146,8 @@ void tst_QQuickPathView::setCurrentIndexWrap()
pathview->setCurrentIndex(0);
pathview->setCurrentIndex(4);
QCOMPARE(pathview->currentIndex(), 4);
- QCOMPARE(currentIndexSpy.count(), 2);
- QCOMPARE(movementStartedSpy.count(), 0);
+ QCOMPARE(currentIndexSpy.size(), 2);
+ QCOMPARE(movementStartedSpy.size(), 0);
}
void tst_QQuickPathView::resetModel()
@@ -1227,21 +1212,21 @@ void tst_QQuickPathView::propertyChanges()
QCOMPARE(pathView->preferredHighlightEnd(), 0.4);
QCOMPARE(pathView->dragMargin(), 20.0);
- QCOMPARE(snapPositionSpy.count(), 1);
- QCOMPARE(dragMarginSpy.count(), 1);
+ QCOMPARE(snapPositionSpy.size(), 1);
+ QCOMPARE(dragMarginSpy.size(), 1);
pathView->setPreferredHighlightBegin(0.4);
pathView->setPreferredHighlightEnd(0.4);
pathView->setDragMargin(20.0);
- QCOMPARE(snapPositionSpy.count(), 1);
- QCOMPARE(dragMarginSpy.count(), 1);
+ QCOMPARE(snapPositionSpy.size(), 1);
+ QCOMPARE(dragMarginSpy.size(), 1);
QSignalSpy maximumFlickVelocitySpy(pathView, SIGNAL(maximumFlickVelocityChanged()));
pathView->setMaximumFlickVelocity(1000);
- QCOMPARE(maximumFlickVelocitySpy.count(), 1);
+ QCOMPARE(maximumFlickVelocitySpy.size(), 1);
pathView->setMaximumFlickVelocity(1000);
- QCOMPARE(maximumFlickVelocitySpy.count(), 1);
+ QCOMPARE(maximumFlickVelocitySpy.size(), 1);
}
@@ -1269,14 +1254,14 @@ void tst_QQuickPathView::pathChanges()
QCOMPARE(path->startX(), 240.0);
QCOMPARE(path->startY(), 220.0);
- QCOMPARE(startXSpy.count(),1);
- QCOMPARE(startYSpy.count(),1);
+ QCOMPARE(startXSpy.size(),1);
+ QCOMPARE(startYSpy.size(),1);
path->setStartX(240);
path->setStartY(220);
- QCOMPARE(startXSpy.count(),1);
- QCOMPARE(startYSpy.count(),1);
+ QCOMPARE(startXSpy.size(),1);
+ QCOMPARE(startYSpy.size(),1);
QQuickPath *alternatePath = window->rootObject()->findChild<QQuickPath*>("alternatePath");
QVERIFY(alternatePath);
@@ -1287,10 +1272,10 @@ void tst_QQuickPathView::pathChanges()
pathView->setPath(alternatePath);
QCOMPARE(pathView->path(), alternatePath);
- QCOMPARE(pathSpy.count(),1);
+ QCOMPARE(pathSpy.size(),1);
pathView->setPath(alternatePath);
- QCOMPARE(pathSpy.count(),1);
+ QCOMPARE(pathSpy.size(),1);
QQuickPathAttribute *pathAttribute = window->rootObject()->findChild<QQuickPathAttribute*>("pathAttribute");
QVERIFY(pathAttribute);
@@ -1300,10 +1285,10 @@ void tst_QQuickPathView::pathChanges()
pathAttribute->setName("scale");
QCOMPARE(pathAttribute->name(), QString("scale"));
- QCOMPARE(nameSpy.count(),1);
+ QCOMPARE(nameSpy.size(),1);
pathAttribute->setName("scale");
- QCOMPARE(nameSpy.count(),1);
+ QCOMPARE(nameSpy.size(),1);
}
void tst_QQuickPathView::componentChanges()
@@ -1322,10 +1307,10 @@ void tst_QQuickPathView::componentChanges()
pathView->setDelegate(&delegateComponent);
QCOMPARE(pathView->delegate(), &delegateComponent);
- QCOMPARE(delegateSpy.count(),1);
+ QCOMPARE(delegateSpy.size(),1);
pathView->setDelegate(&delegateComponent);
- QCOMPARE(delegateSpy.count(),1);
+ QCOMPARE(delegateSpy.size(),1);
}
void tst_QQuickPathView::modelChanges()
@@ -1348,17 +1333,17 @@ void tst_QQuickPathView::modelChanges()
QCOMPARE(pathView->currentIndex(), 3);
pathView->setModel(modelVariant);
QCOMPARE(pathView->model(), modelVariant);
- QCOMPARE(modelSpy.count(),1);
+ QCOMPARE(modelSpy.size(),1);
QCOMPARE(pathView->currentIndex(), 0);
- QCOMPARE(currentIndexSpy.count(), 1);
+ QCOMPARE(currentIndexSpy.size(), 1);
pathView->setModel(modelVariant);
- QCOMPARE(modelSpy.count(),1);
+ QCOMPARE(modelSpy.size(),1);
pathView->setModel(QVariant());
- QCOMPARE(modelSpy.count(),2);
+ QCOMPARE(modelSpy.size(),2);
QCOMPARE(pathView->currentIndex(), 0);
- QCOMPARE(currentIndexSpy.count(), 1);
+ QCOMPARE(currentIndexSpy.size(), 1);
}
@@ -1389,8 +1374,7 @@ void tst_QQuickPathView::package()
QVERIFY(window);
window->setSource(testFileUrl("pathview_package.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathView = window->rootObject()->findChild<QQuickPathView*>("photoPathView");
QVERIFY(pathView);
@@ -1399,7 +1383,7 @@ void tst_QQuickPathView::package()
QSKIP("QTBUG-27170 view does not reliably receive polish without a running animation");
#endif
- QQuickTest::qWaitForItemPolished(pathView);
+ QQuickTest::qWaitForPolish(pathView);
QQuickItem *item = findItem<QQuickItem>(pathView, "pathItem");
QVERIFY(item);
QVERIFY(item->scale() != 1.0);
@@ -1515,12 +1499,10 @@ void tst_QQuickPathView::undefinedPath()
void tst_QQuickPathView::mouseDrag()
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("dragpath.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1538,21 +1520,23 @@ void tst_QQuickPathView::mouseDrag()
QTest::qWait(100);
{
- QMouseEvent mv(QEvent::MouseMove, QPoint(50,100), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QMouseEvent mv(QEvent::MouseMove, QPoint(50,100), window->mapToGlobal(QPoint(50,100)),
+ Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
QGuiApplication::sendEvent(window.data(), &mv);
}
// first move beyond threshold does not trigger drag
QVERIFY(!pathview->isMoving());
QVERIFY(!pathview->isDragging());
- QCOMPARE(movingSpy.count(), 0);
- QCOMPARE(moveStartedSpy.count(), 0);
- QCOMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(draggingSpy.count(), 0);
- QCOMPARE(dragStartedSpy.count(), 0);
- QCOMPARE(dragEndedSpy.count(), 0);
+ QCOMPARE(movingSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 0);
+ QCOMPARE(dragStartedSpy.size(), 0);
+ QCOMPARE(dragEndedSpy.size(), 0);
{
- QMouseEvent mv(QEvent::MouseMove, QPoint(90,100), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QMouseEvent mv(QEvent::MouseMove, QPoint(90,100), window->mapToGlobal(QPoint(90,100)),
+ Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
QGuiApplication::sendEvent(window.data(), &mv);
}
// next move beyond threshold does trigger drag
@@ -1562,36 +1546,33 @@ void tst_QQuickPathView::mouseDrag()
#endif // Q_OS_WIN
QVERIFY(pathview->isMoving());
QVERIFY(pathview->isDragging());
- QCOMPARE(movingSpy.count(), 1);
- QCOMPARE(moveStartedSpy.count(), 1);
- QCOMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(draggingSpy.count(), 1);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 0);
+ QCOMPARE(movingSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 1);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 0);
QVERIFY(pathview->currentIndex() != current);
QTest::mouseRelease(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(40,100));
QVERIFY(!pathview->isDragging());
- QCOMPARE(draggingSpy.count(), 2);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 1);
- QTRY_COMPARE(movingSpy.count(), 2);
- QTRY_COMPARE(moveEndedSpy.count(), 1);
- QCOMPARE(moveStartedSpy.count(), 1);
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
+ QTRY_COMPARE(movingSpy.size(), 2);
+ QTRY_COMPARE(moveEndedSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
}
void tst_QQuickPathView::nestedMouseAreaDrag()
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("nestedmousearea.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
-
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1608,12 +1589,10 @@ void tst_QQuickPathView::nestedMouseAreaDrag()
void tst_QQuickPathView::flickNClick() // QTBUG-77173
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("nestedmousearea2.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1640,32 +1619,32 @@ void tst_QQuickPathView::flickNClick() // QTBUG-77173
flickStartedSpy.clear();
flickEndedSpy.clear();
// Dragging the child mouse area should animate the PathView (MA has no drag target)
- flick(window.data(), QPoint(200,200), QPoint(400,200), duration);
+ flick(window.data(), QPoint(199,199), QPoint(399,199), duration);
QVERIFY(pathview->isMoving());
- QCOMPARE(movingChangedSpy.count(), 1);
- QCOMPARE(draggingSpy.count(), 2);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 1);
- QVERIFY(currentIndexSpy.count() > 0);
- QCOMPARE(moveStartedSpy.count(), 1);
- QCOMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(flickingSpy.count(), 1);
- QCOMPARE(flickStartedSpy.count(), 1);
- QCOMPARE(flickEndedSpy.count(), 0);
+ QCOMPARE(movingChangedSpy.size(), 1);
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
+ QVERIFY(currentIndexSpy.size() > 0);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(flickingSpy.size(), 1);
+ QCOMPARE(flickStartedSpy.size(), 1);
+ QCOMPARE(flickEndedSpy.size(), 0);
// Now while it's still moving, click it.
// The PathView should stop at a position such that offset is a whole number.
QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(200, 200));
QTRY_VERIFY(!pathview->isMoving());
- QCOMPARE(movingChangedSpy.count(), 2); // QTBUG-78926
- QCOMPARE(draggingSpy.count(), 2);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 1);
- QCOMPARE(moveStartedSpy.count(), 1);
- QCOMPARE(moveEndedSpy.count(), 1);
- QCOMPARE(flickingSpy.count(), 2);
- QCOMPARE(flickStartedSpy.count(), 1);
- QCOMPARE(flickEndedSpy.count(), 1);
+ QCOMPARE(movingChangedSpy.size(), 2); // QTBUG-78926
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 1);
+ QCOMPARE(flickingSpy.size(), 2);
+ QCOMPARE(flickStartedSpy.size(), 1);
+ QCOMPARE(flickEndedSpy.size(), 1);
QVERIFY(qFuzzyIsNull(pathview->offset() - int(pathview->offset())));
}
}
@@ -1702,9 +1681,7 @@ void tst_QQuickPathView::changePreferredHighlight()
window->setGeometry(0,0,400,200);
window->setSource(testFileUrl("dragpath.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1789,7 +1766,7 @@ void tst_QQuickPathView::currentOffsetOnInsertion()
model.insertItem(0, "item1", "1");
qApp->processEvents();
- QCOMPARE(currentIndexSpy.count(), 1);
+ QCOMPARE(currentIndexSpy.size(), 1);
// currentIndex is now 1
item = findItem<QQuickRectangle>(pathview, "wrapper", 1);
@@ -1802,7 +1779,7 @@ void tst_QQuickPathView::currentOffsetOnInsertion()
model.insertItem(0, "item2", "2");
qApp->processEvents();
- QCOMPARE(currentIndexSpy.count(), 2);
+ QCOMPARE(currentIndexSpy.size(), 2);
// currentIndex is now 2
item = findItem<QQuickRectangle>(pathview, "wrapper", 2);
@@ -1815,7 +1792,7 @@ void tst_QQuickPathView::currentOffsetOnInsertion()
model.removeItem(0);
qApp->processEvents();
- QCOMPARE(currentIndexSpy.count(), 3);
+ QCOMPARE(currentIndexSpy.size(), 3);
// currentIndex is now 1
item = findItem<QQuickRectangle>(pathview, "wrapper", 1);
@@ -1903,11 +1880,9 @@ void tst_QQuickPathView::cancelDrag()
{
QScopedPointer<QQuickView> window(createView());
window->setSource(testFileUrl("dragpath.qml"));
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1925,23 +1900,24 @@ void tst_QQuickPathView::cancelDrag()
QTRY_VERIFY(hasFraction(pathview->offset()));
QTRY_VERIFY(pathview->isMoving());
QVERIFY(pathview->isDragging());
- QCOMPARE(draggingSpy.count(), 1);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 0);
+ QCOMPARE(draggingSpy.size(), 1);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 0);
// steal mouse grab - cancels PathView dragging
auto mouse = QPointingDevice::primaryPointingDevice();
auto mousePriv = QPointingDevicePrivate::get(const_cast<QPointingDevice *>(mouse));
- QMouseEvent fakeMouseEv(QEvent::MouseMove, QPoint(130, 100), Qt::NoButton, Qt::LeftButton, Qt::NoModifier, mouse);
+ QMouseEvent fakeMouseEv(QEvent::MouseMove, QPoint(130, 100), QPoint(130, 100),
+ Qt::NoButton, Qt::LeftButton, Qt::NoModifier, mouse);
mousePriv->setExclusiveGrabber(&fakeMouseEv, fakeMouseEv.points().first(), nullptr);
// returns to a snap point.
QTRY_COMPARE(pathview->offset(), qreal(qFloor(pathview->offset())));
QTRY_VERIFY(!pathview->isMoving());
QVERIFY(!pathview->isDragging());
- QCOMPARE(draggingSpy.count(), 2);
- QCOMPARE(dragStartedSpy.count(), 1);
- QCOMPARE(dragEndedSpy.count(), 1);
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
QTest::mouseRelease(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(40,100));
}
@@ -1950,11 +1926,9 @@ void tst_QQuickPathView::maximumFlickVelocity()
{
QScopedPointer<QQuickView> window(createView());
window->setSource(testFileUrl("dragpath.qml"));
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -1996,12 +1970,10 @@ void tst_QQuickPathView::snapToItem()
QFETCH(bool, enforceRange);
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("panels.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = window->rootObject()->findChild<QQuickPathView*>("view");
QVERIFY(pathview != nullptr);
@@ -2040,12 +2012,10 @@ void tst_QQuickPathView::snapOneItem()
QFETCH(bool, enforceRange);
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("panels.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = window->rootObject()->findChild<QQuickPathView*>("view");
QVERIFY(pathview != nullptr);
@@ -2055,7 +2025,7 @@ void tst_QQuickPathView::snapOneItem()
QSignalSpy snapModeSpy(pathview, SIGNAL(snapModeChanged()));
window->rootObject()->setProperty("snapOne", true);
- QCOMPARE(snapModeSpy.count(), 1);
+ QCOMPARE(snapModeSpy.size(), 1);
QTRY_VERIFY(!pathview->isMoving()); // ensure stable
int currentIndex = pathview->currentIndex();
@@ -2096,9 +2066,7 @@ void tst_QQuickPathView::positionViewAtIndex()
QScopedPointer<QQuickView> window(createView());
window->setSource(testFileUrl("pathview3.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -2159,9 +2127,7 @@ void tst_QQuickPathView::indexAt_itemAt()
QScopedPointer<QQuickView> window(createView());
window->setSource(testFileUrl("pathview3.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -2285,8 +2251,7 @@ void tst_QQuickPathView::changePathDuringRefill()
window->setSource(testFileUrl("changePathDuringRefill.qml"));
window->show();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathView = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathView != nullptr);
@@ -2309,12 +2274,10 @@ void tst_QQuickPathView::changePathDuringRefill()
void tst_QQuickPathView::nestedinFlickable()
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("nestedInFlickable.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = findItem<QQuickPathView>(window->rootObject(), "pathView");
QVERIFY(pathview != nullptr);
@@ -2343,22 +2306,22 @@ void tst_QQuickPathView::nestedinFlickable()
// first move beyond threshold does not trigger drag
QVERIFY(!pathview->isMoving());
QVERIFY(!pathview->isDragging());
- QCOMPARE(movingSpy.count(), 0);
- QCOMPARE(moveStartedSpy.count(), 0);
- QCOMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(fflickingSpy.count(), 0);
- QCOMPARE(fflickStartedSpy.count(), 0);
- QCOMPARE(fflickEndedSpy.count(), 0);
+ QCOMPARE(movingSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(fflickingSpy.size(), 0);
+ QCOMPARE(fflickStartedSpy.size(), 0);
+ QCOMPARE(fflickEndedSpy.size(), 0);
// no further moves after the initial move beyond threshold
QTest::mouseRelease(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(73,219));
- QTRY_COMPARE(movingSpy.count(), 2);
- QTRY_COMPARE(moveEndedSpy.count(), 1);
- QCOMPARE(moveStartedSpy.count(), 1);
+ QTRY_COMPARE(movingSpy.size(), 2);
+ QTRY_COMPARE(moveEndedSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
// Flickable should not handle this
- QCOMPARE(fflickingSpy.count(), 0);
- QCOMPARE(fflickStartedSpy.count(), 0);
- QCOMPARE(fflickEndedSpy.count(), 0);
+ QCOMPARE(fflickingSpy.size(), 0);
+ QCOMPARE(fflickStartedSpy.size(), 0);
+ QCOMPARE(fflickEndedSpy.size(), 0);
// now test that two quick flicks are both handled by the pathview
movingSpy.clear();
@@ -2392,37 +2355,35 @@ void tst_QQuickPathView::nestedinFlickable()
// we allow the multiple signal count case, rather than simply:
// QTRY_COMPARE(moveEndedSpy.count(), 1);
// QCOMPARE(moveStartedSpy.count(), 1);
- QTRY_VERIFY(moveEndedSpy.count() > 0);
+ QTRY_VERIFY(moveEndedSpy.size() > 0);
qCDebug(lcTests) << "After receiving moveEnded signal:"
- << "moveEndedSpy.count():" << moveEndedSpy.count()
- << "moveStartedSpy.count():" << moveStartedSpy.count()
- << "fflickingSpy.count():" << fflickingSpy.count()
- << "fflickStartedSpy.count():" << fflickStartedSpy.count()
- << "fflickEndedSpy.count():" << fflickEndedSpy.count();
- QTRY_COMPARE(moveStartedSpy.count(), moveEndedSpy.count());
+ << "moveEndedSpy.count():" << moveEndedSpy.size()
+ << "moveStartedSpy.count():" << moveStartedSpy.size()
+ << "fflickingSpy.count():" << fflickingSpy.size()
+ << "fflickStartedSpy.count():" << fflickStartedSpy.size()
+ << "fflickEndedSpy.count():" << fflickEndedSpy.size();
+ QTRY_COMPARE(moveStartedSpy.size(), moveEndedSpy.size());
qCDebug(lcTests) << "After receiving matched moveEnded signal(s):"
- << "moveEndedSpy.count():" << moveEndedSpy.count()
- << "moveStartedSpy.count():" << moveStartedSpy.count()
- << "fflickingSpy.count():" << fflickingSpy.count()
- << "fflickStartedSpy.count():" << fflickStartedSpy.count()
- << "fflickEndedSpy.count():" << fflickEndedSpy.count();
- QVERIFY(moveStartedSpy.count() <= 2);
+ << "moveEndedSpy.count():" << moveEndedSpy.size()
+ << "moveStartedSpy.count():" << moveStartedSpy.size()
+ << "fflickingSpy.count():" << fflickingSpy.size()
+ << "fflickStartedSpy.count():" << fflickStartedSpy.size()
+ << "fflickEndedSpy.count():" << fflickEndedSpy.size();
+ QVERIFY(moveStartedSpy.size() <= 2);
// Flickable should not handle this
- QCOMPARE(fflickingSpy.count(), 0);
- QCOMPARE(fflickStartedSpy.count(), 0);
- QCOMPARE(fflickEndedSpy.count(), 0);
+ QCOMPARE(fflickingSpy.size(), 0);
+ QCOMPARE(fflickStartedSpy.size(), 0);
+ QCOMPARE(fflickEndedSpy.size(), 0);
}
void tst_QQuickPathView::ungrabNestedinFlickable()
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("ungrabNestedinFlickable.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = findItem<QQuickPathView>(window->rootObject(), "pathView");
QVERIFY(pathview != nullptr);
@@ -2451,12 +2412,10 @@ void tst_QQuickPathView::ungrabNestedinFlickable()
void tst_QQuickPathView::flickableDelegate()
{
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("flickableDelegate.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
QVERIFY(pathview != nullptr);
@@ -2485,22 +2444,22 @@ void tst_QQuickPathView::flickableDelegate()
// first move beyond threshold does not trigger drag
QVERIFY(!flickable->isMoving());
QVERIFY(!flickable->isDragging());
- QCOMPARE(movingSpy.count(), 0);
- QCOMPARE(moveStartedSpy.count(), 0);
- QCOMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(fflickingSpy.count(), 0);
- QCOMPARE(fflickStartedSpy.count(), 0);
- QCOMPARE(fflickEndedSpy.count(), 0);
+ QCOMPARE(movingSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(fflickingSpy.size(), 0);
+ QCOMPARE(fflickStartedSpy.size(), 0);
+ QCOMPARE(fflickEndedSpy.size(), 0);
// no further moves after the initial move beyond threshold
QTest::mouseRelease(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(53,100));
- QTRY_COMPARE(fflickingSpy.count(), 2);
- QTRY_COMPARE(fflickStartedSpy.count(), 1);
- QCOMPARE(fflickEndedSpy.count(), 1);
+ QTRY_COMPARE(fflickingSpy.size(), 2);
+ QTRY_COMPARE(fflickStartedSpy.size(), 1);
+ QCOMPARE(fflickEndedSpy.size(), 1);
// PathView should not handle this
- QTRY_COMPARE(movingSpy.count(), 0);
- QTRY_COMPARE(moveEndedSpy.count(), 0);
- QCOMPARE(moveStartedSpy.count(), 0);
+ QTRY_COMPARE(movingSpy.size(), 0);
+ QTRY_COMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
}
void tst_QQuickPathView::jsArrayChange()
@@ -2523,11 +2482,11 @@ void tst_QQuickPathView::jsArrayChange()
}
view->setModel(QVariant::fromValue(array1));
- QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.size(), 1);
// no change
view->setModel(QVariant::fromValue(array2));
- QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.size(), 1);
}
void tst_QQuickPathView::qtbug37815()
@@ -2536,8 +2495,7 @@ void tst_QQuickPathView::qtbug37815()
window->setSource(testFileUrl("qtbug37815.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
// cache items will be created async. Let's wait...
QTest::qWait(1000);
@@ -2548,7 +2506,8 @@ void tst_QQuickPathView::qtbug37815()
const int pathItemCount = pathView->pathItemCount();
const int cacheItemCount = pathView->cacheItemCount();
int totalCount = 0;
- foreach (QQuickItem *item, pathView->childItems()) {
+ const auto childItems = pathView->childItems();
+ for (QQuickItem *item : childItems) {
if (item->objectName().startsWith(QLatin1String("delegate")))
++totalCount;
}
@@ -2567,8 +2526,7 @@ void tst_QQuickPathView::qtbug42716()
window->setSource(testFileUrl("qtbug42716.qml"));
window->show();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathView = findItem<QQuickPathView>(window->rootObject(), "pathView");
QVERIFY(pathView != nullptr);
@@ -2609,8 +2567,7 @@ void tst_QQuickPathView::qtbug53464()
window->setSource(testFileUrl("qtbug53464.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathView = findItem<QQuickPathView>(window->rootObject(), "pathView");
QVERIFY(pathView != nullptr);
@@ -2619,7 +2576,8 @@ void tst_QQuickPathView::qtbug53464()
const int pathItemCount = pathView->pathItemCount();
int totalCount = 0;
- foreach (QQuickItem *item, pathView->childItems()) {
+ const auto childItems = pathView->childItems();
+ for (QQuickItem *item : childItems) {
if (item->objectName().startsWith(QLatin1String("delegate")))
++totalCount;
}
@@ -2684,12 +2642,10 @@ void tst_QQuickPathView::movementDirection()
QFETCH(qreal, tooffset);
QScopedPointer<QQuickView> window(createView());
- QQuickViewTestUtil::moveMouseAway(window.data());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
window->setSource(testFileUrl("movementDirection.qml"));
window->show();
- window->requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(window.data()));
- QCOMPARE(window.data(), qGuiApp->focusWindow());
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QQuickPathView *pathview = window->rootObject()->findChild<QQuickPathView*>("view");
QVERIFY(pathview != nullptr);
@@ -2742,7 +2698,7 @@ void tst_QQuickPathView::objectModelMove()
QVector<QString> itemObjectNames;
itemObjectNames << QLatin1String("red") << QLatin1String("green") << QLatin1String("blue");
QVector<QQuickItem*> childItems;
- for (const QString &itemObjectName : qAsConst(itemObjectNames)) {
+ for (const QString &itemObjectName : std::as_const(itemObjectNames)) {
QQuickItem *childItem = findItem<QQuickItem>(pathView, itemObjectName);
QVERIFY(childItem);
childItems.append(childItem);
@@ -2755,7 +2711,7 @@ void tst_QQuickPathView::objectModelMove()
QTRY_VERIFY(pathView.isNull());
// By this point, all of its cached items should have been released,
// which means none of the items should have any listeners.
- for (const auto childItem : qAsConst(childItems)) {
+ for (const auto childItem : std::as_const(childItems)) {
const QQuickItemPrivate *childItemPrivate = QQuickItemPrivate::get(childItem);
QCOMPARE(childItemPrivate->changeListeners.size(), 0);
}
@@ -2779,7 +2735,6 @@ void tst_QQuickPathView::requiredPropertiesInDelegate()
}
{
QScopedPointer<QQuickView> window(createView());
- QTest::ignoreMessage(QtMsgType::QtWarningMsg, QRegularExpression("Writing to \"name\" broke the binding to the underlying model"));
window->setSource(testFileUrl("delegateWithRequiredProperties.3.qml"));
window->show();
QTRY_VERIFY(window->rootObject()->property("working").toBool());
@@ -2796,6 +2751,253 @@ void tst_QQuickPathView::requiredPropertiesInDelegatePreventUnrelated()
window->show();
}
+void tst_QQuickPathView::touchMove()
+{
+ QScopedPointer<QQuickView> window(createView());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
+ window->setSource(testFileUrl("dragpath.qml"));
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+
+ QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
+ QVERIFY(pathview != nullptr);
+
+ QSignalSpy movingSpy(pathview, SIGNAL(movingChanged()));
+ QSignalSpy moveStartedSpy(pathview, SIGNAL(movementStarted()));
+ QSignalSpy moveEndedSpy(pathview, SIGNAL(movementEnded()));
+ QSignalSpy draggingSpy(pathview, SIGNAL(draggingChanged()));
+ QSignalSpy dragStartedSpy(pathview, SIGNAL(dragStarted()));
+ QSignalSpy dragEndedSpy(pathview, SIGNAL(dragEnded()));
+ QSignalSpy flickStartedSpy(pathview, SIGNAL(flickStarted()));
+ QSignalSpy flickEndedSpy(pathview, SIGNAL(flickEnded()));
+
+ int current = pathview->currentIndex();
+
+ // touch move from left to right
+ QPoint from(250, 100);
+ QPoint to(10, 100);
+
+ QTest::touchEvent(window.data(), touchDevice.data()).press(0, from, window.data());
+ QQuickTouchUtils::flush(window.data());
+
+ QVERIFY(!pathview->isMoving());
+ QVERIFY(!pathview->isDragging());
+ QCOMPARE(movingSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 0);
+ QCOMPARE(dragStartedSpy.size(), 0);
+ QCOMPARE(dragEndedSpy.size(), 0);
+ QCOMPARE(flickStartedSpy.size(), 0);
+ QCOMPARE(flickEndedSpy.size(), 0);
+
+ from -= QPoint(QGuiApplication::styleHints()->startDragDistance() + 1, 0);
+ QTest::touchEvent(window.data(), touchDevice.data()).move(0, from, window.data());
+ QQuickTouchUtils::flush(window.data());
+
+ // first move does not trigger move/drag
+ QVERIFY(!pathview->isMoving());
+ QVERIFY(!pathview->isDragging());
+ QCOMPARE(movingSpy.size(), 0);
+ QCOMPARE(moveStartedSpy.size(), 0);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 0);
+ QCOMPARE(dragStartedSpy.size(), 0);
+ QCOMPARE(dragEndedSpy.size(), 0);
+ QCOMPARE(flickStartedSpy.size(), 0);
+ QCOMPARE(flickEndedSpy.size(), 0);
+
+ QPoint diff = from - to;
+ int moveCount = 4;
+ for (int i = 1; i <= moveCount; ++i) {
+ QTest::touchEvent(window.data(), touchDevice.data()).move(0, from - i * diff / moveCount, window.data());
+ QQuickTouchUtils::flush(window.data());
+
+ QVERIFY(pathview->isMoving());
+ QVERIFY(pathview->isDragging());
+ QCOMPARE(movingSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 1);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 0);
+ QCOMPARE(flickStartedSpy.size(), 0);
+ QCOMPARE(flickEndedSpy.size(), 0);
+ }
+ QVERIFY(pathview->currentIndex() != current);
+
+ QTest::touchEvent(window.data(), touchDevice.data()).release(0, to, window.data());
+ QQuickTouchUtils::flush(window.data());
+
+ QVERIFY(pathview->isMoving());
+ QVERIFY(!pathview->isDragging());
+ QCOMPARE(movingSpy.size(), 1);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 0);
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
+ QCOMPARE(flickStartedSpy.size(), 1);
+ QCOMPARE(flickEndedSpy.size(), 0);
+
+ // Wait for the flick to finish
+ QVERIFY(QTest::qWaitFor([&]()
+ { return !pathview->isFlicking(); }
+ ));
+ QVERIFY(!pathview->isMoving());
+ QVERIFY(!pathview->isDragging());
+ QCOMPARE(movingSpy.size(), 2);
+ QCOMPARE(moveStartedSpy.size(), 1);
+ QCOMPARE(moveEndedSpy.size(), 1);
+ QCOMPARE(draggingSpy.size(), 2);
+ QCOMPARE(dragStartedSpy.size(), 1);
+ QCOMPARE(dragEndedSpy.size(), 1);
+ QCOMPARE(flickStartedSpy.size(), 1);
+ QCOMPARE(flickEndedSpy.size(), 1);
+
+}
+
+void tst_QQuickPathView::mousePressAfterFlick() // QTBUG-115121
+{
+ QScopedPointer<QQuickView> window(createView());
+ QQuickVisualTestUtils::moveMouseAway(window.data());
+ window->setSource(testFileUrl("mousePressAfterFlick.qml"));
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+
+ QQuickPathView *pathview = window->rootObject()->findChild<QQuickPathView *>("pathView");
+ QVERIFY(pathview != nullptr);
+
+ QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea *>("rootMouseArea");
+ QVERIFY(mouseArea != nullptr);
+
+ QSignalSpy flickingSpy(pathview, SIGNAL(flickingChanged()));
+ QSignalSpy flickStartedSpy(pathview, SIGNAL(flickStarted()));
+ QSignalSpy flickEndedSpy(pathview, SIGNAL(flickEnded()));
+
+ QSignalSpy pressedSpy(mouseArea, &QQuickMouseArea::pressed);
+
+ flickingSpy.clear();
+ flickStartedSpy.clear();
+ flickEndedSpy.clear();
+
+ // Dragging the child mouse area should animate the PathView (MA has no drag target)
+ QPoint from = QPoint((window->width() / 2), (window->height() * 3 / 4));
+ QPoint to = QPoint((window->width() / 2), (window->height() / 4));
+ flick(window.data(), from, to, 100);
+ QVERIFY(pathview->isMoving());
+ QCOMPARE(flickingSpy.size(), 1);
+ QCOMPARE(flickStartedSpy.size(), 1);
+ QCOMPARE(flickEndedSpy.size(), 0);
+
+ // Now while it's still moving, click it.
+ // The PathView should stop at a position
+ QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(window->width() / 2, window->height() / 4));
+ QTRY_VERIFY(!pathview->isMoving());
+ QCOMPARE(flickEndedSpy.size(), 1);
+ QCOMPARE(pressedSpy.size(), 0);
+}
+
+void tst_QQuickPathView::qtbug90479()
+{
+ QScopedPointer<QQuickView> window(createView());
+ window->setSource(testFileUrl("qtbug90479.qml"));
+
+ window->show();
+ qApp->processEvents();
+
+ QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
+ QVERIFY(pathview);
+
+ // cache items will be created async. Let's wait...
+ QTest::qWait(1000);
+
+ // Should create just pathItemCount amount and not destroy any
+ QCOMPARE(pathview->property("delegatesCreated").toInt(), 6);
+ QCOMPARE(pathview->property("delegatesDestroyed").toInt(), 0);
+}
+
+void tst_QQuickPathView::overCached()
+{
+ QScopedPointer<QQuickView> window(createView());
+ window->setSource(testFileUrl("overcached.qml"));
+
+ window->show();
+ qApp->processEvents();
+
+ QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
+ QVERIFY(pathview);
+
+ // cache items will be created async. Let's wait...
+ QTest::qWait(1000);
+
+ // Should create max model + 1 amount with the current implementation
+ QVERIFY(pathview->property("delegatesCreated").toInt() <= 16);
+ QVERIFY(pathview->property("delegatesDestroyed").toInt() <= 1);
+}
+
+class CustomModel : public QAbstractListModel
+{
+public:
+ CustomModel(QObject *parent = 0) : QAbstractListModel(parent) {
+ m_values << 0 << 1 << 2 << 3 << 4;
+ }
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const {
+ Q_UNUSED(parent);
+ return m_values.count();
+ }
+ QVariant data(const QModelIndex &index, int role) const {
+ if (index.row() < 0 || m_values.count() <= index.row())
+ return QVariant();
+
+ return m_values[index.row()];
+ }
+
+ Q_INVOKABLE void shrink() {
+ beginResetModel();
+ m_values.takeLast();
+ m_values.takeLast();
+ endResetModel();
+ }
+
+private:
+ QList<int> m_values;
+};
+
+void tst_QQuickPathView::qtbug46487()
+{
+ QScopedPointer<QQuickView> window(createView());
+
+ CustomModel* model = new CustomModel;
+ QQmlContext *ctxt = window->rootContext();
+ ctxt->setContextProperty("customModel", model);
+
+ window->setSource(testFileUrl("qtbug46487.qml"));
+ window->show();
+ qApp->processEvents();
+
+ QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject());
+ QVERIFY(pathview);
+
+ QTest::qWait(500);
+
+ // Should create just pathItemCount amount and not destroy any
+ QCOMPARE(pathview->count(), 5);
+ QCOMPARE(pathview->property("delegatesCreated").toInt(), 5);
+ QCOMPARE(pathview->property("delegatesDestroyed").toInt(), 0);
+
+ // Resets the model and removes 2 items.
+ model->shrink();
+ QTest::qWait(500);
+
+ // Should destroy previous items (begin/endResetModel) and
+ // (re)create 3 new items.
+ QCOMPARE(pathview->count(), 3);
+ QCOMPARE(pathview->property("delegatesCreated").toInt(), 5 + 3);
+ QCOMPARE(pathview->property("delegatesDestroyed").toInt(), 5);
+}
+
QTEST_MAIN(tst_QQuickPathView)
#include "tst_qquickpathview.moc"