@@ -0,0 +1,1676 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "listviewwithpageheader.h"
18+
19+#include <QAbstractItemModel>
20+#include <QQmlEngine>
21+#include <QQuickView>
22+#include <QtTestGui>
23+#include <private/qquicklistmodel_p.h>
24+#include <private/qquickanimation_p.h>
25+#include <private/qquickitem_p.h>
26+
27+class ListViewWithPageHeaderTest : public QObject
28+{
29+ Q_OBJECT
30+
31+private:
32+ void verifyItem(int visibleIndex, qreal pos, qreal height, bool culled, const QString §ionHeader, bool sectionHeaderCulled)
33+ {
34+ QTRY_VERIFY(visibleIndex < lvwph->m_visibleItems.count());
35+ ListViewWithPageHeader::ListItem *item = lvwph->m_visibleItems[visibleIndex];
36+ QTRY_COMPARE(item->y(), pos);
37+ QTRY_COMPARE(item->height(), height);
38+ QCOMPARE(QQuickItemPrivate::get(item->m_item)->culled, culled);
39+ QCOMPARE(section(item->m_sectionItem), sectionHeader);
40+ if (!sectionHeader.isNull()) {
41+ QCOMPARE(QQuickItemPrivate::get(item->m_sectionItem)->culled, sectionHeaderCulled);
42+ }
43+ }
44+
45+ void changeContentY(qreal change)
46+ {
47+ const qreal dest = lvwph->contentY() + change;
48+ if (dest > lvwph->contentY()) {
49+ const qreal jump = 25;
50+ while (lvwph->contentY() + jump < dest) {
51+ lvwph->setContentY(lvwph->contentY() + jump);
52+ QTest::qWait(1);
53+ }
54+ } else {
55+ const qreal jump = -25;
56+ while (lvwph->contentY() + jump > dest) {
57+ lvwph->setContentY(lvwph->contentY() + jump);
58+ QTest::qWait(1);
59+ }
60+ }
61+ lvwph->setContentY(dest);
62+ QTest::qWait(1);
63+ }
64+
65+ void scrollToTop()
66+ {
67+ const qreal jump = -25;
68+ while (!lvwph->isAtYBeginning()) {
69+ if (lvwph->contentY() + jump > -lvwph->minYExtent()) {
70+ lvwph->setContentY(lvwph->contentY() + jump);
71+ } else {
72+ lvwph->setContentY(lvwph->contentY() - 1);
73+ }
74+ QTest::qWait(1);
75+ }
76+ }
77+
78+ void scrollToBottom()
79+ {
80+ const qreal jump = 25;
81+ while (!lvwph->isAtYEnd()) {
82+ if (lvwph->contentY() + lvwph->height() + jump < lvwph->contentHeight()) {
83+ lvwph->setContentY(lvwph->contentY() + jump);
84+ } else {
85+ lvwph->setContentY(lvwph->contentY() + 1);
86+ }
87+ QTest::qWait(1);
88+ }
89+ }
90+
91+ void verifyInitialTopPosition()
92+ {
93+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
94+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
95+ verifyItem(0, 50., 190., false, "Agressive", false);
96+ verifyItem(1, 240., 240., false, "Regular", false);
97+ verifyItem(2, 480., 390., false, "Mild", false);
98+ QCOMPARE(lvwph->m_minYExtent, 0.);
99+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
100+ QCOMPARE(lvwph->m_clipItem->clip(), false);
101+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
102+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
103+ QCOMPARE(lvwph->contentY(), 0.);
104+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
105+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
106+ }
107+
108+ QString section(QQuickItem *item)
109+ {
110+ return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("section")).toString() : QString();
111+ }
112+
113+private Q_SLOTS:
114+
115+ void initTestCase()
116+ {
117+ }
118+
119+ void init()
120+ {
121+ view = new QQuickView();
122+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
123+ view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test_section.qml"));
124+ lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
125+ model = view->rootObject()->findChild<QQuickListModel*>();
126+ otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
127+ QVERIFY(lvwph);
128+ QVERIFY(model);
129+ QVERIFY(otherDelegate);
130+ view->show();
131+ QTest::qWaitForWindowExposed(view);
132+
133+ verifyInitialTopPosition();
134+ }
135+
136+ void cleanup()
137+ {
138+ delete view;
139+ }
140+
141+ void testCreationDeletion()
142+ {
143+ // Nothing, init/cleanup already tests this
144+ }
145+
146+ void testDrag1PixelUp()
147+ {
148+ lvwph->setContentY(lvwph->contentY() + 1);
149+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
150+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
151+ verifyItem(0, 49., 190., false, "Agressive", false);
152+ verifyItem(1, 239., 240., false, "Regular", false);
153+ verifyItem(2, 479., 390., false, "Mild", false);
154+ QCOMPARE(lvwph->m_minYExtent, 0.);
155+ QCOMPARE(lvwph->m_clipItem->y(), 1.);
156+ QCOMPARE(lvwph->m_clipItem->clip(), false);
157+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
158+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
159+ QCOMPARE(lvwph->contentY(), 1.);
160+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
161+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
162+ }
163+
164+ void testHeaderDetachDragDown()
165+ {
166+ QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0));
167+ QTest::qWait(100);
168+ QTest::mouseMove(view, QPoint(0, 5));
169+ QTest::qWait(100);
170+ QTest::mouseMove(view, QPoint(0, 10));
171+ QTest::qWait(100);
172+ QTest::mouseMove(view, QPoint(0, 15));
173+ QTest::qWait(100);
174+ QTest::mouseMove(view, QPoint(0, 20));
175+ QTest::qWait(100);
176+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
177+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
178+ verifyItem(0, 55., 190., false, "Agressive", false);
179+ verifyItem(1, 245., 240., false, "Regular", false);
180+ verifyItem(2, 485., 390., false, "Mild", false);
181+ QCOMPARE(lvwph->m_minYExtent, 0.);
182+ QCOMPARE(lvwph->m_clipItem->y(), -5.);
183+ QCOMPARE(lvwph->m_clipItem->clip(), false);
184+ QCOMPARE(lvwph->m_headerItem->y(), -5.);
185+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
186+ QCOMPARE(lvwph->contentY(), -5.);
187+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
188+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
189+
190+ QTest::mouseRelease(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 15));
191+
192+ verifyInitialTopPosition();
193+ }
194+
195+ void testDrag375PixelUp()
196+ {
197+ changeContentY(375);
198+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
199+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
200+ verifyItem(0, -325., 190., true, "Agressive", true);
201+ verifyItem(1, -135, 240., false, "Regular", true);
202+ verifyItem(2, 105, 390., false, "Mild", false);
203+ verifyItem(3, 495, 390., false, "Bold", false);
204+ QCOMPARE(lvwph->m_minYExtent, 0.);
205+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
206+ QCOMPARE(lvwph->m_clipItem->clip(), false);
207+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
208+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
209+ QCOMPARE(lvwph->contentY(), 375.);
210+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
211+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
212+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
213+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
214+ }
215+
216+ void testDrag520PixelUp()
217+ {
218+ changeContentY(520);
219+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
220+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
221+ verifyItem(0, -280., 240., true, "Regular", true);
222+ verifyItem(1, -40, 390., false, "Mild", true);
223+ verifyItem(2, 350, 390., false, "Bold", false);
224+ verifyItem(3, 740, 350., true, QString(), true);
225+ QCOMPARE(lvwph->m_minYExtent, 152.5);
226+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
227+ QCOMPARE(lvwph->m_clipItem->clip(), false);
228+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
229+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
230+ QCOMPARE(lvwph->contentY(), 520.);
231+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
232+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
233+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
234+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
235+ }
236+
237+ void testDragHeaderUpThenShow()
238+ {
239+ changeContentY(120);
240+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
241+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
242+ verifyItem(0, -70., 190., false, "Agressive", true);
243+ verifyItem(1, 120., 240., false, "Regular", false);
244+ verifyItem(2, 360., 390., false, "Mild", false);
245+ verifyItem(3, 750., 390., true, "Bold", true);
246+ QCOMPARE(lvwph->m_minYExtent, 0.);
247+ QCOMPARE(lvwph->m_clipItem->y(), 120.);
248+ QCOMPARE(lvwph->m_clipItem->clip(), false);
249+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
250+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
251+ QCOMPARE(lvwph->contentY(), 120.);
252+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
253+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
254+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
255+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
256+
257+ changeContentY(-30);
258+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
259+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
260+ verifyItem(0, -70., 190., false, "Agressive", true);
261+ verifyItem(1, 120., 240., false, "Regular", false);
262+ verifyItem(2, 360., 390., false, "Mild", false);
263+ verifyItem(3, 750., 390., true, "Bold", true);
264+ QCOMPARE(lvwph->m_minYExtent, 0.);
265+ QCOMPARE(lvwph->m_clipItem->y(), 120.);
266+ QCOMPARE(lvwph->m_clipItem->clip(), true);
267+ QTRY_COMPARE(lvwph->m_headerItem->y(), 70.);
268+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
269+ QCOMPARE(lvwph->contentY(), 90.);
270+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
271+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
272+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
273+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
274+ }
275+
276+ void testDragHeaderUpThenShowWithoutHidingTotally()
277+ {
278+ changeContentY(10);
279+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
280+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
281+ verifyItem(0, 40., 190., false, "Agressive", false);
282+ verifyItem(1, 230., 240., false, "Regular", false);
283+ verifyItem(2, 470., 390., false, "Mild", false);
284+ QCOMPARE(lvwph->m_minYExtent, 0.);
285+ QCOMPARE(lvwph->m_clipItem->y(), 10.);
286+ QCOMPARE(lvwph->m_clipItem->clip(), false);
287+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
288+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
289+ QCOMPARE(lvwph->contentY(), 10.);
290+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
291+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
292+
293+ changeContentY(-1);
294+
295+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
296+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
297+ verifyItem(0, 41., 190., false, "Agressive", false);
298+ verifyItem(1, 231., 240., false, "Regular", false);
299+ verifyItem(2, 471., 390., false, "Mild", false);
300+ QCOMPARE(lvwph->m_minYExtent, 0.);
301+ QCOMPARE(lvwph->m_clipItem->y(), 9.);
302+ QCOMPARE(lvwph->m_clipItem->clip(), false);
303+ QTRY_COMPARE(lvwph->m_headerItem->y(), 0.);
304+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
305+ QCOMPARE(lvwph->contentY(), 9.);
306+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
307+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
308+ }
309+
310+ void testPositionAtBeginningIndex0Visible()
311+ {
312+ changeContentY(375);
313+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
314+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
315+ verifyItem(0, -325., 190., true, "Agressive", true);
316+ verifyItem(1, -135, 240., false, "Regular", true);
317+ verifyItem(2, 105, 390., false, "Mild", false);
318+ verifyItem(3, 495, 390., false, "Bold", false);
319+ QCOMPARE(lvwph->m_minYExtent, 0.);
320+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
321+ QCOMPARE(lvwph->m_clipItem->clip(), false);
322+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
323+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
324+ QCOMPARE(lvwph->contentY(), 375.);
325+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
326+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
327+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
328+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
329+
330+ lvwph->positionAtBeginning();
331+
332+ verifyInitialTopPosition();
333+ }
334+
335+ void testPositionAtBeginningIndex0NotVisible()
336+ {
337+ changeContentY(520);
338+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
339+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
340+ verifyItem(0, -280., 240., true, "Regular", true);
341+ verifyItem(1, -40, 390., false, "Mild", true);
342+ verifyItem(2, 350, 390., false, "Bold", false);
343+ verifyItem(3, 740, 350., true, QString(), true);
344+ QCOMPARE(lvwph->m_minYExtent, 152.5);
345+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
346+ QCOMPARE(lvwph->m_clipItem->clip(), false);
347+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
348+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
349+ QCOMPARE(lvwph->contentY(), 520.);
350+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
351+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
352+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
353+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
354+
355+ lvwph->positionAtBeginning();
356+
357+ verifyInitialTopPosition();
358+ }
359+
360+ void testIndex0GrowOnScreen()
361+ {
362+ model->setProperty(0, "size", 400);
363+
364+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
365+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
366+ verifyItem(0, 50., 440., false, "Agressive", false);
367+ verifyItem(1, 490., 240., false, "Regular", false);
368+ verifyItem(2, 730., 390., true, "Mild", true);
369+ QCOMPARE(lvwph->m_minYExtent, 0.);
370+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
371+ QCOMPARE(lvwph->m_clipItem->clip(), false);
372+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
373+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
374+ QCOMPARE(lvwph->contentY(), 0.);
375+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
376+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
377+ }
378+
379+ void testIndex0GrowOffScreen()
380+ {
381+ changeContentY(375);
382+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
383+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
384+ verifyItem(0, -325., 190., true, "Agressive", true);
385+ verifyItem(1, -135, 240., false, "Regular", true);
386+ verifyItem(2, 105, 390., false, "Mild", false);
387+ verifyItem(3, 495, 390., false, "Bold", false);
388+ QCOMPARE(lvwph->m_minYExtent, 0.);
389+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
390+ QCOMPARE(lvwph->m_clipItem->clip(), false);
391+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
392+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
393+ QCOMPARE(lvwph->contentY(), 375.);
394+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
395+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
396+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
397+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
398+
399+ model->setProperty(0, "size", 400);
400+
401+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
402+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
403+ verifyItem(0, -575., 440., true, "Agressive", true);
404+ verifyItem(1, -135, 240., false, "Regular", true);
405+ verifyItem(2, 105, 390., false, "Mild", false);
406+ verifyItem(3, 495, 390., false, "Bold", false);
407+ QCOMPARE(lvwph->m_minYExtent, 250.);
408+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
409+ QCOMPARE(lvwph->m_clipItem->clip(), false);
410+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
411+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
412+ QCOMPARE(lvwph->contentY(), 375.);
413+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
414+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
415+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
416+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
417+
418+ scrollToTop();
419+
420+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
421+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
422+ verifyItem(0, 50., 440., false, "Agressive", false);
423+ verifyItem(1, 490, 240., false, "Regular", false);
424+ verifyItem(2, 730, 390., true, "Mild", true);
425+ QCOMPARE(lvwph->m_minYExtent, 250.);
426+ QCOMPARE(lvwph->m_clipItem->y(), -250.);
427+ QCOMPARE(lvwph->m_clipItem->clip(), false);
428+ QCOMPARE(lvwph->m_headerItem->y(), -250.);
429+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
430+ QCOMPARE(lvwph->contentY(), -250.);
431+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
432+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
433+
434+ changeContentY(30);
435+
436+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
437+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
438+ verifyItem(0, 20., 440., false, "Agressive", false);
439+ verifyItem(1, 460, 240., false, "Regular", false);
440+ verifyItem(2, 700, 390., true, "Mild", true);
441+ QCOMPARE(lvwph->m_minYExtent, 250.);
442+ QCOMPARE(lvwph->m_clipItem->y(), -220.);
443+ QCOMPARE(lvwph->m_clipItem->clip(), false);
444+ QCOMPARE(lvwph->m_headerItem->y(), -250.);
445+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
446+ QCOMPARE(lvwph->contentY(), -220.);
447+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
448+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
449+ }
450+
451+ void testIndex0GrowNotCreated()
452+ {
453+ changeContentY(520);
454+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
455+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
456+ verifyItem(0, -280., 240., true, "Regular", true);
457+ verifyItem(1, -40, 390., false, "Mild", true);
458+ verifyItem(2, 350, 390., false, "Bold", false);
459+ verifyItem(3, 740, 350., true, QString(), true);
460+ QCOMPARE(lvwph->m_minYExtent, 152.5);
461+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
462+ QCOMPARE(lvwph->m_clipItem->clip(), false);
463+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
464+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
465+ QCOMPARE(lvwph->contentY(), 520.);
466+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
467+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
468+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
469+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
470+
471+ model->setProperty(0, "size", 400);
472+
473+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
474+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
475+ verifyItem(0, -280., 240., true, "Regular", true);
476+ verifyItem(1, -40, 390., false, "Mild", true);
477+ verifyItem(2, 350, 390., false, "Bold", false);
478+ verifyItem(3, 740, 350., true, QString(), true);
479+ QCOMPARE(lvwph->m_minYExtent, 152.5);
480+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
481+ QCOMPARE(lvwph->m_clipItem->clip(), false);
482+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
483+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
484+ QCOMPARE(lvwph->contentY(), 520.);
485+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
486+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
487+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
488+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
489+
490+ scrollToTop();
491+
492+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
493+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
494+ verifyItem(0, 50., 440., false, "Agressive", false);
495+ verifyItem(1, 490, 240., false, "Regular", false);
496+ verifyItem(2, 730, 390., true, "Mild", true);
497+ QCOMPARE(lvwph->m_minYExtent, 250.);
498+ QCOMPARE(lvwph->m_clipItem->y(), -250.);
499+ QCOMPARE(lvwph->m_clipItem->clip(), false);
500+ QCOMPARE(lvwph->m_headerItem->y(), -250.);
501+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
502+ QCOMPARE(lvwph->contentY(), -250.);
503+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
504+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
505+ }
506+
507+ void testShowHideShowHeaderAtBottom()
508+ {
509+ scrollToBottom();
510+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
511+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
512+ verifyItem(0, -588., 390., true, "Bold", true);
513+ verifyItem(1, -198, 350., false, QString(), true);
514+ verifyItem(2, 152, 390., false, "Lazy", false);
515+ QCOMPARE(lvwph->m_minYExtent, 310.);
516+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
517+ QCOMPARE(lvwph->m_clipItem->clip(), false);
518+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
519+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
520+ QCOMPARE(lvwph->contentY(), 1458.);
521+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
522+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
523+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
524+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
525+
526+ changeContentY(-30);
527+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
528+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
529+ verifyItem(0, -588., 390., true, "Bold", true);
530+ verifyItem(1, -198, 350., false, QString(), true);
531+ verifyItem(2, 152, 390., false, "Lazy", false);
532+ QCOMPARE(lvwph->m_minYExtent, 310.);
533+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
534+ QCOMPARE(lvwph->m_clipItem->clip(), true);
535+ QCOMPARE(lvwph->m_headerItem->y(), 1408.);
536+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
537+ QCOMPARE(lvwph->contentY(), 1428.);
538+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
539+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
540+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
541+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
542+
543+ changeContentY(30);
544+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
545+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
546+ verifyItem(0, -588., 390., true, "Bold", true);
547+ verifyItem(1, -198, 350., false, QString(), true);
548+ verifyItem(2, 152, 390., false, "Lazy", false);
549+ QCOMPARE(lvwph->m_minYExtent, 310.);
550+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
551+ QCOMPARE(lvwph->m_clipItem->clip(), false);
552+ QCOMPARE(lvwph->m_headerItem->y(), -310.);
553+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
554+ QCOMPARE(lvwph->contentY(), 1458.);
555+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
556+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
557+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
558+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
559+
560+ changeContentY(-30);
561+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
562+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
563+ verifyItem(0, -588., 390., true, "Bold", true);
564+ verifyItem(1, -198, 350., false, QString(), true);
565+ verifyItem(2, 152, 390., false, "Lazy", false);
566+ QCOMPARE(lvwph->m_minYExtent, 310.);
567+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
568+ QCOMPARE(lvwph->m_clipItem->clip(), true);
569+ QCOMPARE(lvwph->m_headerItem->y(), 1408.);
570+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
571+ QCOMPARE(lvwph->contentY(), 1428.);
572+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
573+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
574+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
575+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
576+ }
577+
578+ // TODO
579+// void testChangeDelegateAtBottom()
580+// {
581+// scrollToBottom();
582+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
583+// QCOMPARE(lvwph->m_firstVisibleIndex, 3);
584+// verifyItem(0, -588., 390., true);
585+// verifyItem(1, -198, 350., false);
586+// verifyItem(2, 152, 390., false);
587+// QCOMPARE(lvwph->m_minYExtent, 0.);
588+// QCOMPARE(lvwph->m_clipItem->y(), 1458.);
589+// QCOMPARE(lvwph->m_clipItem->clip(), false);
590+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
591+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
592+// QCOMPARE(lvwph->contentY(), 1458.);
593+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
594+//
595+// lvwph->setDelegate(otherDelegate);
596+//
597+// QTRY_COMPARE(lvwph->m_visibleItems.count(), 6);
598+// QCOMPARE(lvwph->m_firstVisibleIndex, 0);
599+// verifyItem(0, 50., 35., false);
600+// verifyItem(1, 85, 35., false);
601+// verifyItem(2, 120, 35., false);
602+// verifyItem(3, 155, 35., false);
603+// verifyItem(4, 190, 35., false);
604+// verifyItem(5, 225, 35., false);
605+// QCOMPARE(lvwph->m_minYExtent, 0.);
606+// QCOMPARE(lvwph->m_clipItem->y(), 0.);
607+// QCOMPARE(lvwph->m_clipItem->clip(), false);
608+// QCOMPARE(lvwph->m_headerItem->y(), 0.);
609+// QCOMPARE(lvwph->m_headerItem->height(), 50.);
610+// QCOMPARE(lvwph->contentY(), 0.);
611+// QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
612+// }
613+
614+ void testGrowHeaderAtTop()
615+ {
616+ lvwph->m_headerItem->setHeight(100);
617+
618+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
619+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
620+ verifyItem(0, 100., 190., false, "Agressive", false);
621+ verifyItem(1, 290., 240., false, "Regular", false);
622+ verifyItem(2, 530., 390., false, "Mild", false);
623+ QCOMPARE(lvwph->m_minYExtent, 0.);
624+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
625+ QCOMPARE(lvwph->m_clipItem->clip(), false);
626+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
627+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
628+ QCOMPARE(lvwph->contentY(), 0.);
629+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
630+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
631+ }
632+
633+ void testGrowHeaderAtBottom()
634+ {
635+ scrollToBottom();
636+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
637+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
638+ verifyItem(0, -588., 390., true, "Bold", true);
639+ verifyItem(1, -198, 350., false, QString(), true);
640+ verifyItem(2, 152, 390., false, "Lazy", false);
641+ QCOMPARE(lvwph->m_minYExtent, 310.);
642+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
643+ QCOMPARE(lvwph->m_clipItem->clip(), false);
644+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
645+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
646+ QCOMPARE(lvwph->contentY(), 1458.);
647+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
648+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
649+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
650+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
651+
652+ lvwph->m_headerItem->setHeight(100);
653+
654+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
655+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
656+ verifyItem(0, -588., 390., true, "Bold", true);
657+ verifyItem(1, -198, 350., false, QString(), true);
658+ verifyItem(2, 152, 390., false, "Lazy", false);
659+ QCOMPARE(lvwph->m_minYExtent, 360.);
660+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
661+ QCOMPARE(lvwph->m_clipItem->clip(), false);
662+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
663+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
664+ QCOMPARE(lvwph->contentY(), 1458.);
665+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
666+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
667+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
668+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
669+
670+ changeContentY(-30);
671+
672+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
673+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
674+ verifyItem(0, -588., 390., true, "Bold", true);
675+ verifyItem(1, -198, 350., false, QString(), true);
676+ verifyItem(2, 152, 390., false, "Lazy", false);
677+ QCOMPARE(lvwph->m_minYExtent, 360.);
678+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
679+ QCOMPARE(lvwph->m_clipItem->clip(), true);
680+ QCOMPARE(lvwph->m_headerItem->y(), 1358.);
681+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
682+ QCOMPARE(lvwph->contentY(), 1428.);
683+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
684+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
685+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
686+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
687+
688+ scrollToTop();
689+
690+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
691+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
692+ verifyItem(0, 100., 190., false, "Agressive", false);
693+ verifyItem(1, 290., 240., false, "Regular", false);
694+ verifyItem(2, 530., 390., false, "Mild", false);
695+ QCOMPARE(lvwph->m_minYExtent, 50.);
696+ QCOMPARE(lvwph->m_clipItem->y(), -50.);
697+ QCOMPARE(lvwph->m_clipItem->clip(), false);
698+ QCOMPARE(lvwph->m_headerItem->y(), -50.);
699+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
700+ QCOMPARE(lvwph->contentY(), -50.);
701+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
702+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
703+ }
704+
705+ void testGrowHeaderPartlyShown()
706+ {
707+ scrollToBottom();
708+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
709+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
710+ verifyItem(0, -588., 390., true, "Bold", true);
711+ verifyItem(1, -198, 350., false, QString(), true);
712+ verifyItem(2, 152, 390., false, "Lazy", false);
713+ QCOMPARE(lvwph->m_minYExtent, 310.);
714+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
715+ QCOMPARE(lvwph->m_clipItem->clip(), false);
716+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
717+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
718+ QCOMPARE(lvwph->contentY(), 1458.);
719+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
720+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
721+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
722+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
723+
724+ changeContentY(-30);
725+
726+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
727+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
728+ verifyItem(0, -588., 390., true, "Bold", true);
729+ verifyItem(1, -198, 350., false, QString(), true);
730+ verifyItem(2, 152, 390., false, "Lazy", false);
731+ QCOMPARE(lvwph->m_minYExtent, 310.);
732+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
733+ QCOMPARE(lvwph->m_clipItem->clip(), true);
734+ QCOMPARE(lvwph->m_headerItem->y(), 1408.);
735+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
736+ QCOMPARE(lvwph->contentY(), 1428.);
737+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
738+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
739+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
740+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
741+
742+ lvwph->m_headerItem->setHeight(100);
743+
744+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
745+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
746+ verifyItem(0, -588., 390., true, "Bold", true);
747+ verifyItem(1, -198, 350., false, QString(), true);
748+ verifyItem(2, 152, 390., false, "Lazy", false);
749+ QCOMPARE(lvwph->m_minYExtent, 310.);
750+ QCOMPARE(lvwph->m_clipItem->y(), 1508.);
751+ QCOMPARE(lvwph->m_clipItem->clip(), true);
752+ QCOMPARE(lvwph->m_headerItem->y(), 1408.);
753+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
754+ QCOMPARE(lvwph->contentY(), 1428.);
755+ QCOMPARE(lvwph->m_headerItemShownHeight, 80.);
756+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
757+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
758+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
759+
760+ scrollToTop();
761+
762+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
763+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
764+ verifyItem(0, 100., 190., false, "Agressive", false);
765+ verifyItem(1, 290., 240., false, "Regular", false);
766+ verifyItem(2, 530., 390., false, "Mild", false);
767+ QCOMPARE(lvwph->m_minYExtent, 0.);
768+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
769+ QCOMPARE(lvwph->m_clipItem->clip(), false);
770+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
771+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
772+ QCOMPARE(lvwph->contentY(), 0.);
773+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
774+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
775+ }
776+
777+ void testShrinkHeaderMoreThanPartlyShown()
778+ {
779+ scrollToBottom();
780+ lvwph->m_headerItem->setHeight(100);
781+ changeContentY(-30);
782+
783+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
784+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
785+ verifyItem(0, -588., 390., true, "Bold", true);
786+ verifyItem(1, -198, 350., false, QString(), true);
787+ verifyItem(2, 152, 390., false, "Lazy", false);
788+ QCOMPARE(lvwph->m_minYExtent, 360.);
789+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
790+ QCOMPARE(lvwph->m_clipItem->clip(), true);
791+ QCOMPARE(lvwph->m_headerItem->y(), 1358.);
792+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
793+ QCOMPARE(lvwph->contentY(), 1428.);
794+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
795+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
796+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
797+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
798+
799+ lvwph->m_headerItem->setHeight(50);
800+
801+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
802+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
803+ verifyItem(0, -588., 390., true, "Bold", true);
804+ verifyItem(1, -198, 350., false, QString(), true);
805+ verifyItem(2, 152, 390., false, "Lazy", false);
806+ QCOMPARE(lvwph->m_minYExtent, 340.);
807+ QCOMPARE(lvwph->m_clipItem->y(), 1428.);
808+ QCOMPARE(lvwph->m_clipItem->clip(), false);
809+ QCOMPARE(lvwph->m_headerItem->y(), 1358.);
810+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
811+ QCOMPARE(lvwph->contentY(), 1428.);
812+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
813+ QTRY_VERIFY(lvwph->isAtYEnd());
814+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
815+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
816+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
817+
818+ scrollToTop();
819+
820+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
821+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
822+ verifyItem(0, 50., 190., false, "Agressive", false);
823+ verifyItem(1, 240., 240., false, "Regular", false);
824+ verifyItem(2, 480., 390., false, "Mild", false);
825+ QCOMPARE(lvwph->m_minYExtent, 30.);
826+ QCOMPARE(lvwph->m_clipItem->y(), -30.);
827+ QCOMPARE(lvwph->m_clipItem->clip(), false);
828+ QCOMPARE(lvwph->m_headerItem->y(), -30.);
829+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
830+ QCOMPARE(lvwph->contentY(), -30.);
831+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
832+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
833+ }
834+
835+ void testSetEmptyHeaderAtTop()
836+ {
837+ lvwph->setHeader(nullptr);
838+
839+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
840+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
841+ verifyItem(0, 0., 190., false, "Agressive", false);
842+ verifyItem(1, 190., 240., false, "Regular", false);
843+ verifyItem(2, 430., 390., false, "Mild", false);
844+ QCOMPARE(lvwph->m_minYExtent, 0.);
845+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
846+ QCOMPARE(lvwph->m_clipItem->clip(), false);
847+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
848+ QCOMPARE(lvwph->contentY(), 0.);
849+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
850+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
851+ }
852+
853+ void testSetEmptyHeaderAtBottom()
854+ {
855+ scrollToBottom();
856+ lvwph->setHeader(nullptr);
857+
858+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
859+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
860+ verifyItem(0, -588., 390., true, "Bold", true);
861+ verifyItem(1, -198, 350., false, QString(), true);
862+ verifyItem(2, 152, 390., false, "Lazy", false);
863+ QCOMPARE(lvwph->m_minYExtent, 260.);
864+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
865+ QCOMPARE(lvwph->m_clipItem->clip(), false);
866+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
867+ QCOMPARE(lvwph->contentY(), 1458.);
868+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
869+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
870+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
871+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
872+
873+ scrollToTop();
874+
875+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
876+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
877+ verifyItem(0, 0., 190., false, "Agressive", false);
878+ verifyItem(1, 190., 240., false, "Regular", false);
879+ verifyItem(2, 430., 390., false, "Mild", false);
880+ QCOMPARE(lvwph->m_minYExtent, -50.);
881+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
882+ QCOMPARE(lvwph->m_clipItem->clip(), false);
883+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
884+ QCOMPARE(lvwph->contentY(), 50.);
885+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
886+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
887+ }
888+
889+ void testSetEmptyHeaderWhenPartlyShownClipped()
890+ {
891+ scrollToBottom();
892+ changeContentY(-30);
893+ lvwph->setHeader(nullptr);
894+
895+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
896+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
897+ verifyItem(0, -588., 390., true, "Bold", true);
898+ verifyItem(1, -198, 350., false, QString(), true);
899+ verifyItem(2, 152, 390., false, "Lazy", false);
900+ QCOMPARE(lvwph->m_minYExtent, 290.);
901+ QCOMPARE(lvwph->m_clipItem->y(), 1428.);
902+ QCOMPARE(lvwph->m_clipItem->clip(), false);
903+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
904+ QCOMPARE(lvwph->contentY(), 1428.);
905+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
906+ QTRY_VERIFY(lvwph->isAtYEnd());
907+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
908+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
909+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
910+
911+ scrollToTop();
912+
913+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
914+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
915+ verifyItem(0, 0., 190., false, "Agressive", false);
916+ verifyItem(1, 190., 240., false, "Regular", false);
917+ verifyItem(2, 430., 390., false, "Mild", false);
918+ QCOMPARE(lvwph->m_minYExtent, -20.);
919+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
920+ QCOMPARE(lvwph->m_clipItem->clip(), false);
921+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
922+ QCOMPARE(lvwph->contentY(), 20.);
923+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
924+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
925+ }
926+
927+ void testSetEmptyHeaderWhenPartlyShownNotClipped()
928+ {
929+ changeContentY(30);
930+ lvwph->setHeader(nullptr);
931+
932+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
933+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
934+ verifyItem(0, -30., 190., false, "Agressive", true);
935+ verifyItem(1, 160., 240., false, "Regular", false);
936+ verifyItem(2, 400., 390., false, "Mild", false);
937+ QCOMPARE(lvwph->m_minYExtent, 0.);
938+ QCOMPARE(lvwph->m_clipItem->y(), 30.);
939+ QCOMPARE(lvwph->m_clipItem->clip(), false);
940+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
941+ QCOMPARE(lvwph->contentY(), 30.);
942+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
943+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
944+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
945+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
946+ }
947+
948+ void testSetNullDelegate()
949+ {
950+ lvwph->setDelegate(nullptr);
951+
952+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 0);
953+ QCOMPARE(lvwph->m_firstVisibleIndex, -1);
954+ QCOMPARE(lvwph->m_minYExtent, 0.);
955+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
956+ QCOMPARE(lvwph->m_clipItem->clip(), false);
957+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
958+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
959+ QCOMPARE(lvwph->contentY(), 0.);
960+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
961+ QTRY_COMPARE(lvwph->contentHeight(), 50.);
962+ QVERIFY(lvwph->isAtYBeginning());
963+ QVERIFY(lvwph->isAtYEnd());
964+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
965+ }
966+
967+ void testInsertItems()
968+ {
969+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
970+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
971+
972+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
973+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
974+ verifyItem(0, 50., 190., false, "Agressive", false);
975+ verifyItem(1, 240., 165., false, "Regular", false);
976+ verifyItem(2, 405., 140., false, "Agressive", false);
977+ verifyItem(3, 545., 240., true, "Regular", true);
978+ verifyItem(4, 785., 390., true, "Mild", true);
979+ QCOMPARE(lvwph->m_minYExtent, 0.);
980+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
981+ QCOMPARE(lvwph->m_clipItem->clip(), false);
982+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
983+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
984+ QCOMPARE(lvwph->contentY(), 0.);
985+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
986+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
987+ }
988+
989+ void testInsertItemsStealSectionItem()
990+ {
991+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
992+
993+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
994+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
995+ verifyItem(0, 50., 190., false, "Agressive", false);
996+ verifyItem(1, 240., 165., false, "Regular", false);
997+ verifyItem(2, 405., 200., false, QString(), true);
998+ verifyItem(3, 605., 390., true, "Mild", true);
999+ QCOMPARE(lvwph->m_minYExtent, 0.);
1000+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1001+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1002+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1003+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1004+ QCOMPARE(lvwph->contentY(), 0.);
1005+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1006+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1007+ }
1008+
1009+
1010+ void testInsertItemsOnNotShownPosition()
1011+ {
1012+ changeContentY(800);
1013+
1014+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1015+ QTRY_COMPARE(lvwph->m_firstVisibleIndex, 2);
1016+ verifyItem(0, -320., 390., false, "Mild", true);
1017+ verifyItem(1, 70, 390., false, "Bold", false);
1018+ verifyItem(2, 460, 350., false, QString(), false);
1019+ verifyItem(3, 810, 390., true, "Lazy", true);
1020+ QCOMPARE(lvwph->m_minYExtent, 970./3.);
1021+ QCOMPARE(lvwph->m_clipItem->y(), 800.);
1022+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1023+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1024+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1025+ QCOMPARE(lvwph->contentY(), 800.);
1026+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1027+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1028+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1029+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1030+
1031+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1032+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1033+
1034+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1035+ QCOMPARE(lvwph->m_firstVisibleIndex, 4);
1036+ verifyItem(0, -320., 390., false, "Mild", true);
1037+ verifyItem(1, 70, 390., false, "Bold", false);
1038+ verifyItem(2, 460, 350., false, QString(), false);
1039+ verifyItem(3, 810, 390., true, "Lazy", true);
1040+ QCOMPARE(lvwph->m_minYExtent, 1090.);
1041+ QCOMPARE(lvwph->m_clipItem->y(), 800.);
1042+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1043+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1044+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1045+ QCOMPARE(lvwph->contentY(), 800.);
1046+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1047+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1048+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1049+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1050+
1051+ scrollToTop();
1052+
1053+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1054+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1055+ verifyItem(0, 50., 190., false, "Agressive", false);
1056+ verifyItem(1, 240., 165., false, "Regular", false);
1057+ verifyItem(2, 405., 140., false, "Agressive", false);
1058+ verifyItem(3, 545., 240., true, "Regular", true);
1059+ verifyItem(4, 785., 390., true, "Mild", true);
1060+ QCOMPARE(lvwph->m_minYExtent, 305.);
1061+ QCOMPARE(lvwph->m_clipItem->y(), -305.);
1062+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1063+ QCOMPARE(lvwph->m_headerItem->y(), -305.);
1064+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1065+ QCOMPARE(lvwph->contentY(), -305.);
1066+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1067+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1068+ }
1069+
1070+ void testInsertItemsAtEndOfViewport()
1071+ {
1072+ changeContentY(60);
1073+
1074+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1075+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1076+ verifyItem(0, -10., 190., false, "Agressive", true);
1077+ verifyItem(1, 180., 240., false, "Regular", false);
1078+ verifyItem(2, 420., 390., false, "Mild", false);
1079+ verifyItem(3, 810., 390., true, "Bold", true);
1080+ QCOMPARE(lvwph->m_minYExtent, 0.);
1081+ QCOMPARE(lvwph->m_clipItem->y(), 60.);
1082+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1083+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1084+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1085+ QCOMPARE(lvwph->contentY(), 60.);
1086+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1087+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1088+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1089+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1090+
1091+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1092+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1093+
1094+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1095+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1096+ verifyItem(0, -10., 190., false, "Agressive", true);
1097+ verifyItem(1, 180., 240., false, "Regular", false);
1098+ verifyItem(2, 420., 390., false, "Mild", false);
1099+ verifyItem(3, 810., 165., true, "Regular", true);
1100+ QCOMPARE(lvwph->m_minYExtent, 0.);
1101+ QCOMPARE(lvwph->m_clipItem->y(), 60.);
1102+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1103+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1104+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1105+ QCOMPARE(lvwph->contentY(), 60.);
1106+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1107+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1108+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
1109+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1110+ }
1111+
1112+ void testInsertItemsBeforeValidIndex()
1113+ {
1114+ changeContentY(520);
1115+
1116+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1117+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1118+ verifyItem(0, -280., 240., true, "Regular", true);
1119+ verifyItem(1, -40, 390., false, "Mild", true);
1120+ verifyItem(2, 350, 390., false, "Bold", false);
1121+ verifyItem(3, 740, 350., true, QString(), true);
1122+ QCOMPARE(lvwph->m_minYExtent, 152.5);
1123+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1124+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1125+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1126+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1127+ QCOMPARE(lvwph->contentY(), 520.);
1128+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1129+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1130+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1131+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1132+
1133+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1134+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1135+
1136+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1137+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1138+ verifyItem(0, -280., 240., true, "Regular", true);
1139+ verifyItem(1, -40, 390., false, "Mild", true);
1140+ verifyItem(2, 350, 390., false, "Bold", false);
1141+ verifyItem(3, 740, 350., true, QString(), true);
1142+ QCOMPARE(lvwph->m_minYExtent, 837.5);
1143+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1144+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1145+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1146+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1147+ QCOMPARE(lvwph->contentY(), 520.);
1148+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1149+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1150+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1151+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1152+ }
1153+
1154+ void testInsertItemsBeforeViewport()
1155+ {
1156+ changeContentY(375);
1157+
1158+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1159+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1160+ verifyItem(0, -325., 190., true, "Agressive", true);
1161+ verifyItem(1, -135, 240., false, "Regular", true);
1162+ verifyItem(2, 105, 390., false, "Mild", false);
1163+ verifyItem(3, 495, 390., false, "Bold", false);
1164+ QCOMPARE(lvwph->m_minYExtent, 0.);
1165+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1166+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1167+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1168+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1169+ QCOMPARE(lvwph->contentY(), 375.);
1170+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1171+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1172+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1173+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1174+
1175+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1176+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1177+
1178+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1179+ QCOMPARE(lvwph->m_firstVisibleIndex, 2);
1180+ verifyItem(0, -275., 140., true, "Agressive", true);
1181+ verifyItem(1, -135., 240., false, "Regular", true);
1182+ verifyItem(2, 105, 390., false, "Mild", false);
1183+ verifyItem(3, 495, 390., false, "Bold", false);
1184+ QCOMPARE(lvwph->m_minYExtent, 530.);
1185+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1186+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1187+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1188+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1189+ QCOMPARE(lvwph->contentY(), 375.);
1190+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1191+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1192+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1193+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1194+
1195+ scrollToTop();
1196+
1197+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1198+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1199+ verifyItem(0, 50., 190., false, "Agressive", false);
1200+ verifyItem(1, 240., 165., false, "Regular", false);
1201+ verifyItem(2, 405., 140., false, "Agressive", false);
1202+ verifyItem(3, 545., 240., true, "Regular", true);
1203+ verifyItem(4, 785., 390., true, "Mild", true);
1204+ QCOMPARE(lvwph->m_minYExtent, 305.);
1205+ QCOMPARE(lvwph->m_clipItem->y(), -305.);
1206+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1207+ QCOMPARE(lvwph->m_headerItem->y(), -305.);
1208+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1209+ QCOMPARE(lvwph->contentY(), -305.);
1210+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1211+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1212+ }
1213+
1214+ void testInsertItemsAtBottom()
1215+ {
1216+ scrollToBottom();
1217+
1218+ QVERIFY(lvwph->isAtYEnd());
1219+
1220+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1221+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1222+
1223+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1224+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1225+ verifyItem(0, -588., 390., true, "Bold", true);
1226+ verifyItem(1, -198, 350., false, QString(), true);
1227+ verifyItem(2, 152, 390., false, "Lazy", false);
1228+ verifyItem(3, 542, 165., true, "Regular", true);
1229+ verifyItem(4, 707, 140., true, "Agressive", true);
1230+ QCOMPARE(lvwph->m_minYExtent, 310.);
1231+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1232+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1233+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1234+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1235+ QCOMPARE(lvwph->contentY(), 1458.);
1236+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1237+ QVERIFY(!lvwph->isAtYEnd());
1238+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1239+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1240+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1241+
1242+ scrollToBottom();
1243+
1244+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1245+ QCOMPARE(lvwph->m_firstVisibleIndex, 4);
1246+ verifyItem(0, -503., 350., true, QString(), true);
1247+ verifyItem(1, -153, 390., false, "Lazy", true);
1248+ verifyItem(2, 237, 165., false, "Regular", false);
1249+ verifyItem(3, 402, 140., false, "Agressive", false);
1250+ QCOMPARE(lvwph->m_minYExtent, -165.);
1251+ QCOMPARE(lvwph->m_clipItem->y(), 1763.);
1252+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1253+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1254+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1255+ QCOMPARE(lvwph->contentY(), 1763.);
1256+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1257+ QVERIFY(lvwph->isAtYEnd());
1258+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1259+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Lazy"));
1260+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1261+ }
1262+
1263+ void testInsertItemAtTop()
1264+ {
1265+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1266+
1267+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1268+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1269+ verifyItem(0, 50., 115., false, "Agressive", false);
1270+ verifyItem(1, 165., 150., false, QString(), false);
1271+ verifyItem(2, 315., 240., false, "Regular", false);
1272+ verifyItem(3, 555., 390., true, "Mild", true);
1273+ QCOMPARE(lvwph->m_minYExtent, 0.);
1274+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1275+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1276+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1277+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1278+ QCOMPARE(lvwph->contentY(), 0.);
1279+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1280+ QVERIFY(lvwph->isAtYBeginning());
1281+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1282+ }
1283+
1284+ void testInsertItem10SmallItemsAtTopWhenAtBottom()
1285+ {
1286+ scrollToBottom();
1287+
1288+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1289+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1290+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1291+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1292+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1293+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1294+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1295+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1296+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1297+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1298+
1299+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1300+ QCOMPARE(lvwph->m_firstVisibleIndex, 13);
1301+ verifyItem(0, -588., 390., true, "Bold", true);
1302+ verifyItem(1, -198, 350., false, QString(), true);
1303+ verifyItem(2, 152, 390., false, "Lazy", false);
1304+ QCOMPARE(lvwph->m_minYExtent, 12230./3.);
1305+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1306+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1307+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1308+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1309+ QCOMPARE(lvwph->contentY(), 1458.);
1310+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1311+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1312+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1313+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1314+
1315+ changeContentY(-1700);
1316+
1317+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 10);
1318+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1319+ verifyItem(0, -323., 75., true, QString(), true);
1320+ verifyItem(1, -248., 115., true, "Regular", true);
1321+ verifyItem(2, -133., 75., true, QString(), true);
1322+ verifyItem(3, -58., 75., false, QString(), true);
1323+ verifyItem(4, 17., 115., false, "Agressive", false);
1324+ verifyItem(5, 132., 75., false, QString(), true);
1325+ verifyItem(6, 207., 75., false, QString(), true);
1326+ verifyItem(7, 282., 150., false, QString(), true);
1327+ verifyItem(8, 432., 240., false, "Regular", false);
1328+ QCOMPARE(lvwph->m_minYExtent, 980.5);
1329+ QCOMPARE(lvwph->m_clipItem->y(), -192.);
1330+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1331+ QCOMPARE(lvwph->m_headerItem->y(), -242.);
1332+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1333+ QCOMPARE(lvwph->contentY(), -242.);
1334+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1335+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1336+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1337+ QCOMPARE(lvwph->m_topSectionItem->y(), -23.);
1338+ }
1339+
1340+ void testRemoveItemsAtTop()
1341+ {
1342+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1343+
1344+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 2);
1345+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1346+ verifyItem(0, 50., 390., false, "Mild", false);
1347+ verifyItem(1, 440., 390., false, "Bold", false);
1348+ QCOMPARE(lvwph->m_minYExtent, 0.);
1349+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1350+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1351+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1352+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1353+ QCOMPARE(lvwph->contentY(), 0.);
1354+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1355+ QVERIFY(lvwph->isAtYBeginning());
1356+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1357+ }
1358+
1359+ void testRemoveNonCreatedItemsAtTopWhenAtBottom()
1360+ {
1361+ scrollToBottom();
1362+
1363+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1364+
1365+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1366+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1367+ verifyItem(0, -588., 390., true, "Bold", true);
1368+ verifyItem(1, -198, 350., false, QString(), true);
1369+ verifyItem(2, 152, 390., false, "Lazy", false);
1370+ QCOMPARE(lvwph->m_minYExtent, -1330./3.);
1371+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1372+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1373+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1374+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1375+ QCOMPARE(lvwph->contentY(), 1458.);
1376+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1377+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1378+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1379+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1380+ }
1381+
1382+ void testRemoveLastItemsAtBottom()
1383+ {
1384+ scrollToBottom();
1385+
1386+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 4), Q_ARG(QVariant, 2));
1387+
1388+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1389+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1390+ verifyItem(0, -478., 240., true, "Regular", true);
1391+ verifyItem(1, -238, 390., false, "Mild", true);
1392+ verifyItem(2, 152, 390., false, "Bold", false);
1393+ QCOMPARE(lvwph->m_minYExtent, 150.);
1394+ QCOMPARE(lvwph->m_clipItem->y(), 718.);
1395+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1396+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1397+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1398+ QCOMPARE(lvwph->contentY(), 718.);
1399+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1400+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1401+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1402+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1403+ }
1404+
1405+ void testRemoveItemOutOfViewport()
1406+ {
1407+ changeContentY(520);
1408+
1409+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1410+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1411+ verifyItem(0, -280., 240., true, "Regular", true);
1412+ verifyItem(1, -40, 390., false, "Mild", true);
1413+ verifyItem(2, 350, 390., false, "Bold", false);
1414+ verifyItem(3, 740, 350., true, QString(), true);
1415+ QCOMPARE(lvwph->m_minYExtent, 152.5);
1416+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1417+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1418+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1419+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1420+ QCOMPARE(lvwph->contentY(), 520.);
1421+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1422+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1423+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1424+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1425+
1426+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1427+
1428+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1429+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1430+ verifyItem(0, -230., 190., true, "Agressive", true);
1431+ verifyItem(1, -40, 390., false, "Mild", true);
1432+ verifyItem(2, 350, 390., false, "Bold", false);
1433+ verifyItem(3, 740, 350., true, QString(), true);
1434+ QCOMPARE(lvwph->m_minYExtent, -240.);
1435+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1436+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1437+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1438+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1439+ QCOMPARE(lvwph->contentY(), 520.);
1440+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1441+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1442+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1443+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1444+ }
1445+
1446+ void testRemoveFirstOfCategory()
1447+ {
1448+ changeContentY(520);
1449+
1450+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1451+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1452+ verifyItem(0, -280., 240., true, "Regular", true);
1453+ verifyItem(1, -40, 390., false, "Mild", true);
1454+ verifyItem(2, 350, 390., false, "Bold", false);
1455+ verifyItem(3, 740, 350., true, QString(), true);
1456+ QCOMPARE(lvwph->m_minYExtent, 152.5);
1457+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1458+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1459+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1460+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1461+ QCOMPARE(lvwph->contentY(), 520.);
1462+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1463+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1464+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1465+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1466+
1467+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 3), Q_ARG(QVariant, 1));
1468+
1469+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1470+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1471+ verifyItem(0, -280., 240., true, "Regular", true);
1472+ verifyItem(1, -40, 390., false, "Mild", true);
1473+ verifyItem(2, 350, 390., false, "Bold", false);
1474+ verifyItem(3, 740, 390., true, "Lazy", true);
1475+ QCOMPARE(lvwph->m_minYExtent, 152.5);
1476+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1477+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1478+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1479+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1480+ QCOMPARE(lvwph->contentY(), 520.);
1481+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1482+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1483+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1484+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1485+ }
1486+
1487+ void testMoveFirstItems()
1488+ {
1489+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1490+
1491+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1492+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1493+ verifyItem(0, 50., 240., false, "Regular", false);
1494+ verifyItem(1, 290., 190., false, "Agressive", false);
1495+ verifyItem(2, 480., 390., false, "Mild", false);
1496+ QCOMPARE(lvwph->m_minYExtent, 0.);
1497+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1498+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1499+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1500+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1501+ QCOMPARE(lvwph->contentY(), 0.);
1502+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1503+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1504+ }
1505+
1506+ void testMoveFirstOutOfVisibleItems()
1507+ {
1508+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 4), Q_ARG(QVariant, 1));
1509+
1510+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1511+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1512+ verifyItem(0, 50., 240., false, "Regular", false);
1513+ verifyItem(1, 290., 390., false, "Mild", false);
1514+ verifyItem(2, 680., 390., true, "Bold", true);
1515+ QCOMPARE(lvwph->m_minYExtent, 0.);
1516+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1517+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1518+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1519+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1520+ QCOMPARE(lvwph->contentY(), 0.);
1521+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1522+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1523+ }
1524+
1525+ void testMoveFirstToLastAtBottom()
1526+ {
1527+ scrollToBottom();
1528+
1529+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1530+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1531+ verifyItem(0, -588., 390., true, "Bold", true);
1532+ verifyItem(1, -198, 350., false, QString(), true);
1533+ verifyItem(2, 152, 390., false, "Lazy", false);
1534+ QCOMPARE(lvwph->m_minYExtent, 310.);
1535+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1536+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1537+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1538+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1539+ QCOMPARE(lvwph->contentY(), 1458.);
1540+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1541+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1542+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1543+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1544+
1545+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 5), Q_ARG(QVariant, 1));
1546+
1547+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1548+ QCOMPARE(lvwph->m_firstVisibleIndex, 2);
1549+ verifyItem(0, -588., 390., true, "Bold", true);
1550+ verifyItem(1, -198, 350., false, QString(), true);
1551+ verifyItem(2, 152, 390., false, "Lazy", false);
1552+ verifyItem(3, 542, 190., true, "Agressive", true);
1553+ QCOMPARE(lvwph->m_minYExtent, -200./3.);
1554+ QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1555+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1556+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1557+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1558+ QCOMPARE(lvwph->contentY(), 1458.);
1559+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1560+ QVERIFY(!lvwph->isAtYEnd());
1561+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1562+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1563+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1564+ }
1565+
1566+ void testChangeSizeVisibleItemNotOnViewport()
1567+ {
1568+ changeContentY(490);
1569+
1570+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1571+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1572+ verifyItem(0, -440., 190., true, "Agressive", true);
1573+ verifyItem(1, -250., 240., true, "Regular", true);
1574+ verifyItem(2, -10, 390., false, "Mild", true);
1575+ verifyItem(3, 380, 390., false, "Bold", false);
1576+ verifyItem(4, 770, 350., true, QString(), true);
1577+ QCOMPARE(lvwph->m_minYExtent, 0.);
1578+ QCOMPARE(lvwph->m_clipItem->y(), 490.);
1579+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1580+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1581+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1582+ QCOMPARE(lvwph->contentY(), 490.);
1583+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1584+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1585+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1586+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1587+
1588+ model->setProperty(1, "size", 100);
1589+
1590+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1591+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1592+ verifyItem(0, -340., 190., true, "Agressive", true);
1593+ verifyItem(1, -150., 140., true, "Regular", true);
1594+ verifyItem(2, -10, 390., false, "Mild", true);
1595+ verifyItem(3, 380, 390., false, "Bold", false);
1596+ verifyItem(4, 770, 350., true, QString(), true);
1597+ QCOMPARE(lvwph->m_minYExtent, -100.);
1598+ QCOMPARE(lvwph->m_clipItem->y(), 490.);
1599+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1600+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1601+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1602+ QCOMPARE(lvwph->contentY(), 490.);
1603+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1604+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1605+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1606+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1607+ }
1608+
1609+ void testShowHeaderCloseToTheTop()
1610+ {
1611+ changeContentY(375);
1612+
1613+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1614+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1615+ verifyItem(0, -325., 190., true, "Agressive", true);
1616+ verifyItem(1, -135, 240., false, "Regular", true);
1617+ verifyItem(2, 105, 390., false, "Mild", false);
1618+ verifyItem(3, 495, 390., false, "Bold", false);
1619+ QCOMPARE(lvwph->m_minYExtent, 0.);
1620+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1621+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1622+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1623+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1624+ QCOMPARE(lvwph->contentY(), 375.);
1625+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1626+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1627+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1628+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1629+
1630+ lvwph->showHeader();
1631+
1632+ QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1633+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1634+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1635+ verifyItem(0, -375., 190., true, "Agressive", true);
1636+ verifyItem(1, -185, 240., false, "Regular", true);
1637+ verifyItem(2, 55, 390., false, "Mild", false);
1638+ verifyItem(3, 445, 390., false, "Bold", false);
1639+ QCOMPARE(lvwph->m_minYExtent, 50.);
1640+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1641+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1642+ QCOMPARE(lvwph->m_headerItem->y(), 325.);
1643+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1644+ QCOMPARE(lvwph->contentY(), 325.);
1645+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1646+ QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1647+ QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1648+ QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1649+
1650+ scrollToTop();
1651+
1652+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1653+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1654+ verifyItem(0, 50., 190., false, "Agressive", false);
1655+ verifyItem(1, 240., 240., false, "Regular", false);
1656+ verifyItem(2, 480., 390., false, "Mild", false);
1657+ QCOMPARE(lvwph->m_minYExtent, 50.);
1658+ QCOMPARE(lvwph->m_clipItem->y(), -50.);
1659+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1660+ QCOMPARE(lvwph->m_headerItem->y(), -50.);
1661+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1662+ QCOMPARE(lvwph->contentY(), -50.);
1663+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1664+ QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1665+ }
1666+
1667+private:
1668+ QQuickView *view;
1669+ ListViewWithPageHeader *lvwph;
1670+ QQuickListModel *model;
1671+ QQmlComponent *otherDelegate;
1672+};
1673+
1674+QTEST_MAIN(ListViewWithPageHeaderTest)
1675+
1676+#include "listviewwithpageheadertestsection.moc"