diff options
Diffstat (limited to 'tests/auto/quick/qquicklistview')
5 files changed, 136 insertions, 17 deletions
diff --git a/tests/auto/quick/qquicklistview/data/displacedTransitions.qml b/tests/auto/quick/qquicklistview/data/displacedTransitions.qml index cc7892e930..964ded10ee 100644 --- a/tests/auto/quick/qquicklistview/data/displacedTransitions.qml +++ b/tests/auto/quick/qquicklistview/data/displacedTransitions.qml @@ -53,6 +53,17 @@ Rectangle { property int targetTransitionsDone property int displaceTransitionsDone + property var displacedTargetIndexes: new Array() + property var displacedTargetItems: new Array() + + // for QDeclarativeListProperty types + function copyList(propList) { + var temp = new Array() + for (var i=0; i<propList.length; i++) + temp.push(propList[i]) + return temp + } + objectName: "list" focus: true anchors.centerIn: parent @@ -70,6 +81,12 @@ Rectangle { id: displaced enabled: displacedEnabled SequentialAnimation { + ScriptAction { + script: { + list.displacedTargetIndexes.push(displaced.ViewTransition.targetIndexes) + list.displacedTargetItems.push(list.copyList(displaced.ViewTransition.targetItems)) + } + } ParallelAnimation { NumberAnimation { properties: "x"; to: displaced_transitionVia.x; duration: root.duration } NumberAnimation { properties: "y"; to: displaced_transitionVia.y; duration: root.duration } @@ -83,6 +100,12 @@ Rectangle { id: addDisplaced enabled: addDisplacedEnabled SequentialAnimation { + ScriptAction { + script: { + list.displacedTargetIndexes.push(addDisplaced.ViewTransition.targetIndexes) + list.displacedTargetItems.push(list.copyList(addDisplaced.ViewTransition.targetItems)) + } + } ParallelAnimation { NumberAnimation { properties: "x"; to: addDisplaced_transitionVia.x; duration: root.duration } NumberAnimation { properties: "y"; to: addDisplaced_transitionVia.y; duration: root.duration } @@ -96,6 +119,12 @@ Rectangle { id: moveDisplaced enabled: moveDisplacedEnabled SequentialAnimation { + ScriptAction { + script: { + list.displacedTargetIndexes.push(moveDisplaced.ViewTransition.targetIndexes) + list.displacedTargetItems.push(list.copyList(moveDisplaced.ViewTransition.targetItems)) + } + } ParallelAnimation { NumberAnimation { properties: "x"; to: moveDisplaced_transitionVia.x; duration: root.duration } NumberAnimation { properties: "y"; to: moveDisplaced_transitionVia.y; duration: root.duration } @@ -109,6 +138,12 @@ Rectangle { id: removeDisplaced enabled: removeDisplacedEnabled SequentialAnimation { + ScriptAction { + script: { + list.displacedTargetIndexes.push(removeDisplaced.ViewTransition.targetIndexes) + list.displacedTargetItems.push(list.copyList(removeDisplaced.ViewTransition.targetItems)) + } + } ParallelAnimation { NumberAnimation { properties: "x"; to: removeDisplaced_transitionVia.x; duration: root.duration } NumberAnimation { properties: "y"; to: removeDisplaced_transitionVia.y; duration: root.duration } diff --git a/tests/auto/quick/qquicklistview/data/flickBeyondBoundsBug.qml b/tests/auto/quick/qquicklistview/data/flickBeyondBoundsBug.qml new file mode 100644 index 0000000000..0a1b1a1b64 --- /dev/null +++ b/tests/auto/quick/qquicklistview/data/flickBeyondBoundsBug.qml @@ -0,0 +1,43 @@ +import QtQuick 2.0 + +Rectangle { + id: root + width: 240 + height: 320 + color: "#ffffff" + + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: column.height + Column { + id: column + Text { + text: "index: " + index + ", delegate A" + Component.onCompleted: height = index % 2 ? 30 : 20 + } + Text { + x: 200 + text: wrapper.y + height: 25 + } + } + color: ListView.isCurrentItem ? "lightsteelblue" : "#EEEEEE" + } + } + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + model: 2 + delegate: myDelegate + highlightMoveSpeed: 1000 + highlightResizeSpeed: 1000 + cacheBuffer: 400 + } + Text { anchors.bottom: parent.bottom; text: list.contentY } +} diff --git a/tests/auto/quick/qquicklistview/data/multipleTransitions.qml b/tests/auto/quick/qquicklistview/data/multipleTransitions.qml index 8264b42b64..68efeea2ec 100644 --- a/tests/auto/quick/qquicklistview/data/multipleTransitions.qml +++ b/tests/auto/quick/qquicklistview/data/multipleTransitions.qml @@ -10,7 +10,7 @@ Rectangle { // interrupting transitions will still produce the correct result) property int timeBetweenActions: duration / 2 - property int duration: 300 + property int duration: 100 property int count: list.count diff --git a/tests/auto/quick/qquicklistview/qquicklistview.pro b/tests/auto/quick/qquicklistview/qquicklistview.pro index 4cac8e7665..d4d97e2106 100644 --- a/tests/auto/quick/qquicklistview/qquicklistview.pro +++ b/tests/auto/quick/qquicklistview/qquicklistview.pro @@ -9,8 +9,6 @@ SOURCES += tst_qquicklistview.cpp \ include (../../shared/util.pri) include (../shared/util.pri) -testDataFiles.files = data -testDataFiles.path = . -DEPLOYMENT += testDataFiles +TESTDATA = data/* QT += core-private gui-private qml-private quick-private widgets widgets-private v8-private opengl-private testlib diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 9195aab632..dcc2e9dd16 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -184,6 +184,8 @@ private slots: void multipleTransitions(); void multipleTransitions_data(); + void flickBeyondBounds(); + private: template <class T> void items(const QUrl &source, bool forceLayout); template <class T> void changed(const QUrl &source, bool forceLayout); @@ -2351,6 +2353,11 @@ void tst_QQuickListView::currentIndex() QVERIFY(!listview->highlightItem()); QVERIFY(!listview->currentItem()); + listview->setCurrentIndex(0); + QTRY_VERIFY(listview->currentItem()->isVisible()); + listview->setContentY(200); + QTRY_VERIFY(!listview->currentItem()->isVisible()); + delete canvas; } @@ -5648,11 +5655,26 @@ void tst_QQuickListView::displacedTransitions() case ListChange::SetContentY: break; } + + QVariantList resultTargetIndexes = listview->property("displacedTargetIndexes").toList(); + QVariantList resultTargetItems = listview->property("displacedTargetItems").toList(); + if ((useDisplaced && displacedEnabled) || (useAddDisplaced && addDisplacedEnabled) || (useMoveDisplaced && moveDisplacedEnabled) || (useRemoveDisplaced && removeDisplacedEnabled)) { QTRY_VERIFY(listview->property("displaceTransitionsDone").toBool()); + + // check the correct number of target items and indexes were received + QCOMPARE(resultTargetIndexes.count(), expectedDisplacedIndexes.count()); + for (int i=0; i<resultTargetIndexes.count(); i++) + QCOMPARE(resultTargetIndexes[i].value<QList<int> >().count(), change.count); + QCOMPARE(resultTargetItems.count(), expectedDisplacedIndexes.count()); + for (int i=0; i<resultTargetItems.count(); i++) + QCOMPARE(resultTargetItems[i].toList().count(), change.count); + } else { + QCOMPARE(resultTargetIndexes.count(), 0); + QCOMPARE(resultTargetItems.count(), 0); } if (change.type == ListChange::Inserted && useAddDisplaced && addDisplacedEnabled) @@ -5779,8 +5801,6 @@ void tst_QQuickListView::displacedTransitions_data() void tst_QQuickListView::multipleTransitions() { - QSKIP("QTBUG-24523"); - // Tests that if you interrupt a transition in progress with another action that // cancels the previous transition, the resulting items are still placed correctly. @@ -5829,17 +5849,15 @@ void tst_QQuickListView::multipleTransitions() int timeBetweenActions = canvas->rootObject()->property("timeBetweenActions").toInt(); - QList<QPair<QString, QString> > targetItems; for (int i=0; i<changes.count(); i++) { switch (changes[i].type) { case ListChange::Inserted: { + QList<QPair<QString, QString> > targetItems; for (int j=changes[i].index; j<changes[i].index + changes[i].count; ++j) targetItems << qMakePair(QString("new item %1").arg(j), QString::number(j)); model.insertItems(changes[i].index, targetItems); QTRY_COMPARE(model.count(), listview->count()); - QTRY_VERIFY(listview->property("runningAddTargets").toBool()); - QTRY_VERIFY(listview->property("runningAddDisplaced").toBool()); if (i == changes.count() - 1) { QTRY_VERIFY(!listview->property("runningAddTargets").toBool()); QTRY_VERIFY(!listview->property("runningAddDisplaced").toBool()); @@ -5849,12 +5867,8 @@ void tst_QQuickListView::multipleTransitions() break; } case ListChange::Removed: - for (int j=changes[i].index; j<changes[i].index + changes[i].count; ++j) - targetItems << qMakePair(model.name(i), model.number(i)); model.removeItems(changes[i].index, changes[i].count); QTRY_COMPARE(model.count(), listview->count()); - QTRY_VERIFY(listview->property("runningRemoveTargets").toBool()); - QTRY_VERIFY(listview->property("runningRemoveDisplaced").toBool()); if (i == changes.count() - 1) { QTRY_VERIFY(!listview->property("runningRemoveTargets").toBool()); QTRY_VERIFY(!listview->property("runningRemoveDisplaced").toBool()); @@ -5863,11 +5877,8 @@ void tst_QQuickListView::multipleTransitions() } break; case ListChange::Moved: - for (int j=changes[i].index; j<changes[i].index + changes[i].count; ++j) - targetItems << qMakePair(model.name(i), model.number(i)); model.moveItems(changes[i].index, changes[i].to, changes[i].count); - QTRY_VERIFY(listview->property("runningMoveTargets").toBool()); - QTRY_VERIFY(listview->property("runningMoveDisplaced").toBool()); + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); if (i == changes.count() - 1) { QTRY_VERIFY(!listview->property("runningMoveTargets").toBool()); QTRY_VERIFY(!listview->property("runningMoveDisplaced").toBool()); @@ -5990,6 +6001,38 @@ void tst_QQuickListView::matchItemLists(const QVariantList &itemLists, const QLi } } +void tst_QQuickListView::flickBeyondBounds() +{ + QQuickView *canvas = createView(); + + canvas->setSource(testFileUrl("flickBeyondBoundsBug.qml")); + canvas->show(); + qApp->processEvents(); + + QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QQuickItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + + // Flick view up beyond bounds + flick(canvas, QPoint(10, 10), QPoint(10, -1000), 180); + QTRY_VERIFY(findItems<QQuickItem>(contentItem, "wrapper").count() == 0); + + // We're really testing that we don't get stuck in a loop, + // but also confirm items positioned correctly. + QTRY_COMPARE(findItems<QQuickItem>(contentItem, "wrapper").count(), 2); + for (int i = 0; i < 2; ++i) { + QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*45); + } + + delete canvas; +} + QTEST_MAIN(tst_QQuickListView) |