diff options
Diffstat (limited to 'tests/auto/quick/qquicklistview/tst_qquicklistview.cpp')
-rw-r--r-- | tests/auto/quick/qquicklistview/tst_qquicklistview.cpp | 259 |
1 files changed, 212 insertions, 47 deletions
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index c93aac456d..472ffdc4b6 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -179,6 +179,7 @@ private slots: void creationContext(); void snapToItem_data(); void snapToItem(); + void snapOneItemResize_QTBUG_43555(); void snapOneItem_data(); void snapOneItem(); @@ -241,6 +242,10 @@ private slots: void QTBUG_39492(); void jsArrayChange(); + void objectModel(); + + void contentHeightWithDelayRemove(); + void contentHeightWithDelayRemove_data(); private: template <class T> void items(const QUrl &source); @@ -391,7 +396,7 @@ void tst_QQuickListView::items(const QUrl &source) QTRY_VERIFY(contentItem != 0); QMetaObject::invokeMethod(window->rootObject(), "checkProperties"); - QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(!testObject->error()); QTRY_VERIFY(listview->highlightItem() != 0); QTRY_COMPARE(listview->count(), model.count()); @@ -414,20 +419,20 @@ void tst_QQuickListView::items(const QUrl &source) // switch to other delegate testObject->setAnimate(true); QMetaObject::invokeMethod(window->rootObject(), "checkProperties"); - QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(!testObject->error()); QTRY_VERIFY(listview->currentItem()); // set invalid highlight testObject->setInvalidHighlight(true); QMetaObject::invokeMethod(window->rootObject(), "checkProperties"); - QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(!testObject->error()); QTRY_VERIFY(listview->currentItem()); - QTRY_VERIFY(listview->highlightItem() == 0); + QTRY_VERIFY(!listview->highlightItem()); // back to normal highlight testObject->setInvalidHighlight(false); QMetaObject::invokeMethod(window->rootObject(), "checkProperties"); - QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(!testObject->error()); QTRY_VERIFY(listview->currentItem()); QTRY_VERIFY(listview->highlightItem() != 0); @@ -439,7 +444,7 @@ void tst_QQuickListView::items(const QUrl &source) listview->forceLayout(); int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); - QTRY_VERIFY(itemCount == 0); + QTRY_COMPARE(itemCount, 0); QTRY_COMPARE(listview->highlightResizeVelocity(), 1000.0); QTRY_COMPARE(listview->highlightMoveVelocity(), 100000.0); @@ -563,7 +568,7 @@ void tst_QQuickListView::inserted(const QUrl &source) // Insert item outside visible area model.insertItem(1, "Hello", "1324"); - QTRY_VERIFY(listview->contentY() == 80); + QTRY_COMPARE(listview->contentY(), qreal(80)); // Confirm items positioned correctly for (int i = 5; i < 5+15; ++i) { @@ -583,7 +588,7 @@ void tst_QQuickListView::inserted(const QUrl &source) QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", 0); QVERIFY(item); QCOMPARE(item->y(), 0.); - QTRY_VERIFY(listview->contentY() == 0); + QTRY_COMPARE(listview->contentY(), qreal(0)); delete window; delete testObject; @@ -916,7 +921,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*20); + QTRY_COMPARE(item->y(), qreal(i*20)); } // Remove first item (which is the current item); @@ -968,7 +973,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) } // Remove current index - QTRY_VERIFY(listview->currentIndex() == 9); + QTRY_COMPARE(listview->currentIndex(), 9); QQuickItem *oldCurrent = listview->currentItem(); model.removeItem(9); @@ -1004,7 +1009,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) model.removeItem(6); QTRY_COMPARE(listview->currentIndex(), 7); - QTRY_VERIFY(listview->currentItem() == oldCurrent); + QTRY_COMPARE(listview->currentItem(), oldCurrent); listview->setContentY(80); QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); @@ -1272,22 +1277,22 @@ void tst_QQuickListView::clear(const QUrl &source, QQuickItemView::VerticalLayou model.clear(); QTRY_COMPARE(findItems<QQuickListView>(contentItem, "wrapper").count(), 0); - QTRY_VERIFY(listview->count() == 0); - QTRY_VERIFY(listview->currentItem() == 0); + QTRY_COMPARE(listview->count(), 0); + QTRY_VERIFY(!listview->currentItem()); if (verticalLayoutDirection == QQuickItemView::TopToBottom) QTRY_COMPARE(listview->contentY(), 0.0); else QTRY_COMPARE(listview->contentY(), -listview->height()); - QVERIFY(listview->currentIndex() == -1); + QCOMPARE(listview->currentIndex(), -1); QCOMPARE(listview->contentHeight(), 0.0); // confirm sanity when adding an item to cleared list model.addItem("New", "1"); listview->forceLayout(); - QTRY_VERIFY(listview->count() == 1); + QTRY_COMPARE(listview->count(), 1); QVERIFY(listview->currentItem() != 0); - QVERIFY(listview->currentIndex() == 0); + QCOMPARE(listview->currentIndex(), 0); delete window; delete testObject; @@ -1805,7 +1810,7 @@ void tst_QQuickListView::swapWithFirstItem() // ensure content position is stable listview->setContentY(0); model.moveItem(1, 0); - QTRY_VERIFY(listview->contentY() == 0); + QTRY_COMPARE(listview->contentY(), qreal(0)); delete testObject; delete window; @@ -1943,11 +1948,11 @@ void tst_QQuickListView::spacing() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*20); + QTRY_COMPARE(item->y(), qreal(i*20)); } listview->setSpacing(10); - QTRY_VERIFY(listview->spacing() == 10); + QTRY_COMPARE(listview->spacing(), qreal(10)); // Confirm items positioned correctly QTRY_VERIFY(findItems<QQuickItem>(contentItem, "wrapper").count() == 11); @@ -1955,7 +1960,7 @@ void tst_QQuickListView::spacing() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*30); + QTRY_COMPARE(item->y(), qreal(i*30)); } listview->setSpacing(0); @@ -2261,7 +2266,7 @@ void tst_QQuickListView::sectionsDelegate_headerVisibility() listview->setCurrentIndex(20); QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); QTRY_VERIFY(qFuzzyCompare(listview->contentY(), 200.0)); - QTRY_VERIFY(listview->isMoving() == false); + QTRY_VERIFY(!listview->isMoving()); listview->setCurrentIndex(0); QTRY_VERIFY(qFuzzyIsNull(listview->contentY())); @@ -2682,7 +2687,7 @@ void tst_QQuickListView::currentIndex() listview->setCurrentIndex(20); QTRY_VERIFY(listview->verticalVelocity() != 0.0); listview->setCurrentIndex(0); - QTRY_VERIFY(listview->verticalVelocity() == 0.0); + QTRY_COMPARE(listview->verticalVelocity(), 0.0); // footer should become visible if it is out of view, and then current index is set to count-1 window->rootObject()->setProperty("showFooter", true); @@ -2704,7 +2709,7 @@ void tst_QQuickListView::currentIndex() // turn off auto highlight listview->setHighlightFollowsCurrentItem(false); - QVERIFY(listview->highlightFollowsCurrentItem() == false); + QVERIFY(!listview->highlightFollowsCurrentItem()); QVERIFY(listview->highlightItem()); qreal hlPos = listview->highlightItem()->y(); @@ -2808,7 +2813,7 @@ void tst_QQuickListView::keyNavigation() window->requestActivate(); QTest::qWaitForWindowActive(window); - QTRY_VERIFY(qGuiApp->focusWindow() == window); + QTRY_COMPARE(qGuiApp->focusWindow(), window); QTest::keyClick(window, forwardsKey); QCOMPARE(listview->currentIndex(), 1); @@ -2917,7 +2922,7 @@ void tst_QQuickListView::itemList() QQmlObjectModel *model = window->rootObject()->findChild<QQmlObjectModel*>("itemModel"); QTRY_VERIFY(model != 0); - QTRY_VERIFY(model->count() == 3); + QTRY_COMPARE(model->count(), 3); QTRY_COMPARE(listview->currentIndex(), 0); QQuickItem *item = findItem<QQuickItem>(contentItem, "item1"); @@ -2958,7 +2963,7 @@ void tst_QQuickListView::itemListFlicker() QQmlObjectModel *model = window->rootObject()->findChild<QQmlObjectModel*>("itemModel"); QTRY_VERIFY(model != 0); - QTRY_VERIFY(model->count() == 3); + QTRY_COMPARE(model->count(), 3); QTRY_COMPARE(listview->currentIndex(), 0); QQuickItem *item; @@ -3024,14 +3029,14 @@ void tst_QQuickListView::cacheBuffer() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*20); + QTRY_COMPARE(item->y(), qreal(i*20)); } QQmlIncubationController controller; window->engine()->setIncubationController(&controller); testObject->setCacheBuffer(200); - QTRY_VERIFY(listview->cacheBuffer() == 200); + QTRY_COMPARE(listview->cacheBuffer(), 200); // items will be created one at a time for (int i = itemCount; i < qMin(itemCount+10,model.count()); ++i) { @@ -3057,7 +3062,7 @@ void tst_QQuickListView::cacheBuffer() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*20); + QTRY_COMPARE(item->y(), qreal(i*20)); } // move view and confirm items in view are visible immediately and outside are created async @@ -3067,7 +3072,7 @@ void tst_QQuickListView::cacheBuffer() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QVERIFY(item); - QVERIFY(item->y() == i*20); + QCOMPARE(item->y(), qreal(i*20)); } QVERIFY(findItem<QQuickItem>(listview, "wrapper", 32) == 0); @@ -3528,7 +3533,7 @@ void tst_QQuickListView::QTBUG_11105() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*20); + QTRY_COMPARE(item->y(), qreal(i*20)); } listview->positionViewAtIndex(20, QQuickListView::Beginning); @@ -3622,7 +3627,7 @@ void tst_QQuickListView::header() QQuickText *header = 0; QTRY_VERIFY(header = findItem<QQuickText>(contentItem, "header")); - QVERIFY(header == listview->headerItem()); + QCOMPARE(header, listview->headerItem()); QCOMPARE(header->width(), 100.); QCOMPARE(header->height(), 30.); @@ -3660,7 +3665,7 @@ void tst_QQuickListView::header() header = findItem<QQuickText>(contentItem, "header2"); QVERIFY(header); - QVERIFY(header == listview->headerItem()); + QCOMPARE(header, listview->headerItem()); QCOMPARE(header->position(), changedHeaderPos); QCOMPARE(header->width(), 50.); @@ -3811,7 +3816,7 @@ void tst_QQuickListView::headerChangesViewport() QQuickText *header = 0; QTRY_VERIFY(header = findItem<QQuickText>(contentItem, "header")); - QVERIFY(header == listview->headerItem()); + QCOMPARE(header, listview->headerItem()); QCOMPARE(header->height(), 20.); QCOMPARE(listview->contentHeight(), 20.); @@ -3862,7 +3867,7 @@ void tst_QQuickListView::footer() QQuickText *footer = findItem<QQuickText>(contentItem, "footer"); QVERIFY(footer); - QVERIFY(footer == listview->footerItem()); + QCOMPARE(footer, listview->footerItem()); QCOMPARE(footer->position(), initialFooterPos); QCOMPARE(footer->width(), 100.); @@ -3922,7 +3927,7 @@ void tst_QQuickListView::footer() footer = findItem<QQuickText>(contentItem, "footer2"); QVERIFY(footer); - QVERIFY(footer == listview->footerItem()); + QCOMPARE(footer, listview->footerItem()); QCOMPARE(footer->position(), changedFooterPos); QCOMPARE(footer->width(), 50.); @@ -4155,11 +4160,11 @@ void tst_QQuickListView::resetModel_headerFooter() // A reset should not force a new header or footer to be created. QQuickItem *newHeader = findItem<QQuickItem>(contentItem, "header"); - QVERIFY(newHeader == header); + QCOMPARE(newHeader, header); QCOMPARE(header->y(), -header->height()); QQuickItem *newFooter = findItem<QQuickItem>(contentItem, "footer"); - QVERIFY(newFooter == footer); + QCOMPARE(newFooter, footer); QCOMPARE(footer->y(), 30.*4); delete window; @@ -4664,7 +4669,7 @@ void tst_QQuickListView::indexAt_itemAt() QVERIFY(item); } QCOMPARE(listview->indexAt(x,y), index); - QVERIFY(listview->itemAt(x,y) == item); + QCOMPARE(listview->itemAt(x,y), item); releaseView(window); delete testObject; @@ -4828,7 +4833,7 @@ void tst_QQuickListView::rightToLeft() QQmlObjectModel *model = window->rootObject()->findChild<QQmlObjectModel*>("itemModel"); QTRY_VERIFY(model != 0); - QTRY_VERIFY(model->count() == 3); + QTRY_COMPARE(model->count(), 3); QTRY_COMPARE(listview->currentIndex(), 0); // initial position at first item, right edge aligned @@ -4893,7 +4898,7 @@ void tst_QQuickListView::test_mirroring() foreach (const QString objectName, objectNames) QCOMPARE(findItem<QQuickItem>(listviewA, objectName)->x(), findItem<QQuickItem>(listviewB, objectName)->x()); - QVERIFY(listviewB->layoutDirection() == listviewB->effectiveLayoutDirection()); + QCOMPARE(listviewB->layoutDirection(), listviewB->effectiveLayoutDirection()); QQuickItemPrivate::get(listviewB)->setLayoutMirror(true); QVERIFY(listviewB->layoutDirection() != listviewB->effectiveLayoutDirection()); @@ -5034,7 +5039,7 @@ void tst_QQuickListView::marginsResize() // flick past the end and check content pos still settles on correct extents flick(window, flickStart, flickEnd, 180); - QTRY_VERIFY(listview->isMoving() == false); + QTRY_VERIFY(!listview->isMoving()); if (orientation == QQuickListView::Vertical) QTRY_COMPARE(listview->contentY(), end); else @@ -5049,7 +5054,7 @@ void tst_QQuickListView::marginsResize() // flick past the beginning and check content pos still settles on correct extents flick(window, flickEnd, flickStart, 180); - QTRY_VERIFY(listview->isMoving() == false); + QTRY_VERIFY(!listview->isMoving()); if (orientation == QQuickListView::Vertical) QTRY_COMPARE(listview->contentY(), start); else @@ -5199,6 +5204,37 @@ void tst_QQuickListView::snapToItem() releaseView(window); } +void tst_QQuickListView::snapOneItemResize_QTBUG_43555() +{ + QQuickView *window = createView(); + window->resize(QSize(100, 320)); + window->setResizeMode(QQuickView::SizeRootObjectToView); + QQuickViewTestUtil::moveMouseAway(window); + + window->setSource(testFileUrl("snapOneItemResize.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickListView *listview = qobject_cast<QQuickListView*>(window->rootObject()); + QTRY_VERIFY(listview != 0); + + QSignalSpy currentIndexSpy(listview, SIGNAL(currentIndexChanged())); + + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QTRY_COMPARE(listview->currentIndex(), 5); + currentIndexSpy.clear(); + + window->resize(QSize(400, 320)); + + QTRY_COMPARE(int(listview->width()), 400); + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + + QTRY_COMPARE(listview->currentIndex(), 5); + QCOMPARE(currentIndexSpy.count(), 0); + + delete window; +} + void tst_QQuickListView::qAbstractItemModel_package_items() { items<QaimModel>(testFileUrl("listviewtest-package.qml")); @@ -7006,7 +7042,7 @@ void tst_QQuickListView::matchIndexLists(const QVariantList &indexLists, const Q void tst_QQuickListView::matchItemsAndIndexes(const QVariantMap &items, const QaimModel &model, const QList<int> &expectedIndexes) { for (QVariantMap::const_iterator it = items.begin(); it != items.end(); ++it) { - QVERIFY(it.value().type() == QVariant::Int); + QCOMPARE(it.value().type(), QVariant::Int); QString name = it.key(); int itemIndex = it.value().toInt(); QVERIFY2(expectedIndexes.contains(itemIndex), QTest::toString(QString("Index %1 not found in expectedIndexes").arg(itemIndex))); @@ -7020,7 +7056,7 @@ void tst_QQuickListView::matchItemsAndIndexes(const QVariantMap &items, const Qa void tst_QQuickListView::matchItemLists(const QVariantList &itemLists, const QList<QQuickItem *> &expectedItems) { for (int i=0; i<itemLists.count(); i++) { - QVERIFY(itemLists[i].type() == QVariant::List); + QCOMPARE(itemLists[i].type(), QVariant::List); QVariantList current = itemLists[i].toList(); for (int j=0; j<current.count(); j++) { QQuickItem *o = qobject_cast<QQuickItem*>(current[j].value<QObject*>()); @@ -7062,7 +7098,7 @@ void tst_QQuickListView::flickBeyondBounds() QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); if (!item) qWarning() << "Item" << i << "not found"; QTRY_VERIFY(item); - QTRY_VERIFY(item->y() == i*45); + QTRY_COMPARE(item->y(), qreal(i*45)); } delete window; @@ -7856,7 +7892,7 @@ void tst_QQuickListView::QTBUG_38209() // simulate mouse flick flick(window.data(), QPoint(200, 200), QPoint(200, 50), 100); - QTRY_VERIFY(listview->isMoving() == false); + QTRY_VERIFY(!listview->isMoving()); qreal contentY = listview->contentY(); // flick down @@ -8063,6 +8099,135 @@ void tst_QQuickListView::jsArrayChange() QCOMPARE(spy.count(), 1); } +static bool compareObjectModel(QQuickListView *listview, QQmlObjectModel *model) +{ + if (listview->count() != model->count()) + return false; + for (int i = 0; i < listview->count(); ++i) { + listview->setCurrentIndex(i); + if (listview->currentItem() != model->get(i)) + return false; + } + return true; +} + +void tst_QQuickListView::objectModel() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("objectmodel.qml")); + + QQuickListView *listview = qobject_cast<QQuickListView *>(component.create()); + QVERIFY(listview); + + QQmlObjectModel *model = listview->model().value<QQmlObjectModel *>(); + QVERIFY(model); + + listview->setCurrentIndex(0); + QVERIFY(listview->currentItem()); + QCOMPARE(listview->currentItem()->property("color").toString(), QColor("red").name()); + + listview->setCurrentIndex(1); + QVERIFY(listview->currentItem()); + QCOMPARE(listview->currentItem()->property("color").toString(), QColor("green").name()); + + listview->setCurrentIndex(2); + QVERIFY(listview->currentItem()); + QCOMPARE(listview->currentItem()->property("color").toString(), QColor("blue").name()); + + QQuickItem *item0 = new QQuickItem(listview); + item0->setSize(QSizeF(20, 20)); + model->append(item0); + QCOMPARE(model->count(), 4); + QVERIFY(compareObjectModel(listview, model)); + + QQuickItem *item1 = new QQuickItem(listview); + item1->setSize(QSizeF(20, 20)); + model->insert(0, item1); + QCOMPARE(model->count(), 5); + QVERIFY(compareObjectModel(listview, model)); + + model->move(1, 2, 3); + QVERIFY(compareObjectModel(listview, model)); + + model->remove(2, 2); + QCOMPARE(model->count(), 3); + QVERIFY(compareObjectModel(listview, model)); + + model->clear(); + QCOMPARE(model->count(), 0); + QCOMPARE(listview->count(), 0); + + delete listview; +} + +void tst_QQuickListView::contentHeightWithDelayRemove_data() +{ + QTest::addColumn<bool>("useDelayRemove"); + QTest::addColumn<QByteArray>("removeFunc"); + QTest::addColumn<int>("countDelta"); + QTest::addColumn<qreal>("contentHeightDelta"); + + QTest::newRow("remove without delayRemove") + << false + << QByteArray("takeOne") + << -1 + << qreal(-1 * 100.0); + + QTest::newRow("remove with delayRemove") + << true + << QByteArray("takeOne") + << -1 + << qreal(-1 * 100.0); + + QTest::newRow("remove with multiple delayRemove") + << true + << QByteArray("takeThree") + << -3 + << qreal(-3 * 100.0); + + QTest::newRow("clear with delayRemove") + << true + << QByteArray("takeAll") + << -5 + << qreal(-5 * 100.0); +} + +void tst_QQuickListView::contentHeightWithDelayRemove() +{ + QFETCH(bool, useDelayRemove); + QFETCH(QByteArray, removeFunc); + QFETCH(int, countDelta); + QFETCH(qreal, contentHeightDelta); + + QQuickView *window = createView(); + window->setSource(testFileUrl("contentHeightWithDelayRemove.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickListView *listview = window->rootObject()->findChild<QQuickListView*>(); + QTRY_VERIFY(listview != 0); + + const int initialCount(listview->count()); + const int eventualCount(initialCount + countDelta); + + const qreal initialContentHeight(listview->contentHeight()); + const int eventualContentHeight(qRound(initialContentHeight + contentHeightDelta)); + + listview->setProperty("useDelayRemove", useDelayRemove); + QMetaObject::invokeMethod(window->rootObject(), removeFunc.constData()); + QTest::qWait(50); + QCOMPARE(listview->count(), eventualCount); + + if (useDelayRemove) { + QCOMPARE(qRound(listview->contentHeight()), qRound(initialContentHeight)); + QTRY_COMPARE(qRound(listview->contentHeight()), eventualContentHeight); + } else { + QCOMPARE(qRound(listview->contentHeight()), eventualContentHeight); + } + + delete window; +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" |