aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quick/qquickgridview/tst_qquickgridview.cpp')
-rw-r--r--tests/auto/quick/qquickgridview/tst_qquickgridview.cpp194
1 files changed, 150 insertions, 44 deletions
diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
index 9472407e01..3699bef56d 100644
--- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
+++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp
@@ -206,6 +206,11 @@ private slots:
void jsArrayChange();
+ void contentHeightWithDelayRemove_data();
+ void contentHeightWithDelayRemove();
+
+ void QTBUG_45640();
+
private:
QList<int> toIntList(const QVariantList &list);
void matchIndexLists(const QVariantList &indexLists, const QList<int> &expectedIndexes);
@@ -373,7 +378,7 @@ void tst_QQuickGridView::items()
ctxt->setContextProperty("testModel", &model2);
int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count();
- QTRY_VERIFY(itemCount == 0);
+ QTRY_COMPARE(itemCount, 0);
delete window;
}
@@ -473,8 +478,8 @@ void tst_QQuickGridView::inserted_basic()
// Confirm items positioned correctly
for (int i = 0; i < model.count(); ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
for (int i = model.count(); i < 30; ++i)
@@ -485,7 +490,7 @@ void tst_QQuickGridView::inserted_basic()
// Insert item outside visible area
model.insertItem(1, "Hello", "1324");
- QTRY_VERIFY(gridview->contentY() == 120);
+ QTRY_COMPARE(gridview->contentY(), qreal(120));
delete window;
}
@@ -815,8 +820,8 @@ void tst_QQuickGridView::removed_basic()
for (int i = 0; i < model.count() && i < itemCount; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
if (!item) qWarning() << "Item" << i << "not found";
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
// Remove first item (which is the current item);
@@ -836,8 +841,8 @@ void tst_QQuickGridView::removed_basic()
for (int i = 0; i < model.count() && i < itemCount; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
if (!item) qWarning() << "Item" << i << "not found";
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
// Remove items not visible
@@ -849,8 +854,8 @@ void tst_QQuickGridView::removed_basic()
for (int i = 0; i < model.count() && i < itemCount; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
if (!item) qWarning() << "Item" << i << "not found";
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
// Remove items before visible
@@ -867,8 +872,8 @@ void tst_QQuickGridView::removed_basic()
for (int i = 6; i < 18; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
if (!item) qWarning() << "Item" << i << "not found";
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
// Remove currentIndex
@@ -886,8 +891,8 @@ void tst_QQuickGridView::removed_basic()
itemCount = findItems<QQuickItem>(contentItem, "wrapper").count();
for (int i = 0; i < model.count() && i < itemCount; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
- QTRY_VERIFY(item->x() == (i%3)*80);
- QTRY_VERIFY(item->y() == (i/3)*60);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
+ QTRY_COMPARE(item->y(), qreal((i/3)*60));
}
// remove item outside current view.
@@ -895,7 +900,7 @@ void tst_QQuickGridView::removed_basic()
gridview->setContentY(240);
model.removeItem(30);
- QTRY_VERIFY(gridview->currentIndex() == 31);
+ QTRY_COMPARE(gridview->currentIndex(), 31);
// remove current item beyond visible items.
gridview->setCurrentIndex(20);
@@ -912,7 +917,7 @@ void tst_QQuickGridView::removed_basic()
model.removeItem(6);
QTRY_COMPARE(gridview->currentIndex(), 7);
- QTRY_VERIFY(gridview->currentItem() == oldCurrent);
+ QTRY_COMPARE(gridview->currentItem(), oldCurrent);
delete window;
}
@@ -1211,7 +1216,7 @@ void tst_QQuickGridView::addOrRemoveBeforeVisible()
for (int i = 0; i < model.count() && i < itemCount; ++i) {
QTRY_VERIFY(findItem<QQuickItem>(contentItem, "wrapper", i));
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
- QTRY_VERIFY(item->x() == (i%3)*80);
+ QTRY_COMPARE(item->x(), qreal((i%3)*80));
QTRY_VERIFY(item->y() == (i/3)*60 + newTopContentY);
}
@@ -1249,10 +1254,10 @@ void tst_QQuickGridView::clear()
model.clear();
gridview->forceLayout();
- QVERIFY(gridview->count() == 0);
- QVERIFY(gridview->currentItem() == 0);
- QVERIFY(gridview->contentY() == 0);
- QVERIFY(gridview->currentIndex() == -1);
+ QCOMPARE(gridview->count(), 0);
+ QVERIFY(!gridview->currentItem());
+ QCOMPARE(gridview->contentY(), qreal(0));
+ QCOMPARE(gridview->currentIndex(), -1);
QCOMPARE(gridview->contentHeight(), 0.0);
// confirm sanity when adding an item to cleared list
@@ -1260,7 +1265,7 @@ void tst_QQuickGridView::clear()
gridview->forceLayout();
QTRY_COMPARE(gridview->count(), 1);
QVERIFY(gridview->currentItem() != 0);
- QVERIFY(gridview->currentIndex() == 0);
+ QCOMPARE(gridview->currentIndex(), 0);
delete window;
}
@@ -1799,7 +1804,7 @@ void tst_QQuickGridView::swapWithFirstItem()
// ensure content position is stable
gridview->setContentY(0);
model.moveItem(10, 0);
- QTRY_VERIFY(gridview->contentY() == 0);
+ QTRY_COMPARE(gridview->contentY(), qreal(0));
delete window;
}
@@ -1849,7 +1854,7 @@ void tst_QQuickGridView::currentIndex()
gridview->setCurrentIndex(35);
QTRY_VERIFY(gridview->verticalVelocity() != 0.0);
gridview->setCurrentIndex(0);
- QTRY_VERIFY(gridview->verticalVelocity() == 0.0);
+ QTRY_COMPARE(gridview->verticalVelocity(), 0.0);
// footer should become visible if it is out of view, and then current index moves to the first row
window->rootObject()->setProperty("showFooter", true);
@@ -1871,7 +1876,7 @@ void tst_QQuickGridView::currentIndex()
// turn off auto highlight
gridview->setHighlightFollowsCurrentItem(false);
- QVERIFY(gridview->highlightFollowsCurrentItem() == false);
+ QVERIFY(!gridview->highlightFollowsCurrentItem());
QVERIFY(gridview->highlightItem());
qreal hlPosX = gridview->highlightItem()->x();
qreal hlPosY = gridview->highlightItem()->y();
@@ -1881,9 +1886,12 @@ void tst_QQuickGridView::currentIndex()
QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY);
// insert item before currentIndex
+ window->rootObject()->setProperty("currentItemChangedCount", QVariant(0));
gridview->setCurrentIndex(28);
+ QTRY_COMPARE(window->rootObject()->property("currentItemChangedCount").toInt(), 1);
model.insertItem(0, "Foo", "1111");
QTRY_COMPARE(window->rootObject()->property("current").toInt(), 29);
+ QCOMPARE(window->rootObject()->property("currentItemChangedCount").toInt(), 1);
// check removing highlight by setting currentIndex to -1;
gridview->setCurrentIndex(-1);
@@ -1971,7 +1979,7 @@ void tst_QQuickGridView::keyNavigation()
window->requestActivate();
QTest::qWaitForWindowActive(window);
- QTRY_VERIFY(qGuiApp->focusWindow() == window);
+ QTRY_COMPARE(qGuiApp->focusWindow(), window);
QCOMPARE(gridview->currentIndex(), 0);
QTest::keyClick(window, forwardsKey);
@@ -2256,15 +2264,15 @@ void tst_QQuickGridView::defaultValues()
QQuickGridView *obj = qobject_cast<QQuickGridView*>(c.create());
QTRY_VERIFY(obj != 0);
- QTRY_VERIFY(obj->model() == QVariant());
- QTRY_VERIFY(obj->delegate() == 0);
+ QTRY_COMPARE(obj->model(), QVariant());
+ QTRY_VERIFY(!obj->delegate());
QTRY_COMPARE(obj->currentIndex(), -1);
- QTRY_VERIFY(obj->currentItem() == 0);
+ QTRY_VERIFY(!obj->currentItem());
QTRY_COMPARE(obj->count(), 0);
- QTRY_VERIFY(obj->highlight() == 0);
- QTRY_VERIFY(obj->highlightItem() == 0);
+ QTRY_VERIFY(!obj->highlight());
+ QTRY_VERIFY(!obj->highlightItem());
QTRY_COMPARE(obj->highlightFollowsCurrentItem(), true);
- QTRY_VERIFY(obj->flow() == 0);
+ QTRY_COMPARE(obj->flow(), QQuickGridView::FlowLeftToRight);
QTRY_COMPARE(obj->isWrapEnabled(), false);
#ifdef QML_VIEW_DEFAULTCACHEBUFFER
QTRY_COMPARE(obj->cacheBuffer(), QML_VIEW_DEFAULTCACHEBUFFER);
@@ -2291,7 +2299,7 @@ void tst_QQuickGridView::properties()
QTRY_VERIFY(obj->highlight() != 0);
QTRY_VERIFY(obj->highlightItem() != 0);
QTRY_COMPARE(obj->highlightFollowsCurrentItem(), false);
- QTRY_VERIFY(obj->flow() == 0);
+ QTRY_COMPARE(obj->flow(), QQuickGridView::FlowLeftToRight);
QTRY_COMPARE(obj->isWrapEnabled(), true);
QTRY_COMPARE(obj->cacheBuffer(), 200);
QTRY_COMPARE(obj->cellWidth(), qreal(100));
@@ -2728,7 +2736,7 @@ void tst_QQuickGridView::mirroring()
foreach (const QString objectName, objectNames)
QCOMPARE(findItem<QQuickItem>(gridviewA, objectName)->x(), findItem<QQuickItem>(gridviewB, objectName)->x());
- QVERIFY(gridviewB->layoutDirection() == gridviewB->effectiveLayoutDirection());
+ QCOMPARE(gridviewB->layoutDirection(), gridviewB->effectiveLayoutDirection());
QQuickItemPrivate::get(gridviewB)->setLayoutMirror(true);
QVERIFY(gridviewB->layoutDirection() != gridviewB->effectiveLayoutDirection());
@@ -3016,7 +3024,7 @@ void tst_QQuickGridView::footer()
QQuickText *footer = findItem<QQuickText>(contentItem, "footer");
QVERIFY(footer);
- QVERIFY(footer == gridview->footerItem());
+ QCOMPARE(footer, gridview->footerItem());
QCOMPARE(footer->position(), initialFooterPos);
QCOMPARE(footer->width(), 100.);
@@ -3082,7 +3090,7 @@ void tst_QQuickGridView::footer()
QVERIFY(!footer);
footer = findItem<QQuickText>(contentItem, "footer2");
QVERIFY(footer);
- QVERIFY(footer == gridview->footerItem());
+ QCOMPARE(footer, gridview->footerItem());
QCOMPARE(footer->position(), changedFooterPos);
QCOMPARE(footer->width(), 50.);
@@ -3265,7 +3273,7 @@ void tst_QQuickGridView::header()
QQuickText *header = findItem<QQuickText>(contentItem, "header");
QVERIFY(header);
- QVERIFY(header == gridview->headerItem());
+ QCOMPARE(header, gridview->headerItem());
QCOMPARE(header->position(), initialHeaderPos);
QCOMPARE(header->width(), 100.);
@@ -3302,7 +3310,7 @@ void tst_QQuickGridView::header()
header = findItem<QQuickText>(contentItem, "header2");
QVERIFY(header);
- QVERIFY(header == gridview->headerItem());
+ QCOMPARE(header, gridview->headerItem());
QCOMPARE(header->position(), changedHeaderPos);
QCOMPARE(header->width(), 50.);
@@ -3609,11 +3617,11 @@ void tst_QQuickGridView::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(), 60.*2);
delete window;
@@ -4315,8 +4323,19 @@ void tst_QQuickGridView::snapToRow()
QQuickItem *contentItem = gridview->contentItem();
QTRY_VERIFY(contentItem != 0);
+ qreal origContentY = gridview->contentY();
+ qreal origContentX = gridview->contentX();
// confirm that a flick hits an item boundary
flick(window, flickStart, flickEnd, 180);
+
+ // wait until it's at least one cell further
+ QTRY_VERIFY(qAbs(gridview->contentX() - origContentX) > 80 ||
+ qAbs(gridview->contentY() - origContentY) > 80);
+
+ // click to stop it. Otherwise we wouldn't know how much further it will go. We don't want to it
+ // to hit the endExtent, yet.
+ QTest::mouseClick(window, Qt::LeftButton, 0, flickEnd);
+
QTRY_VERIFY(gridview->isMoving() == false); // wait until it stops
if (flow == QQuickGridView::FlowLeftToRight)
QCOMPARE(qreal(fmod(gridview->contentY(),80.0)), snapAlignment);
@@ -5810,7 +5829,7 @@ void tst_QQuickGridView::cacheBuffer()
window->engine()->setIncubationController(&controller);
window->rootObject()->setProperty("cacheBuffer", 200);
- QTRY_VERIFY(gridview->cacheBuffer() == 200);
+ QTRY_COMPARE(gridview->cacheBuffer(), 200);
// items will be created one at a time
for (int i = itemCount; i < qMin(itemCount+9,model.count()); ++i) {
@@ -5910,8 +5929,8 @@ void tst_QQuickGridView::asynchronous()
for (int i = 0; i < 12; ++i) {
QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i);
if (!item) qWarning() << "Item" << i << "not found";
- QVERIFY(item->x() == (i%3)*100);
- QVERIFY(item->y() == (i/3)*100);
+ QCOMPARE(item->x(), qreal((i%3)*100));
+ QCOMPARE(item->y(), qreal((i/3)*100));
}
delete window;
@@ -6329,7 +6348,7 @@ void tst_QQuickGridView::matchIndexLists(const QVariantList &indexLists, const Q
void tst_QQuickGridView::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)));
@@ -6460,6 +6479,93 @@ void tst_QQuickGridView::jsArrayChange()
QCOMPARE(spy.count(), 1);
}
+void tst_QQuickGridView::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(-2 * 100.0);
+
+ QTest::newRow("clear with delayRemove")
+ << true
+ << QByteArray("takeAll")
+ << -5
+ << qreal(-3 * 100.0);
+}
+
+void tst_QQuickGridView::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));
+
+ QQuickGridView *gridview = window->rootObject()->findChild<QQuickGridView*>();
+ QTRY_VERIFY(gridview != 0);
+
+ const int initialCount(gridview->count());
+ const int eventualCount(initialCount + countDelta);
+
+ const qreal initialContentHeight(gridview->contentHeight());
+ const int eventualContentHeight(qRound(initialContentHeight + contentHeightDelta));
+
+ gridview->setProperty("useDelayRemove", useDelayRemove);
+ QMetaObject::invokeMethod(window->rootObject(), removeFunc.constData());
+ QTest::qWait(50);
+ QCOMPARE(gridview->count(), eventualCount);
+
+ if (useDelayRemove) {
+ QCOMPARE(qRound(gridview->contentHeight()), qRound(initialContentHeight));
+ QTRY_COMPARE(qRound(gridview->contentHeight()), eventualContentHeight);
+ } else {
+ QCOMPARE(qRound(gridview->contentHeight()), eventualContentHeight);
+ }
+
+ delete window;
+}
+
+void tst_QQuickGridView::QTBUG_45640()
+{
+ QQuickView *window = createView();
+ window->setSource(testFileUrl("qtbug45640.qml"));
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QQuickGridView *gridview = qobject_cast<QQuickGridView*>(window->rootObject());
+ QVERIFY(gridview != 0);
+
+ QCOMPARE(gridview->contentY(), qreal(-50.0));
+
+ gridview->moveCurrentIndexDown();
+
+ QTRY_VERIFY(gridview->contentY() > qreal(-50.0) && gridview->contentY() < qreal(0.0));
+
+ delete window;
+}
+
QTEST_MAIN(tst_QQuickGridView)
#include "tst_qquickgridview.moc"