/* * Copyright (C) 2013 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "listviewwithpageheader.h" #include #include #include #include #include #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-pedantic" #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) #include #else #include #endif #include #include #pragma GCC diagnostic pop class ListViewWithPageHeaderTest : public QObject { Q_OBJECT private: void verifyItem(int visibleIndex, qreal pos, qreal height, bool culled) { ListViewWithPageHeader::ListItem *item = lvwph->m_visibleItems[visibleIndex]; QTRY_COMPARE(item->y(), pos); QTRY_COMPARE(item->height(), height); QCOMPARE(QQuickItemPrivate::get(item->m_item)->culled, culled); } void changeContentY(qreal change) { const qreal dest = lvwph->contentY() + change; if (dest > lvwph->contentY()) { const qreal jump = 25; while (lvwph->contentY() + jump < dest) { lvwph->setContentY(lvwph->contentY() + jump); QTest::qWait(1); } } else { const qreal jump = -25; while (lvwph->contentY() + jump > dest) { lvwph->setContentY(lvwph->contentY() + jump); QTest::qWait(1); } } lvwph->setContentY(dest); QTest::qWait(1); } void scrollToTop() { const qreal jump = -25; while (!lvwph->isAtYBeginning()) { if (lvwph->contentY() + jump > -lvwph->minYExtent()) { lvwph->setContentY(lvwph->contentY() + jump); } else { lvwph->setContentY(lvwph->contentY() - 1); } QTest::qWait(1); } } void scrollToBottom() { const qreal jump = 25; while (!lvwph->isAtYEnd()) { if (lvwph->contentY() + lvwph->height() + jump < lvwph->contentHeight()) { lvwph->setContentY(lvwph->contentY() + jump); } else { lvwph->setContentY(lvwph->contentY() + 1); } QTest::qWait(1); } } void verifyInitialTopPosition() { QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 200., false); verifyItem(2, 400., 350., false); verifyItem(3, 750., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } private Q_SLOTS: void initTestCase() { } void init() { view = new QQuickView(); view->engine()->addImportPath(BUILT_PLUGINS_DIR); view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertest.qml")); lvwph = dynamic_cast(view->rootObject()->findChild()); #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) model = view->rootObject()->findChild(); #else model = view->rootObject()->findChild(); #endif otherDelegate = view->rootObject()->findChild(); QVERIFY(lvwph); QVERIFY(model); QVERIFY(otherDelegate); view->show(); QTest::qWaitForWindowExposed(view); verifyInitialTopPosition(); } void cleanup() { delete view; } void testCreationDeletion() { // Nothing, init/cleanup already tests this } void testDrag1PixelUp() { lvwph->setContentY(lvwph->contentY() + 1); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 49., 150., false); verifyItem(1, 199., 200., false); verifyItem(2, 399., 350., false); verifyItem(3, 749., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 1.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testHeaderDetachDragDown() { QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 5)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 10)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 15)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 20)); QTest::qWait(100); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 55., 150., false); verifyItem(1, 205., 200., false); verifyItem(2, 405., 350., false); verifyItem(3, 755., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), -5.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -5.); QCOMPARE(lvwph->m_headerItem->height(), 55.); QCOMPARE(lvwph->contentY(), -5.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QTest::mouseRelease(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 15)); verifyInitialTopPosition(); } void testDrag375PixelUp() { changeContentY(375); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -325., 150., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testDrag520PixelUp() { changeContentY(520); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); // Just here as first check against m_minYExtent when m_firstVisibleIndex is not 0 // We as humans know that m_minYExtent will be 0 but since the first delegate is not there anymore // we have to estimate its size, the average item height is 312.5 which is 162.5 more than the // "real" size of 150 and that's why the m_minYExtent has that "peculiar" value // It's fine since what it means is that we could scroll more up than the original position // but we will recalculate m_minYExtent when the item 0 is created and set it correctly QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testDragHeaderUpThenShow() { changeContentY(120); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -70., 150., false); verifyItem(1, 80., 200., false); verifyItem(2, 280., 350., false); verifyItem(3, 630., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 120.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 120.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(-30); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -70., 150., false); verifyItem(1, 80., 200., false); verifyItem(2, 280., 350., false); verifyItem(3, 630., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 120.); QCOMPARE(lvwph->m_clipItem->clip(), true); QTRY_COMPARE(lvwph->m_headerItem->y(), 70.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 90.); QCOMPARE(lvwph->m_headerItemShownHeight, 30.); } void testDragHeaderUpThenShowWithoutHidingTotally() { changeContentY(10); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 40., 150., false); verifyItem(1, 190., 200., false); verifyItem(2, 390., 350., false); verifyItem(3, 740., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 10.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 10.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(-1); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 41., 150., false); verifyItem(1, 191., 200., false); verifyItem(2, 391., 350., false); verifyItem(3, 741., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 9.); QCOMPARE(lvwph->m_clipItem->clip(), false); QTRY_COMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 9.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testPositionAtBeginningIndex0Visible() { changeContentY(375); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -325., 150., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); lvwph->positionAtBeginning(); verifyInitialTopPosition(); } void testPositionAtBeginningIndex0NotVisible() { changeContentY(520); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); lvwph->positionAtBeginning(); verifyInitialTopPosition(); } void testIndex0GrowOnScreen() { model->setProperty(0, "size", 400); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 400., false); verifyItem(1, 450., 200., false); verifyItem(2, 650., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testIndex0GrowOffScreen() { changeContentY(375); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -325., 150., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); model->setProperty(0, "size", 400); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -575., 400., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 250.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 400., false); verifyItem(1, 450, 200., false); verifyItem(2, 650, 350., true); QCOMPARE(lvwph->m_minYExtent, 250.); QCOMPARE(lvwph->m_clipItem->y(), -250.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -250.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -250.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(30); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 20., 400., false); verifyItem(1, 420, 200., false); verifyItem(2, 620, 350., true); QCOMPARE(lvwph->m_minYExtent, 250.); QCOMPARE(lvwph->m_clipItem->y(), -220.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -250.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -220.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testIndex0GrowNotCreated() { changeContentY(520); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); model->setProperty(0, "size", 400); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 400., false); verifyItem(1, 450, 200., false); verifyItem(2, 650, 350., true); QCOMPARE(lvwph->m_minYExtent, 250.); QCOMPARE(lvwph->m_clipItem->y(), -250.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -250.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -250.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testShowHideShowHeaderAtBottom() { scrollToBottom(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(-30); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 1208.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1228.); QCOMPARE(lvwph->m_headerItemShownHeight, 30.); changeContentY(30); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -350.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(-30); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 1208.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1228.); QCOMPARE(lvwph->m_headerItemShownHeight, 30.); } void testChangeDelegateAtBottom() { scrollToBottom(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); lvwph->setDelegate(otherDelegate); QTRY_COMPARE(lvwph->m_visibleItems.count(), 6); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 35., false); verifyItem(1, 85, 35., false); verifyItem(2, 120, 35., false); verifyItem(3, 155, 35., false); verifyItem(4, 190, 35., false); verifyItem(5, 225, 35., false); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testSetEmptyHeaderAtTop() { lvwph->setHeader(nullptr); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 0., 150., false); verifyItem(1, 150., 200., false); verifyItem(2, 350., 350., false); verifyItem(3, 700., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testSetEmptyHeaderAtBottom() { scrollToBottom(); lvwph->setHeader(nullptr); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 300.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 0., 150., false); verifyItem(1, 150., 200., false); verifyItem(2, 350., 350., false); verifyItem(3, 700., 350., true); QCOMPARE(lvwph->m_minYExtent, -50.); QCOMPARE(lvwph->m_clipItem->y(), 50.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 50.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testSetEmptyHeaderWhenPartlyShownClipped() { scrollToBottom(); changeContentY(-30); lvwph->setHeader(nullptr); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 330.); QCOMPARE(lvwph->m_clipItem->y(), 1228.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 1228.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QTRY_VERIFY(lvwph->isAtYEnd()); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 0., 150., false); verifyItem(1, 150., 200., false); verifyItem(2, 350., 350., false); verifyItem(3, 700., 350., true); QCOMPARE(lvwph->m_minYExtent, -20.); QCOMPARE(lvwph->m_clipItem->y(), 20.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 20.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testSetEmptyHeaderWhenPartlyShownNotClipped() { changeContentY(30); lvwph->setHeader(nullptr); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -30., 150., false); verifyItem(1, 120., 200., false); verifyItem(2, 320., 350., false); verifyItem(3, 670., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 30.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr); QCOMPARE(lvwph->contentY(), 30.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testSetNullDelegate() { lvwph->setDelegate(nullptr); QTRY_COMPARE(lvwph->m_visibleItems.count(), 0); QCOMPARE(lvwph->m_firstVisibleIndex, -1); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QTRY_COMPARE(lvwph->contentHeight(), 50.); QVERIFY(lvwph->isAtYBeginning()); QVERIFY(lvwph->isAtYEnd()); } void testInsertItems() { QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 125., false); verifyItem(2, 325., 100., false); verifyItem(3, 425., 200., false); verifyItem(4, 625., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testInsertItemsOnNotShownPosition() { changeContentY(700); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QTRY_COMPARE(lvwph->m_firstVisibleIndex, 2); verifyItem(0, -300., 350., false); verifyItem(1, 50, 350., false); verifyItem(2, 400, 350., false); verifyItem(3, 750, 350., true); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 700.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 700.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 4); verifyItem(0, -300., 350., false); verifyItem(1, 50, 350., false); verifyItem(2, 400, 350., false); verifyItem(3, 750, 350., true); QCOMPARE(lvwph->m_minYExtent, 1050.); QCOMPARE(lvwph->m_clipItem->y(), 700.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 700.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 125., false); verifyItem(2, 325., 100., false); verifyItem(3, 425., 200., false); verifyItem(4, 625., 350., true); QCOMPARE(lvwph->m_minYExtent, 225.); QCOMPARE(lvwph->m_clipItem->y(), -225.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -225.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -225.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testInsertItemsAtEndOfViewport() { QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 200., false); verifyItem(2, 400., 350., false); verifyItem(3, 750., 125., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testInsertItemsBeforeValidIndex() { changeContentY(520); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 787.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testInsertItemsBeforeViewport() { changeContentY(375); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -325., 150., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 2); verifyItem(0, -275., 100., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 490.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 125., false); verifyItem(2, 325., 100., false); verifyItem(3, 425., 200., false); verifyItem(4, 625., 350., true); QCOMPARE(lvwph->m_minYExtent, 225.); QCOMPARE(lvwph->m_clipItem->y(), -225.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -225.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -225.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testInsertItemsAtBottom() { scrollToBottom(); QVERIFY(lvwph->isAtYEnd()); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); verifyItem(3, 542, 125., true); verifyItem(4, 667, 100., true); QCOMPARE(lvwph->m_minYExtent, 65.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(!lvwph->isAtYEnd()); scrollToBottom(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 4); verifyItem(0, -383., 350., true); verifyItem(1, -33, 350., false); verifyItem(2, 317, 125., false); verifyItem(3, 442, 100., false); QCOMPARE(lvwph->m_minYExtent, -125.); QCOMPARE(lvwph->m_clipItem->y(), 1483.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1483.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(lvwph->isAtYEnd()); } void testInsertItemAtTop() { QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 75., false); verifyItem(1, 125., 150., false); verifyItem(2, 275., 200., false); verifyItem(3, 475., 350., false); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(lvwph->isAtYBeginning()); } void testInsertItem10SmallItemsAtTopWhenAtBottom() { scrollToBottom(); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 13); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 3850.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); changeContentY(-1700); QTRY_COMPARE(lvwph->m_visibleItems.count(), 12); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -308., 75., true); verifyItem(1, -233., 75., true); verifyItem(2, -158., 75., true); verifyItem(3, -83., 75., true); verifyItem(4, -8., 75., false); verifyItem(5, 67., 75., false); verifyItem(6, 142., 75., false); verifyItem(7, 217., 75., false); verifyItem(8, 292., 75., false); verifyItem(9, 367., 75., false); verifyItem(10, 442., 150., false); verifyItem(11, 592., 200., true); QCOMPARE(lvwph->m_minYExtent, 750.); QCOMPARE(lvwph->m_clipItem->y(), -392.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), -442.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -442.); QCOMPARE(lvwph->m_headerItemShownHeight, 50.); } void testInsertToEmpty() { QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 6)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 0); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 125)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 125., false); verifyItem(1, 175., 100., false); } void testRemoveItemsAtTop() { QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 350., false); verifyItem(1, 400., 350., false); verifyItem(2, 750., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(lvwph->isAtYBeginning()); } void testRemoveNonCreatedItemsAtTopWhenAtBottom() { scrollToBottom(); QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, -350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testRemoveLastItemsAtBottom() { scrollToBottom(); QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 4), Q_ARG(QVariant, 2)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -358., 200., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 150.); QCOMPARE(lvwph->m_clipItem->y(), 558.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 558.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testRemoveItemOutOfViewport() { changeContentY(520); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -320., 200., true); verifyItem(1, -120, 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 1)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -270., 150., true); verifyItem(1, -120., 350., false); verifyItem(2, 230, 350., false); verifyItem(3, 580, 350., true); QCOMPARE(lvwph->m_minYExtent, -200.); QCOMPARE(lvwph->m_clipItem->y(), 520.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 520.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMoveFirstItems() { QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 1), Q_ARG(QVariant, 1)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 200., false); verifyItem(1, 250., 150., false); verifyItem(2, 400., 350., false); verifyItem(3, 750., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMoveFirstOutOfVisibleItems() { QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 4), Q_ARG(QVariant, 1)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 200., false); verifyItem(1, 250., 350., false); verifyItem(2, 600., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMoveFirstToLastAtBottom() { scrollToBottom(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 3); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 5), Q_ARG(QVariant, 1)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 2); verifyItem(0, -508., 350., true); verifyItem(1, -158, 350., false); verifyItem(2, 192, 350., false); verifyItem(3, 542, 150., true); QCOMPARE(lvwph->m_minYExtent, -100.); QCOMPARE(lvwph->m_clipItem->y(), 1258.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 1258.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QVERIFY(!lvwph->isAtYEnd()); } void testChangeSizeVisibleItemNotOnViewport() { changeContentY(440); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -390., 150., true); verifyItem(1, -240., 200., true); verifyItem(2, -40, 350., false); verifyItem(3, 310, 350., false); verifyItem(4, 660, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 440.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 440.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); model->setProperty(1, "size", 100); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -290., 150., true); verifyItem(1, -140., 100., true); verifyItem(2, -40, 350., false); verifyItem(3, 310, 350., false); verifyItem(4, 660, 350., true); QCOMPARE(lvwph->m_minYExtent, -100.); QCOMPARE(lvwph->m_clipItem->y(), 440.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 440.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testShowHeaderCloseToTheTop() { changeContentY(375); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -325., 150., true); verifyItem(1, -175, 200., false); verifyItem(2, 25, 350., false); verifyItem(3, 375, 350., false); verifyItem(4, 725, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 375.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.);; lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -375., 150., true); verifyItem(1, -225, 200., true); verifyItem(2, -25, 350., false); verifyItem(3, 325, 350., false); verifyItem(4, 675, 350., true); QCOMPARE(lvwph->m_minYExtent, 50.); QCOMPARE(lvwph->m_clipItem->y(), 375.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 325.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 325.); QCOMPARE(lvwph->m_headerItemShownHeight, 50.);; scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 200., false); verifyItem(2, 400., 350., false); verifyItem(3, 750., 350., true); QCOMPARE(lvwph->m_minYExtent, 50.); QCOMPARE(lvwph->m_clipItem->y(), -50.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -50.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -50.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testShowHeaderHalfShown() { #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) QSKIP("This test is extremely unstable in 5.0.x"); #endif changeContentY(20); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 30., 150., false); verifyItem(1, 180, 200., false); verifyItem(2, 380, 350., false); verifyItem(3, 730, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 20.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 20.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.);; lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -20., 150., false); verifyItem(1, 130, 200., false); verifyItem(2, 330, 350., false); verifyItem(3, 680, 350., true); QCOMPARE(lvwph->m_minYExtent, 20.); QCOMPARE(lvwph->m_clipItem->y(), 50.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 50.); scrollToTop(); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 200., false); verifyItem(2, 400., 350., false); verifyItem(3, 750, 350., true); QCOMPARE(lvwph->m_minYExtent, 20.); QCOMPARE(lvwph->m_clipItem->y(), -20.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), -20.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), -20.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testShowHeaderAtBottom() { scrollToBottom(); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_VERIFY (lvwph->isAtYEnd()); } void growWindow() { view->rootObject()->setHeight(850); QTRY_COMPARE(lvwph->m_visibleItems.count(), 5); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); verifyItem(1, 200., 200., false); verifyItem(2, 400., 350., false); verifyItem(3, 750., 350., false); verifyItem(4, 1100., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void growWindowAtBottom() { scrollToBottom(); view->rootObject()->setHeight(850); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 2); verifyItem(0, -550., 350., true); verifyItem(1, -200., 350., false); verifyItem(2, 150, 350., false); verifyItem(3, 500, 350., false); QCOMPARE(lvwph->m_minYExtent, 350.); QCOMPARE(lvwph->m_clipItem->y(), 950.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 950.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testCrashShowHeaderWithNoHeader() { lvwph->setHeader(nullptr); lvwph->showHeader(); } void testCullOnBottomEdge() { changeContentY(200); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -150., 150., true); verifyItem(1, 0., 200., false); verifyItem(2, 200., 350., false); verifyItem(3, 550., 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 200.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 200.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleArea() { bool res = lvwph->maximizeVisibleArea(2); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -158., 150., true); verifyItem(1, -8., 200., false); verifyItem(2, 192, 350., false); verifyItem(3, 542, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 208.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 208.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaVisibleItems() { bool res = lvwph->maximizeVisibleArea(0); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); verifyInitialTopPosition(); res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); verifyInitialTopPosition(); } void testMaximizeVisibleAreaInvalidIndexes() { bool res = lvwph->maximizeVisibleArea(-1); QVERIFY(!res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); verifyInitialTopPosition(); res = lvwph->maximizeVisibleArea(1000); QVERIFY(!res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); verifyInitialTopPosition(); res = lvwph->maximizeVisibleArea(4); QVERIFY(!res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); verifyInitialTopPosition(); } void testMaximizeVisibleAreaBigElement() { model->setProperty(2, "size", 4000); bool res = lvwph->maximizeVisibleArea(2); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -350., 150., true); verifyItem(1, -200., 200., true); verifyItem(2, 0, 4000., false); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 400.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 400.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaScrollDown() { changeContentY(250); bool res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -150., 150., true); verifyItem(1, 0., 200., false); verifyItem(2, 200, 350., false); verifyItem(3, 550, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 200.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 200.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaScrollDownBigElement() { model->setProperty(1, "size", 1000); changeContentY(1150); bool res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -458., 1000., false); verifyItem(1, 542., 350., true); QCOMPARE(lvwph->m_minYExtent, 525.); QCOMPARE(lvwph->m_clipItem->y(), 658.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 658.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaBigElementInTheMiddle() { model->setProperty(1, "size", 1000); changeContentY(650); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -450., 1000., false); verifyItem(1, 550., 350., true); QCOMPARE(lvwph->m_minYExtent, 525.); QCOMPARE(lvwph->m_clipItem->y(), 650.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 650.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); bool res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -450., 1000., false); verifyItem(1, 550., 350., true); QCOMPARE(lvwph->m_minYExtent, 525.); QCOMPARE(lvwph->m_clipItem->y(), 650.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 650.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaTopWithHalfPageHeader() { changeContentY(430); changeContentY(-30); bool res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -150., 150., true); verifyItem(1, 0., 200., false); verifyItem(2, 200, 350., false); verifyItem(3, 550, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 200.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 200.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaTopWithHalfPageHeaderUpDown() { testMaximizeVisibleAreaTopWithHalfPageHeader(); changeContentY(-60); changeContentY(15); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -140., 150., false); verifyItem(1, 10., 200., false); verifyItem(2, 210, 350., false); verifyItem(3, 560, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 190.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 140.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 155.); QCOMPARE(lvwph->m_headerItemShownHeight, 35.); } void testMaximizeVisibleAreaBottomWithHalfPageHeader() { changeContentY(430); changeContentY(-30); bool res = lvwph->maximizeVisibleArea(3); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 4); QCOMPARE(lvwph->m_firstVisibleIndex, 1); verifyItem(0, -358., 200., true); verifyItem(1, -158., 350., false); verifyItem(2, 192, 350., false); verifyItem(3, 542, 350., true); QCOMPARE(lvwph->m_minYExtent, 162.5); QCOMPARE(lvwph->m_clipItem->y(), 558.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 558.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void testMaximizeVisibleAreaWithItemResize() { model->setProperty(0, "size", 1000); bool res = lvwph->maximizeVisibleArea(1); QVERIFY(res); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 3); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, -658., 1000., false); verifyItem(1, 342., 200., false); verifyItem(2, 542, 350., true); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 708.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 708.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); } void addingRemoveItemsShouldNotChangeContentY() { QSignalSpy spy(lvwph, SIGNAL(contentYChanged())); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 150)); QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 6)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 1); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 150., false); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QCOMPARE(lvwph->m_headerItemShownHeight, 0.); QCOMPARE(spy.count(), 0); } void testOvershootOnSameSize() { QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 6)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 0); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), 0.); QCOMPARE(lvwph->m_clipItem->clip(), false); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100)); QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 392)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 392., false); verifyItem(1, 442., 100., false); QCOMPARE(lvwph->contentHeight(), lvwph->height()); QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 5)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 10)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 15)); QTest::qWait(100); QTest::mouseMove(view, QPoint(0, 20)); QTest::qWait(100); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 55., 392., false); verifyItem(1, 447., 100., false); QCOMPARE(lvwph->m_minYExtent, 0.); QCOMPARE(lvwph->m_clipItem->y(), -5.); QTest::mouseRelease(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 15)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_firstVisibleIndex, 0); verifyItem(0, 50., 392., false); verifyItem(1, 442., 100., false); } void testMaximizeVisibleAreaMoveDownAndShowHeader() { model->setProperty(0, "size", 800); verifyItem(0, 50., 800., false); lvwph->maximizeVisibleArea(0); QTRY_COMPARE(lvwph->contentY(), 50.); changeContentY(10); QTRY_COMPARE(lvwph->contentY(), 60.); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_minYExtent, 50.); QCOMPARE(lvwph->m_clipItem->y(), 60.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 10.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 10.); verifyItem(0, -60., 800., false); } void testMaximizeVisibleAreaMoveUpAndShowHeader() { #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) QSKIP("This test is extremely unstable in 5.0.x"); #endif model->setProperty(0, "size", 800); verifyItem(0, 50., 800., false); lvwph->maximizeVisibleArea(0); QTRY_COMPARE(lvwph->contentY(), 50.); changeContentY(-10); QTRY_COMPARE(lvwph->contentY(), 40.); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_minYExtent, 40.); QCOMPARE(lvwph->m_clipItem->y(), 50.); QCOMPARE(lvwph->m_clipItem->clip(), true); QTRY_COMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); verifyItem(0, -40., 800., false); } void testMaximizeVisibleAreaMoveDownAndUpAndShowHeader() { model->setProperty(0, "size", 800); verifyItem(0, 50., 800., false); lvwph->maximizeVisibleArea(0); QTRY_COMPARE(lvwph->contentY(), 50.); changeContentY(-10); QTRY_COMPARE(lvwph->contentY(), 40.); changeContentY(10); QTRY_COMPARE(lvwph->contentY(), 50.); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_minYExtent, 50.); QCOMPARE(lvwph->m_clipItem->y(), 50.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); verifyItem(0, -50., 800., false); } void testMaximizeVisibleAreaMoveUpAndDownAndShowHeader() { model->setProperty(0, "size", 800); verifyItem(0, 50., 800., false); lvwph->maximizeVisibleArea(0); QTRY_COMPARE(lvwph->contentY(), 50.); changeContentY(10); QTRY_COMPARE(lvwph->contentY(), 60.); changeContentY(-10); QTRY_COMPARE(lvwph->contentY(), 50.); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_minYExtent, 40.); QCOMPARE(lvwph->m_clipItem->y(), 60.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 10.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 10.); verifyItem(0, -50., 800., false); } void testMaximizeVisibleAreaAndShowHeader() { model->setProperty(0, "size", 800); verifyItem(0, 50., 800., false); lvwph->maximizeVisibleArea(0); QTRY_COMPARE(lvwph->contentY(), 50.); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTRY_COMPARE(lvwph->m_visibleItems.count(), 2); QCOMPARE(lvwph->m_minYExtent, 50.); QCOMPARE(lvwph->m_clipItem->y(), 50.); QCOMPARE(lvwph->m_clipItem->clip(), true); QCOMPARE(lvwph->m_headerItem->y(), 0.); QCOMPARE(lvwph->m_headerItem->height(), 50.); QCOMPARE(lvwph->contentY(), 0.); verifyItem(0, -50., 800., false); } void positionAtBeginningEmpty() { QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 6)); QTRY_COMPARE(lvwph->m_visibleItems.count(), 0); lvwph->positionAtBeginning(); } void testHeaderPositionBug1240118() { scrollToBottom(); lvwph->showHeader(); QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning()); QTest::qWait(100); // Make sure stuff is stable QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100)); model->setProperty(3, "size", 10); model->setProperty(4, "size", 10); model->setProperty(5, "size", 10); model->setProperty(6, "size", 10); #if (QT_VERSION > QT_VERSION_CHECK(5, 0, 3)) QTRY_COMPARE(lvwph->m_minYExtent, 210.); #endif QTRY_COMPARE(lvwph->m_headerItem->y(), -lvwph->m_minYExtent); } private: QQuickView *view; ListViewWithPageHeader *lvwph; #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) QQuickListModel *model; #else QQmlListModel *model; #endif QQmlComponent *otherDelegate; }; QTEST_MAIN(ListViewWithPageHeaderTest) #include "listviewwithpageheadertest.moc"