on xenial help sign in
My test battery

Unfortunately some of them fail sometimes in Qt5.0, but it's stable here with 5.1

commit7b60b940e7e03ac927d7659c9b3bd44367a65095 authorAlbert Astals <albert.astals@canonical.com> dateFri 7 Jun 2013, 16:42 (13 years ago) parentbbace0d
5 files changed+1564
plugins/ListViewWithPageHeader/plugin.cpp+3 tests/plugins/CMakeLists.txt+1 tests/plugins/ListViewWithPageHeader/CMakeLists.txt+36 tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cpp+1425 tests/plugins/ListViewWithPageHeader/test.qml+99
plugins/ListViewWithPageHeader/plugin.cpp+3
@@ -19,8 +19,11 @@
1919
2020#include "listviewwithpageheader.h"
2121
22+#include <QAbstractItemModel>
23+
2224void ListViewWithPageHeaderPlugin::registerTypes(const char *uri)
2325{
2426 Q_ASSERT(uri == QLatin1String("ListViewWithPageHeader"));
27+ qmlRegisterType<QAbstractItemModel>();
2528 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
2629}
tests/plugins/CMakeLists.txt+1
@@ -1,2 +1,3 @@
11add_subdirectory(Utils)
22add_subdirectory(Ubuntu)
3+add_subdirectory(ListViewWithPageHeader)
tests/plugins/ListViewWithPageHeader/CMakeLists.txtnew file+36
@@ -0,0 +1,36 @@
1+include_directories(
2+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
3+ ${Qt5Quick_INCLUDE_DIRS}
4+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
5+# FIXME There's no cmake var for this :-/
6+ /usr/include/qt5/QtV8/5.0.2/QtV8
7+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader
8+ ${CMAKE_CURRENT_BINARY_DIR}
9+ )
10+
11+remove_definitions(-DQT_NO_KEYWORDS)
12+
13+add_definitions(-DLISTVIEWWITHPAGEHEADER_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
14+add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
15+
16+macro(run_tests)
17+ set(_test_list "")
18+ foreach(_test ${ARGN})
19+ set(testCommand ${CMAKE_CURRENT_BINARY_DIR}/${_test}Exec
20+ -o ${CMAKE_BINARY_DIR}/${_test}.xml,xunitxml
21+ -o -,txt)
22+ add_test(NAME ${_test} COMMAND ${testCommand})
23+ add_custom_target(${_test} ${testCommand})
24+ add_executable(${_test}Exec ${_test}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/ListViewWithPageHeader/listviewwithpageheader.cpp)
25+ qt5_use_modules(${_test}Exec Test Core Qml)
26+ target_link_libraries(${_test}Exec
27+ ${Qt5Gui_LIBRARIES}
28+ ${Qt5Quick_LIBRARIES}
29+ )
30+ set(_test_list "${_test_list};${_test}")
31+ endforeach()
32+endmacro(run_tests)
33+
34+run_tests(
35+ listviewwithpageheadertest
36+ )
tests/plugins/ListViewWithPageHeader/listviewwithpageheadertest.cppnew file+1425
@@ -0,0 +1,1425 @@
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/qquickitem_p.h>
25+
26+class ListViewWithPageHeaderTest : public QObject
27+{
28+ Q_OBJECT
29+
30+private Q_SLOTS:
31+
32+ void initTestCase()
33+ {
34+ }
35+
36+ void init()
37+ {
38+ view = new QQuickView();
39+ view->engine()->addImportPath(BUILT_PLUGINS_DIR);
40+ view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test.qml"));
41+ lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
42+ qDebug() << lvwph;
43+ model = view->rootObject()->findChild<QQuickListModel*>();
44+ otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
45+ QVERIFY(lvwph);
46+ QVERIFY(model);
47+ QVERIFY(otherDelegate);
48+ view->show();
49+ QTest::qWaitForWindowExposed(view);
50+ }
51+
52+ void cleanup()
53+ {
54+ delete view;
55+ }
56+
57+ void verifyItem(int visibleIndex, qreal pos, qreal height, bool culled)
58+ {
59+ QQuickItem *item = lvwph->m_visibleItems[visibleIndex];
60+ QTRY_COMPARE(item->y(), pos);
61+ QTRY_COMPARE(item->height(), height);
62+ QCOMPARE(QQuickItemPrivate::get(item)->culled, culled);
63+ }
64+
65+ void changeContentY(qreal change)
66+ {
67+ const qreal dest = lvwph->contentY() + change;
68+ if (dest > lvwph->contentY()) {
69+ const qreal jump = 25;
70+ while (lvwph->contentY() + jump < dest) {
71+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + jump);
72+ QTest::qWait(0);
73+ }
74+ } else {
75+ const qreal jump = -25;
76+ while (lvwph->contentY() + jump > dest) {
77+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + jump);
78+ QTest::qWait(0);
79+ }
80+ }
81+ lvwph->QQuickFlickable::setContentY(dest);
82+ QTest::qWait(0);
83+ }
84+
85+ void scrollToTop()
86+ {
87+ const qreal jump = -25;
88+ while (!lvwph->isAtYBeginning()) {
89+ if (lvwph->contentY() + jump > -lvwph->minYExtent()) {
90+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + jump);
91+ } else {
92+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() - 1);
93+ }
94+ QTest::qWait(0);
95+ }
96+ }
97+
98+ void scrollToBottom()
99+ {
100+ const qreal jump = 25;
101+ while (!lvwph->isAtYEnd()) {
102+ if (lvwph->contentY() + lvwph->height() + jump < lvwph->contentHeight()) {
103+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + jump);
104+ } else {
105+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + 1);
106+ }
107+ QTest::qWait(0);
108+ }
109+ }
110+
111+ void testCreationDeletion()
112+ {
113+ // Nothing, init/cleanup already tests this
114+ }
115+
116+ void testInitialLayout()
117+ {
118+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
119+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
120+ verifyItem(0, 50., 150., false);
121+ verifyItem(1, 200., 200., false);
122+ verifyItem(2, 400., 350., false);
123+ verifyItem(3, 750., 350., true);
124+ QCOMPARE(lvwph->m_minYExtent, 0.);
125+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
126+ QCOMPARE(lvwph->m_clipItem->clip(), false);
127+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
128+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
129+ QCOMPARE(lvwph->contentY(), 0.);
130+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
131+ }
132+
133+ void testDrag1PixelUp()
134+ {
135+ lvwph->QQuickFlickable::setContentY(lvwph->contentY() + 1);
136+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
137+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
138+ verifyItem(0, 49., 150., false);
139+ verifyItem(1, 199., 200., false);
140+ verifyItem(2, 399., 350., false);
141+ verifyItem(3, 749., 350., true);
142+ QCOMPARE(lvwph->m_minYExtent, 0.);
143+ QCOMPARE(lvwph->m_clipItem->y(), 1.);
144+ QCOMPARE(lvwph->m_clipItem->clip(), false);
145+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
146+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
147+ QCOMPARE(lvwph->contentY(), 1.);
148+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
149+ }
150+
151+ void testHeaderDetachDragDown()
152+ {
153+ QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0));
154+ QTest::qWait(100);
155+ QTest::mouseMove(view, QPoint(0, 5));
156+ QTest::qWait(100);
157+ QTest::mouseMove(view, QPoint(0, 10));
158+ QTest::qWait(100);
159+ QTest::mouseMove(view, QPoint(0, 15));
160+ QTest::qWait(100);
161+ QTest::mouseMove(view, QPoint(0, 20));
162+ QTest::qWait(100);
163+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
164+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
165+ verifyItem(0, 55., 150., false);
166+ verifyItem(1, 205., 200., false);
167+ verifyItem(2, 405., 350., false);
168+ verifyItem(3, 755., 350., true);
169+ QCOMPARE(lvwph->m_minYExtent, 0.);
170+ QCOMPARE(lvwph->m_clipItem->y(), -5.);
171+ QCOMPARE(lvwph->m_clipItem->clip(), false);
172+ QCOMPARE(lvwph->m_headerItem->y(), -5.);
173+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
174+ QCOMPARE(lvwph->contentY(), -5.);
175+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
176+
177+ QTest::mouseRelease(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 15));
178+
179+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
180+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
181+ verifyItem(0, 50., 150., false);
182+ verifyItem(1, 200., 200., false);
183+ verifyItem(2, 400., 350., false);
184+ verifyItem(3, 750., 350., true);
185+ QCOMPARE(lvwph->m_minYExtent, 0.);
186+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
187+ QCOMPARE(lvwph->m_clipItem->clip(), false);
188+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
189+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
190+ QCOMPARE(lvwph->contentY(), 0.);
191+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
192+ }
193+
194+ void testDrag375PixelUp()
195+ {
196+ changeContentY(375);
197+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
198+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
199+ verifyItem(0, -325., 150., true);
200+ verifyItem(1, -175, 200., false);
201+ verifyItem(2, 25, 350., false);
202+ verifyItem(3, 375, 350., false);
203+ verifyItem(4, 725, 350., true);
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+ }
212+
213+ void testDrag520PixelUp()
214+ {
215+ changeContentY(520);
216+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
217+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
218+ verifyItem(0, -320., 200., true);
219+ verifyItem(1, -120, 350., false);
220+ verifyItem(2, 230, 350., false);
221+ verifyItem(3, 580, 350., true);
222+ QCOMPARE(lvwph->m_minYExtent, 0.);
223+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
224+ QCOMPARE(lvwph->m_clipItem->clip(), false);
225+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
226+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
227+ QCOMPARE(lvwph->contentY(), 520.);
228+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
229+ }
230+
231+ void testDragHeaderUpThenShow()
232+ {
233+ changeContentY(120);
234+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
235+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
236+ verifyItem(0, -70., 150., false);
237+ verifyItem(1, 80., 200., false);
238+ verifyItem(2, 280., 350., false);
239+ verifyItem(3, 630., 350., true);
240+ QCOMPARE(lvwph->m_minYExtent, 0.);
241+ QCOMPARE(lvwph->m_clipItem->y(), 120.);
242+ QCOMPARE(lvwph->m_clipItem->clip(), false);
243+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
244+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
245+ QCOMPARE(lvwph->contentY(), 120.);
246+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
247+
248+ changeContentY(-30);
249+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
250+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
251+ verifyItem(0, -70., 150., false);
252+ verifyItem(1, 80., 200., false);
253+ verifyItem(2, 280., 350., false);
254+ verifyItem(3, 630., 350., true);
255+ QCOMPARE(lvwph->m_minYExtent, 0.);
256+ QCOMPARE(lvwph->m_clipItem->y(), 120.);
257+ QCOMPARE(lvwph->m_clipItem->clip(), true);
258+ QTRY_COMPARE(lvwph->m_headerItem->y(), 70.);
259+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
260+ QCOMPARE(lvwph->contentY(), 90.);
261+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
262+ }
263+
264+ void testDragHeaderUpThenShowWithoutHidingTotally()
265+ {
266+ changeContentY(10);
267+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
268+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
269+ verifyItem(0, 40., 150., false);
270+ verifyItem(1, 190., 200., false);
271+ verifyItem(2, 390., 350., false);
272+ verifyItem(3, 740., 350., true);
273+ QCOMPARE(lvwph->m_minYExtent, 0.);
274+ QCOMPARE(lvwph->m_clipItem->y(), 10.);
275+ QCOMPARE(lvwph->m_clipItem->clip(), false);
276+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
277+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
278+ QCOMPARE(lvwph->contentY(), 10.);
279+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
280+
281+ changeContentY(-1);
282+
283+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
284+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
285+ verifyItem(0, 41., 150., false);
286+ verifyItem(1, 191., 200., false);
287+ verifyItem(2, 391., 350., false);
288+ verifyItem(3, 741., 350., true);
289+ QCOMPARE(lvwph->m_minYExtent, 0.);
290+ QCOMPARE(lvwph->m_clipItem->y(), 9.);
291+ QCOMPARE(lvwph->m_clipItem->clip(), false);
292+ QTRY_COMPARE(lvwph->m_headerItem->y(), 0.);
293+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
294+ QCOMPARE(lvwph->contentY(), 9.);
295+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
296+ }
297+
298+ void testPositionAtBeginningIndex0Visible()
299+ {
300+ changeContentY(375);
301+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
302+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
303+ verifyItem(0, -325., 150., true);
304+ verifyItem(1, -175, 200., false);
305+ verifyItem(2, 25, 350., false);
306+ verifyItem(3, 375, 350., false);
307+ verifyItem(4, 725, 350., true);
308+ QCOMPARE(lvwph->m_minYExtent, 0.);
309+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
310+ QCOMPARE(lvwph->m_clipItem->clip(), false);
311+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
312+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
313+ QCOMPARE(lvwph->contentY(), 375.);
314+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
315+
316+ lvwph->positionAtBeginning();
317+
318+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
319+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
320+ verifyItem(0, 50., 150., false);
321+ verifyItem(1, 200., 200., false);
322+ verifyItem(2, 400., 350., false);
323+ verifyItem(3, 750., 350., true);
324+ QCOMPARE(lvwph->m_minYExtent, 0.);
325+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
326+ QCOMPARE(lvwph->m_clipItem->clip(), false);
327+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
328+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
329+ QCOMPARE(lvwph->contentY(), 0.);
330+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
331+ }
332+
333+ void testPositionAtBeginningIndex0NotVisible()
334+ {
335+ changeContentY(520);
336+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
337+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
338+ verifyItem(0, -320., 200., true);
339+ verifyItem(1, -120, 350., false);
340+ verifyItem(2, 230, 350., false);
341+ verifyItem(3, 580, 350., true);
342+ QCOMPARE(lvwph->m_minYExtent, 0.);
343+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
344+ QCOMPARE(lvwph->m_clipItem->clip(), false);
345+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
346+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
347+ QCOMPARE(lvwph->contentY(), 520.);
348+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
349+
350+ lvwph->positionAtBeginning();
351+
352+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
353+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
354+ verifyItem(0, 50., 150., false);
355+ verifyItem(1, 200., 200., false);
356+ verifyItem(2, 400., 350., false);
357+ verifyItem(3, 750., 350., true);
358+ QCOMPARE(lvwph->m_minYExtent, 0.);
359+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
360+ QCOMPARE(lvwph->m_clipItem->clip(), false);
361+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
362+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
363+ QCOMPARE(lvwph->contentY(), 0.);
364+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
365+ }
366+
367+ void testIndex0GrowOnScreen()
368+ {
369+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
370+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
371+ verifyItem(0, 50., 150., false);
372+ verifyItem(1, 200., 200., false);
373+ verifyItem(2, 400., 350., false);
374+ verifyItem(3, 750., 350., true);
375+ QCOMPARE(lvwph->m_minYExtent, 0.);
376+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
377+ QCOMPARE(lvwph->m_clipItem->clip(), false);
378+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
379+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
380+ QCOMPARE(lvwph->contentY(), 0.);
381+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
382+
383+ model->setProperty(0, "size", 400);
384+
385+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
386+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
387+ verifyItem(0, 50., 400., false);
388+ verifyItem(1, 450., 200., false);
389+ verifyItem(2, 650., 350., true);
390+ QCOMPARE(lvwph->m_minYExtent, 0.);
391+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
392+ QCOMPARE(lvwph->m_clipItem->clip(), false);
393+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
394+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
395+ QCOMPARE(lvwph->contentY(), 0.);
396+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
397+ }
398+
399+ void testIndex0GrowOffScreen()
400+ {
401+ changeContentY(375);
402+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
403+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
404+ verifyItem(0, -325., 150., true);
405+ verifyItem(1, -175, 200., false);
406+ verifyItem(2, 25, 350., false);
407+ verifyItem(3, 375, 350., false);
408+ verifyItem(4, 725, 350., true);
409+ QCOMPARE(lvwph->m_minYExtent, 0.);
410+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
411+ QCOMPARE(lvwph->m_clipItem->clip(), false);
412+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
413+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
414+ QCOMPARE(lvwph->contentY(), 375.);
415+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
416+
417+ model->setProperty(0, "size", 400);
418+
419+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
420+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
421+ verifyItem(0, -575., 400., true);
422+ verifyItem(1, -175, 200., false);
423+ verifyItem(2, 25, 350., false);
424+ verifyItem(3, 375, 350., false);
425+ verifyItem(4, 725, 350., true);
426+ QCOMPARE(lvwph->m_minYExtent, 250.);
427+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
428+ QCOMPARE(lvwph->m_clipItem->clip(), false);
429+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
430+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
431+ QCOMPARE(lvwph->contentY(), 375.);
432+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
433+
434+ scrollToTop();
435+
436+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
437+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
438+ verifyItem(0, 50., 400., false);
439+ verifyItem(1, 450, 200., false);
440+ verifyItem(2, 650, 350., true);
441+ QCOMPARE(lvwph->m_minYExtent, 250.);
442+ QCOMPARE(lvwph->m_clipItem->y(), -250.);
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(), -250.);
447+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
448+
449+ changeContentY(30);
450+
451+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
452+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
453+ verifyItem(0, 20., 400., false);
454+ verifyItem(1, 420, 200., false);
455+ verifyItem(2, 620, 350., true);
456+ QCOMPARE(lvwph->m_minYExtent, 250.);
457+ QCOMPARE(lvwph->m_clipItem->y(), -220.);
458+ QCOMPARE(lvwph->m_clipItem->clip(), false);
459+ QCOMPARE(lvwph->m_headerItem->y(), -250.);
460+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
461+ QCOMPARE(lvwph->contentY(), -220.);
462+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
463+ }
464+
465+ void testIndex0GrowNotCreated()
466+ {
467+ changeContentY(520);
468+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
469+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
470+ verifyItem(0, -320., 200., true);
471+ verifyItem(1, -120, 350., false);
472+ verifyItem(2, 230, 350., false);
473+ verifyItem(3, 580, 350., true);
474+ QCOMPARE(lvwph->m_minYExtent, 0.);
475+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
476+ QCOMPARE(lvwph->m_clipItem->clip(), false);
477+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
478+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
479+ QCOMPARE(lvwph->contentY(), 520.);
480+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
481+
482+ model->setProperty(0, "size", 400);
483+
484+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
485+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
486+ verifyItem(0, -320., 200., true);
487+ verifyItem(1, -120, 350., false);
488+ verifyItem(2, 230, 350., false);
489+ verifyItem(3, 580, 350., true);
490+ QCOMPARE(lvwph->m_minYExtent, 0.);
491+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
492+ QCOMPARE(lvwph->m_clipItem->clip(), false);
493+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
494+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
495+ QCOMPARE(lvwph->contentY(), 520.);
496+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
497+
498+ scrollToTop();
499+
500+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
501+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
502+ verifyItem(0, 50., 400., false);
503+ verifyItem(1, 450, 200., false);
504+ verifyItem(2, 650, 350., true);
505+ QCOMPARE(lvwph->m_minYExtent, 250.);
506+ QCOMPARE(lvwph->m_clipItem->y(), -250.);
507+ QCOMPARE(lvwph->m_clipItem->clip(), false);
508+ QCOMPARE(lvwph->m_headerItem->y(), -250.);
509+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
510+ QCOMPARE(lvwph->contentY(), -250.);
511+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
512+ }
513+
514+ void testShowHideShowHeaderAtBottom()
515+ {
516+ scrollToBottom();
517+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
518+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
519+ verifyItem(0, -508., 350., true);
520+ verifyItem(1, -158, 350., false);
521+ verifyItem(2, 192, 350., false);
522+ QCOMPARE(lvwph->m_minYExtent, 0.);
523+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
524+ QCOMPARE(lvwph->m_clipItem->clip(), false);
525+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
526+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
527+ QCOMPARE(lvwph->contentY(), 1258.);
528+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
529+
530+ changeContentY(-30);
531+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
532+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
533+ verifyItem(0, -508., 350., true);
534+ verifyItem(1, -158, 350., false);
535+ verifyItem(2, 192, 350., false);
536+ QCOMPARE(lvwph->m_minYExtent, 0.);
537+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
538+ QCOMPARE(lvwph->m_clipItem->clip(), true);
539+ QCOMPARE(lvwph->m_headerItem->y(), 1208.);
540+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
541+ QCOMPARE(lvwph->contentY(), 1228.);
542+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
543+
544+ changeContentY(30);
545+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
546+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
547+ verifyItem(0, -508., 350., true);
548+ verifyItem(1, -158, 350., false);
549+ verifyItem(2, 192, 350., false);
550+ QCOMPARE(lvwph->m_minYExtent, 0.);
551+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
552+ QCOMPARE(lvwph->m_clipItem->clip(), false);
553+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
554+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
555+ QCOMPARE(lvwph->contentY(), 1258.);
556+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
557+
558+ changeContentY(-30);
559+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
560+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
561+ verifyItem(0, -508., 350., true);
562+ verifyItem(1, -158, 350., false);
563+ verifyItem(2, 192, 350., false);
564+ QCOMPARE(lvwph->m_minYExtent, 0.);
565+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
566+ QCOMPARE(lvwph->m_clipItem->clip(), true);
567+ QCOMPARE(lvwph->m_headerItem->y(), 1208.);
568+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
569+ QCOMPARE(lvwph->contentY(), 1228.);
570+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
571+ }
572+
573+ void testChangeDelegateAtBottom()
574+ {
575+ scrollToBottom();
576+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
577+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
578+ verifyItem(0, -508., 350., true);
579+ verifyItem(1, -158, 350., false);
580+ verifyItem(2, 192, 350., false);
581+ QCOMPARE(lvwph->m_minYExtent, 0.);
582+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
583+ QCOMPARE(lvwph->m_clipItem->clip(), false);
584+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
585+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
586+ QCOMPARE(lvwph->contentY(), 1258.);
587+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
588+
589+ lvwph->setDelegate(otherDelegate);
590+
591+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 6);
592+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
593+ verifyItem(0, 50., 35., false);
594+ verifyItem(1, 85, 35., false);
595+ verifyItem(2, 120, 35., false);
596+ verifyItem(3, 155, 35., false);
597+ verifyItem(4, 190, 35., false);
598+ verifyItem(5, 225, 35., false);
599+ QCOMPARE(lvwph->m_minYExtent, 0.);
600+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
601+ QCOMPARE(lvwph->m_clipItem->clip(), false);
602+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
603+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
604+ QCOMPARE(lvwph->contentY(), 0.);
605+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
606+ }
607+
608+ void testGrowHeaderAtTop()
609+ {
610+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
611+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
612+ verifyItem(0, 50., 150., false);
613+ verifyItem(1, 200., 200., false);
614+ verifyItem(2, 400., 350., false);
615+ verifyItem(3, 750., 350., true);
616+ QCOMPARE(lvwph->m_minYExtent, 0.);
617+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
618+ QCOMPARE(lvwph->m_clipItem->clip(), false);
619+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
620+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
621+ QCOMPARE(lvwph->contentY(), 0.);
622+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
623+
624+ lvwph->m_headerItem->setHeight(100);
625+
626+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
627+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
628+ verifyItem(0, 100., 150., false);
629+ verifyItem(1, 250., 200., false);
630+ verifyItem(2, 450., 350., false);
631+ verifyItem(3, 800., 350., true);
632+ QCOMPARE(lvwph->m_minYExtent, 0.);
633+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
634+ QCOMPARE(lvwph->m_clipItem->clip(), false);
635+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
636+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
637+ QCOMPARE(lvwph->contentY(), 0.);
638+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
639+ }
640+
641+ void testGrowHeaderAtBottom()
642+ {
643+ scrollToBottom();
644+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
645+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
646+ verifyItem(0, -508., 350., true);
647+ verifyItem(1, -158, 350., false);
648+ verifyItem(2, 192, 350., false);
649+ QCOMPARE(lvwph->m_minYExtent, 0.);
650+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
651+ QCOMPARE(lvwph->m_clipItem->clip(), false);
652+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
653+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
654+ QCOMPARE(lvwph->contentY(), 1258.);
655+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
656+
657+ lvwph->m_headerItem->setHeight(100);
658+
659+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
660+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
661+ verifyItem(0, -508., 350., true);
662+ verifyItem(1, -158, 350., false);
663+ verifyItem(2, 192, 350., false);
664+ QCOMPARE(lvwph->m_minYExtent, -650.);
665+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
666+ QCOMPARE(lvwph->m_clipItem->clip(), false);
667+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
668+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
669+ QCOMPARE(lvwph->contentY(), 1258.);
670+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
671+
672+ changeContentY(-30);
673+
674+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
675+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
676+ verifyItem(0, -508., 350., true);
677+ verifyItem(1, -158, 350., false);
678+ verifyItem(2, 192, 350., false);
679+ QCOMPARE(lvwph->m_minYExtent, -650.);
680+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
681+ QCOMPARE(lvwph->m_clipItem->clip(), true);
682+ QCOMPARE(lvwph->m_headerItem->y(), 1158.);
683+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
684+ QCOMPARE(lvwph->contentY(), 1228.);
685+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
686+
687+
688+ scrollToTop();
689+
690+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
691+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
692+ verifyItem(0, 100., 150., false);
693+ verifyItem(1, 250., 200., false);
694+ verifyItem(2, 450., 350., false);
695+ verifyItem(3, 800., 350., true);
696+ QCOMPARE(lvwph->m_minYExtent, 50.);
697+ QCOMPARE(lvwph->m_clipItem->y(), -50.);
698+ QCOMPARE(lvwph->m_clipItem->clip(), false);
699+ QCOMPARE(lvwph->m_headerItem->y(), -50.);
700+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
701+ QCOMPARE(lvwph->contentY(), -50.);
702+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
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, -508., 350., true);
711+ verifyItem(1, -158, 350., false);
712+ verifyItem(2, 192, 350., false);
713+ QCOMPARE(lvwph->m_minYExtent, 0.);
714+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
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(), 1258.);
719+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
720+
721+ changeContentY(-30);
722+
723+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
724+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
725+ verifyItem(0, -508., 350., true);
726+ verifyItem(1, -158, 350., false);
727+ verifyItem(2, 192, 350., false);
728+ QCOMPARE(lvwph->m_minYExtent, 0.);
729+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
730+ QCOMPARE(lvwph->m_clipItem->clip(), true);
731+ QCOMPARE(lvwph->m_headerItem->y(), 1208.);
732+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
733+ QCOMPARE(lvwph->contentY(), 1228.);
734+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
735+
736+ lvwph->m_headerItem->setHeight(100);
737+
738+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
739+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
740+ verifyItem(0, -508., 350., true);
741+ verifyItem(1, -158, 350., false);
742+ verifyItem(2, 192, 350., false);
743+ QCOMPARE(lvwph->m_minYExtent, -700.);
744+ QCOMPARE(lvwph->m_clipItem->y(), 1308.);
745+ QCOMPARE(lvwph->m_clipItem->clip(), true);
746+ QCOMPARE(lvwph->m_headerItem->y(), 1208.);
747+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
748+ QCOMPARE(lvwph->contentY(), 1228.);
749+ QCOMPARE(lvwph->m_headerItemShownHeight, 80.);
750+
751+ scrollToTop();
752+
753+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
754+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
755+ verifyItem(0, 100., 150., false);
756+ verifyItem(1, 250., 200., false);
757+ verifyItem(2, 450., 350., false);
758+ verifyItem(3, 800., 350., true);
759+ QCOMPARE(lvwph->m_minYExtent, 0.);
760+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
761+ QCOMPARE(lvwph->m_clipItem->clip(), false);
762+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
763+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
764+ QCOMPARE(lvwph->contentY(), 0.);
765+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
766+ }
767+
768+ void testShrinkHeaderMoreThanPartlyShown()
769+ {
770+ scrollToBottom();
771+ lvwph->m_headerItem->setHeight(100);
772+ changeContentY(-30);
773+
774+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
775+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
776+ verifyItem(0, -508., 350., true);
777+ verifyItem(1, -158, 350., false);
778+ verifyItem(2, 192, 350., false);
779+ QCOMPARE(lvwph->m_minYExtent, -650.);
780+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
781+ QCOMPARE(lvwph->m_clipItem->clip(), true);
782+ QCOMPARE(lvwph->m_headerItem->y(), 1158.);
783+ QCOMPARE(lvwph->m_headerItem->height(), 100.);
784+ QCOMPARE(lvwph->contentY(), 1228.);
785+ QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
786+
787+ lvwph->m_headerItem->setHeight(50);
788+
789+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
790+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
791+ verifyItem(0, -508., 350., true);
792+ verifyItem(1, -158, 350., false);
793+ verifyItem(2, 192, 350., false);
794+ QCOMPARE(lvwph->m_minYExtent, -670.);
795+ QCOMPARE(lvwph->m_clipItem->y(), 1228.);
796+ QCOMPARE(lvwph->m_clipItem->clip(), false);
797+ QCOMPARE(lvwph->m_headerItem->y(), 1158.);
798+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
799+ QCOMPARE(lvwph->contentY(), 1228.);
800+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
801+ QTRY_VERIFY(lvwph->isAtYEnd());
802+
803+ scrollToTop();
804+
805+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
806+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
807+ verifyItem(0, 50., 150., false);
808+ verifyItem(1, 200., 200., false);
809+ verifyItem(2, 400., 350., false);
810+ verifyItem(3, 750., 350., true);
811+ QCOMPARE(lvwph->m_minYExtent, 30.);
812+ QCOMPARE(lvwph->m_clipItem->y(), -30.);
813+ QCOMPARE(lvwph->m_clipItem->clip(), false);
814+ QCOMPARE(lvwph->m_headerItem->y(), -30.);
815+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
816+ QCOMPARE(lvwph->contentY(), -30.);
817+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
818+ }
819+
820+ void testSetEmptyHeaderAtTop()
821+ {
822+ lvwph->setHeader(nullptr);
823+
824+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
825+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
826+ verifyItem(0, 0., 150., false);
827+ verifyItem(1, 150., 200., false);
828+ verifyItem(2, 350., 350., false);
829+ verifyItem(3, 700., 350., true);
830+ QCOMPARE(lvwph->m_minYExtent, 0.);
831+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
832+ QCOMPARE(lvwph->m_clipItem->clip(), false);
833+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
834+ QCOMPARE(lvwph->contentY(), 0.);
835+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
836+ }
837+
838+ void testSetEmptyHeaderAtBottom()
839+ {
840+ scrollToBottom();
841+ lvwph->setHeader(nullptr);
842+
843+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
844+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
845+ verifyItem(0, -508., 350., true);
846+ verifyItem(1, -158, 350., false);
847+ verifyItem(2, 192, 350., false);
848+ QCOMPARE(lvwph->m_minYExtent, -750.);
849+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
850+ QCOMPARE(lvwph->m_clipItem->clip(), false);
851+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
852+ QCOMPARE(lvwph->contentY(), 1258.);
853+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
854+
855+ scrollToTop();
856+
857+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
858+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
859+ verifyItem(0, 0., 150., false);
860+ verifyItem(1, 150., 200., false);
861+ verifyItem(2, 350., 350., false);
862+ verifyItem(3, 700., 350., true);
863+ QCOMPARE(lvwph->m_minYExtent, -50.);
864+ QCOMPARE(lvwph->m_clipItem->y(), 50.);
865+ QCOMPARE(lvwph->m_clipItem->clip(), false);
866+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
867+ QCOMPARE(lvwph->contentY(), 50.);
868+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
869+ }
870+
871+ void testSetEmptyHeaderWhenPartlyShownClipped()
872+ {
873+ scrollToBottom();
874+ changeContentY(-30);
875+ lvwph->setHeader(nullptr);
876+
877+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
878+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
879+ verifyItem(0, -508., 350., true);
880+ verifyItem(1, -158, 350., false);
881+ verifyItem(2, 192, 350., false);
882+ QCOMPARE(lvwph->m_minYExtent, -720.);
883+ QCOMPARE(lvwph->m_clipItem->y(), 1228.);
884+ QCOMPARE(lvwph->m_clipItem->clip(), false);
885+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
886+ QCOMPARE(lvwph->contentY(), 1228.);
887+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
888+ QTRY_VERIFY(lvwph->isAtYEnd());
889+
890+ scrollToTop();
891+
892+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
893+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
894+ verifyItem(0, 0., 150., false);
895+ verifyItem(1, 150., 200., false);
896+ verifyItem(2, 350., 350., false);
897+ verifyItem(3, 700., 350., true);
898+ QCOMPARE(lvwph->m_minYExtent, -20.);
899+ QCOMPARE(lvwph->m_clipItem->y(), 20.);
900+ QCOMPARE(lvwph->m_clipItem->clip(), false);
901+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
902+ QCOMPARE(lvwph->contentY(), 20.);
903+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
904+ }
905+
906+ void testSetEmptyHeaderWhenPartlyShownNotClipped()
907+ {
908+ changeContentY(30);
909+ lvwph->setHeader(nullptr);
910+
911+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
912+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
913+ verifyItem(0, -30., 150., false);
914+ verifyItem(1, 120., 200., false);
915+ verifyItem(2, 320., 350., false);
916+ verifyItem(3, 670., 350., true);
917+ QCOMPARE(lvwph->m_minYExtent, 0.);
918+ QCOMPARE(lvwph->m_clipItem->y(), 30.);
919+ QCOMPARE(lvwph->m_clipItem->clip(), false);
920+ QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
921+ QCOMPARE(lvwph->contentY(), 30.);
922+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
923+ }
924+
925+ void testSetNullDelegate()
926+ {
927+ lvwph->setDelegate(nullptr);
928+
929+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 0);
930+ QCOMPARE(lvwph->m_firstVisibleIndex, -1);
931+ QCOMPARE(lvwph->m_minYExtent, 0.);
932+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
933+ QCOMPARE(lvwph->m_clipItem->clip(), false);
934+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
935+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
936+ QCOMPARE(lvwph->contentY(), 0.);
937+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
938+ QTRY_COMPARE(lvwph->contentHeight(), 50.);
939+ QVERIFY(lvwph->isAtYBeginning());
940+ QVERIFY(lvwph->isAtYEnd());
941+ }
942+
943+ void testInsertItems()
944+ {
945+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100));
946+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125));
947+
948+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
949+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
950+ verifyItem(0, 50., 150., false);
951+ verifyItem(1, 200., 125., false);
952+ verifyItem(2, 325., 100., false);
953+ verifyItem(3, 425., 200., false);
954+ verifyItem(4, 625., 350., true);
955+ QCOMPARE(lvwph->m_minYExtent, 0.);
956+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
957+ QCOMPARE(lvwph->m_clipItem->clip(), false);
958+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
959+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
960+ QCOMPARE(lvwph->contentY(), 0.);
961+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
962+ }
963+
964+ void testInsertItemsOnNotShownPosition()
965+ {
966+ changeContentY(700);
967+
968+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
969+ QCOMPARE(lvwph->m_firstVisibleIndex, 2);
970+ verifyItem(0, -300., 350., false);
971+ verifyItem(1, 50, 350., false);
972+ verifyItem(2, 400, 350., false);
973+ verifyItem(3, 750, 350., true);
974+ QCOMPARE(lvwph->m_minYExtent, 0.);
975+ QCOMPARE(lvwph->m_clipItem->y(), 700.);
976+ QCOMPARE(lvwph->m_clipItem->clip(), false);
977+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
978+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
979+ QCOMPARE(lvwph->contentY(), 700.);
980+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
981+
982+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100));
983+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125));
984+
985+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
986+ QCOMPARE(lvwph->m_firstVisibleIndex, 4);
987+ verifyItem(0, -300., 350., false);
988+ verifyItem(1, 50, 350., false);
989+ verifyItem(2, 400, 350., false);
990+ verifyItem(3, 750, 350., true);
991+ QCOMPARE(lvwph->m_minYExtent, 0.);
992+ QCOMPARE(lvwph->m_clipItem->y(), 700.);
993+ QCOMPARE(lvwph->m_clipItem->clip(), false);
994+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
995+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
996+ QCOMPARE(lvwph->contentY(), 700.);
997+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
998+
999+ scrollToTop();
1000+
1001+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1002+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1003+ verifyItem(0, 50., 150., false);
1004+ verifyItem(1, 200., 125., false);
1005+ verifyItem(2, 325., 100., false);
1006+ verifyItem(3, 425., 200., false);
1007+ verifyItem(4, 625., 350., true);
1008+ QCOMPARE(lvwph->m_minYExtent, 225.);
1009+ QCOMPARE(lvwph->m_clipItem->y(), -225.);
1010+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1011+ QCOMPARE(lvwph->m_headerItem->y(), -225.);
1012+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1013+ QCOMPARE(lvwph->contentY(), -225.);
1014+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1015+ }
1016+
1017+ void testInsertItemsAtEndOfViewport()
1018+ {
1019+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 100));
1020+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 125));
1021+
1022+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1023+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1024+ verifyItem(0, 50., 150., false);
1025+ verifyItem(1, 200., 200., false);
1026+ verifyItem(2, 400., 350., false);
1027+ verifyItem(3, 750., 125., true);
1028+ QCOMPARE(lvwph->m_minYExtent, 0.);
1029+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1030+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1031+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1032+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1033+ QCOMPARE(lvwph->contentY(), 0.);
1034+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1035+ }
1036+
1037+ void testInsertItemsBeforeValidIndex()
1038+ {
1039+ changeContentY(520);
1040+
1041+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1042+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1043+ verifyItem(0, -320., 200., true);
1044+ verifyItem(1, -120, 350., false);
1045+ verifyItem(2, 230, 350., false);
1046+ verifyItem(3, 580, 350., true);
1047+ QCOMPARE(lvwph->m_minYExtent, 0.);
1048+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1049+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1050+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1051+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1052+ QCOMPARE(lvwph->contentY(), 520.);
1053+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1054+
1055+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100));
1056+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125));
1057+
1058+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1059+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1060+ verifyItem(0, -320., 200., true);
1061+ verifyItem(1, -120, 350., false);
1062+ verifyItem(2, 230, 350., false);
1063+ verifyItem(3, 580, 350., true);
1064+ QCOMPARE(lvwph->m_minYExtent, 0.);
1065+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1066+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1067+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1068+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1069+ QCOMPARE(lvwph->contentY(), 520.);
1070+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1071+ }
1072+
1073+ void testInsertItemsBeforeViewport()
1074+ {
1075+ changeContentY(375);
1076+
1077+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1078+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1079+ verifyItem(0, -325., 150., true);
1080+ verifyItem(1, -175, 200., false);
1081+ verifyItem(2, 25, 350., false);
1082+ verifyItem(3, 375, 350., false);
1083+ verifyItem(4, 725, 350., true);
1084+ QCOMPARE(lvwph->m_minYExtent, 0.);
1085+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1086+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1087+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1088+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1089+ QCOMPARE(lvwph->contentY(), 375.);
1090+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1091+
1092+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100));
1093+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125));
1094+
1095+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1096+ QCOMPARE(lvwph->m_firstVisibleIndex, 2);
1097+ verifyItem(0, -275., 100., true);
1098+ verifyItem(1, -175, 200., false);
1099+ verifyItem(2, 25, 350., false);
1100+ verifyItem(3, 375, 350., false);
1101+ verifyItem(4, 725, 350., true);
1102+ QCOMPARE(lvwph->m_minYExtent, -50.);
1103+ QCOMPARE(lvwph->m_clipItem->y(), 375.);
1104+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1105+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1106+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1107+ QCOMPARE(lvwph->contentY(), 375.);
1108+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1109+
1110+ scrollToTop();
1111+
1112+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1113+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1114+ verifyItem(0, 50., 150., false);
1115+ verifyItem(1, 200., 125., false);
1116+ verifyItem(2, 325., 100., false);
1117+ verifyItem(3, 425., 200., false);
1118+ verifyItem(4, 625., 350., true);
1119+ QCOMPARE(lvwph->m_minYExtent, 225.);
1120+ QCOMPARE(lvwph->m_clipItem->y(), -225.);
1121+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1122+ QCOMPARE(lvwph->m_headerItem->y(), -225.);
1123+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1124+ QCOMPARE(lvwph->contentY(), -225.);
1125+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1126+ }
1127+
1128+ void testInsertItemsAtBottom()
1129+ {
1130+ scrollToBottom();
1131+
1132+ QVERIFY(lvwph->isAtYEnd());
1133+
1134+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 100));
1135+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 125));
1136+
1137+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1138+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1139+ verifyItem(0, -508., 350., true);
1140+ verifyItem(1, -158, 350., false);
1141+ verifyItem(2, 192, 350., false);
1142+ verifyItem(3, 542, 125., true);
1143+ verifyItem(4, 667, 100., true);
1144+ QCOMPARE(lvwph->m_minYExtent, 0.);
1145+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
1146+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1147+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1148+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1149+ QCOMPARE(lvwph->contentY(), 1258.);
1150+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1151+ QVERIFY(!lvwph->isAtYEnd());
1152+
1153+ scrollToBottom();
1154+
1155+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1156+ QCOMPARE(lvwph->m_firstVisibleIndex, 4);
1157+ verifyItem(0, -383., 350., true);
1158+ verifyItem(1, -33, 350., false);
1159+ verifyItem(2, 317, 125., false);
1160+ verifyItem(3, 442, 100., false);
1161+ QCOMPARE(lvwph->m_minYExtent, 0.);
1162+ QCOMPARE(lvwph->m_clipItem->y(), 1483.);
1163+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1164+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1165+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1166+ QCOMPARE(lvwph->contentY(), 1483.);
1167+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1168+ QVERIFY(lvwph->isAtYEnd());
1169+ }
1170+
1171+ void testInsertItemAtTop()
1172+ {
1173+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1174+
1175+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1176+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1177+ verifyItem(0, 50., 75., false);
1178+ verifyItem(1, 125., 150., false);
1179+ verifyItem(2, 275., 200., false);
1180+ verifyItem(3, 475., 350., false);
1181+ QCOMPARE(lvwph->m_minYExtent, 0.);
1182+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1183+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1184+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1185+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1186+ QCOMPARE(lvwph->contentY(), 0.);
1187+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1188+ QVERIFY(lvwph->isAtYBeginning());
1189+ }
1190+
1191+ void testInsertItem10SmallItemsAtTopWhenAtBottom()
1192+ {
1193+ scrollToBottom();
1194+
1195+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1196+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1197+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1198+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1199+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1200+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1201+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1202+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1203+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1204+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75));
1205+
1206+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1207+ QCOMPARE(lvwph->m_firstVisibleIndex, 13);
1208+ verifyItem(0, -508., 350., true);
1209+ verifyItem(1, -158, 350., false);
1210+ verifyItem(2, 192, 350., false);
1211+ QCOMPARE(lvwph->m_minYExtent, 0.);
1212+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
1213+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1214+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1215+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1216+ QCOMPARE(lvwph->contentY(), 1258.);
1217+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1218+
1219+ changeContentY(-1700);
1220+
1221+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 12);
1222+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1223+ verifyItem(0, -308., 75., true);
1224+ verifyItem(1, -233., 75., true);
1225+ verifyItem(2, -158., 75., true);
1226+ // TODO This is not visible culled should be true, but at the moment
1227+ // we do not cull taking the clip/m_headerItemShownHeight into account
1228+ // not a big thing but may be nice to fix in the future
1229+ verifyItem(3, -83., 75., false);
1230+ verifyItem(4, -8., 75., false);
1231+ verifyItem(5, 67., 75., false);
1232+ verifyItem(6, 142., 75., false);
1233+ verifyItem(7, 217., 75., false);
1234+ verifyItem(8, 292., 75., false);
1235+ verifyItem(9, 367., 75., false);
1236+ verifyItem(10, 442., 150., false);
1237+ verifyItem(11, 592., 200., true);
1238+ QCOMPARE(lvwph->m_minYExtent, 750.);
1239+ QCOMPARE(lvwph->m_clipItem->y(), -392.);
1240+ QCOMPARE(lvwph->m_clipItem->clip(), true);
1241+ QCOMPARE(lvwph->m_headerItem->y(), -442.);
1242+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1243+ QCOMPARE(lvwph->contentY(), -442.);
1244+ QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1245+ }
1246+
1247+ void testRemoveItemsAtTop()
1248+ {
1249+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1250+
1251+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1252+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1253+ verifyItem(0, 50., 350., false);
1254+ verifyItem(1, 400., 350., false);
1255+ verifyItem(2, 750., 350., true);
1256+ QCOMPARE(lvwph->m_minYExtent, 0.);
1257+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1258+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1259+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1260+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1261+ QCOMPARE(lvwph->contentY(), 0.);
1262+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1263+ QVERIFY(lvwph->isAtYBeginning());
1264+ }
1265+
1266+ void testRemoveNonCreatedItemsAtTopWhenAtBottom()
1267+ {
1268+ scrollToBottom();
1269+
1270+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1271+
1272+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1273+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1274+ verifyItem(0, -508., 350., true);
1275+ verifyItem(1, -158, 350., false);
1276+ verifyItem(2, 192, 350., false);
1277+ QCOMPARE(lvwph->m_minYExtent, 0.);
1278+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
1279+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1280+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1281+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1282+ QCOMPARE(lvwph->contentY(), 1258.);
1283+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1284+ }
1285+
1286+ void testRemoveLastItemsAtBottom()
1287+ {
1288+ scrollToBottom();
1289+
1290+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 4), Q_ARG(QVariant, 2));
1291+
1292+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1293+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1294+ verifyItem(0, -358., 200., true);
1295+ verifyItem(1, -158, 350., false);
1296+ verifyItem(2, 192, 350., false);
1297+ QCOMPARE(lvwph->m_minYExtent, -150.);
1298+ QCOMPARE(lvwph->m_clipItem->y(), 558.);
1299+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1300+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1301+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1302+ QCOMPARE(lvwph->contentY(), 558.);
1303+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1304+ }
1305+
1306+ void testRemoveItemOutOfViewport()
1307+ {
1308+ changeContentY(520);
1309+
1310+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1311+ QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1312+ verifyItem(0, -320., 200., true);
1313+ verifyItem(1, -120, 350., false);
1314+ verifyItem(2, 230, 350., false);
1315+ verifyItem(3, 580, 350., true);
1316+ QCOMPARE(lvwph->m_minYExtent, 0.);
1317+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1318+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1319+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1320+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1321+ QCOMPARE(lvwph->contentY(), 520.);
1322+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1323+
1324+
1325+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1326+
1327+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1328+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1329+ verifyItem(0, -270., 150., true);
1330+ verifyItem(1, -120., 350., false);
1331+ verifyItem(2, 230, 350., false);
1332+ verifyItem(3, 580, 350., true);
1333+ QCOMPARE(lvwph->m_minYExtent, -200.);
1334+ QCOMPARE(lvwph->m_clipItem->y(), 520.);
1335+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1336+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1337+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1338+ QCOMPARE(lvwph->contentY(), 520.);
1339+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1340+ }
1341+
1342+ void testMoveFirstItems()
1343+ {
1344+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1345+
1346+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1347+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1348+ verifyItem(0, 50., 200., false);
1349+ verifyItem(1, 250., 150., false);
1350+ verifyItem(2, 400., 350., false);
1351+ verifyItem(3, 750., 350., true);
1352+ QCOMPARE(lvwph->m_minYExtent, 0.);
1353+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1354+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1355+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1356+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1357+ QCOMPARE(lvwph->contentY(), 0.);
1358+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1359+
1360+ }
1361+
1362+ void testMoveFirstOutOfVisibleItems()
1363+ {
1364+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 4), Q_ARG(QVariant, 1));
1365+
1366+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1367+ QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1368+ verifyItem(0, 50., 200., false);
1369+ verifyItem(1, 250., 350., false);
1370+ verifyItem(2, 600., 350., true);
1371+ QCOMPARE(lvwph->m_minYExtent, 0.);
1372+ QCOMPARE(lvwph->m_clipItem->y(), 0.);
1373+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1374+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1375+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1376+ QCOMPARE(lvwph->contentY(), 0.);
1377+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1378+
1379+ }
1380+
1381+ void testMoveFirstToLastAtBottom()
1382+ {
1383+ scrollToBottom();
1384+
1385+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1386+ QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1387+ verifyItem(0, -508., 350., true);
1388+ verifyItem(1, -158, 350., false);
1389+ verifyItem(2, 192, 350., false);
1390+ QCOMPARE(lvwph->m_minYExtent, 0.);
1391+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
1392+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1393+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1394+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1395+ QCOMPARE(lvwph->contentY(), 1258.);
1396+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1397+
1398+ QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 5), Q_ARG(QVariant, 1));
1399+
1400+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1401+ QCOMPARE(lvwph->m_firstVisibleIndex, 2);
1402+ verifyItem(0, -508., 350., true);
1403+ verifyItem(1, -158, 350., false);
1404+ verifyItem(2, 192, 350., false);
1405+ verifyItem(3, 542, 150., true);
1406+ QCOMPARE(lvwph->m_minYExtent, 0.);
1407+ QCOMPARE(lvwph->m_clipItem->y(), 1258.);
1408+ QCOMPARE(lvwph->m_clipItem->clip(), false);
1409+ QCOMPARE(lvwph->m_headerItem->y(), 0.);
1410+ QCOMPARE(lvwph->m_headerItem->height(), 50.);
1411+ QCOMPARE(lvwph->contentY(), 1258.);
1412+ QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1413+ QVERIFY(!lvwph->isAtYEnd());
1414+ }
1415+
1416+private:
1417+ QQuickView *view;
1418+ ListViewWithPageHeader *lvwph;
1419+ QQuickListModel *model;
1420+ QQmlComponent *otherDelegate;
1421+};
1422+
1423+QTEST_MAIN(ListViewWithPageHeaderTest)
1424+
1425+#include "listviewwithpageheadertest.moc"
tests/plugins/ListViewWithPageHeader/test.qmlnew file+99
@@ -0,0 +1,99 @@
1+import QtQuick 2.0
2+import ListViewWithPageHeader 0.1
3+
4+Rectangle {
5+ width: 300
6+ height: 542
7+ color: "lightblue"
8+
9+ focus: true
10+ Keys.onPressed: {
11+ if (event.key == Qt.Key_B) {
12+ listView.positionAtBeginning()
13+ } else if (event.key == Qt.Key_1) {
14+ animalsModel.setProperty(0, "size", 400);
15+ } else if (event.key == Qt.Key_2) {
16+ animalsModel.setProperty(1, "size", 400);
17+ } else if (event.key == Qt.Key_3) {
18+ animalsModel.setProperty(1, "size", 10);
19+ } else if (event.key == Qt.Key_H) {
20+ listView.headerItem.height = 100
21+ } else if (event.key == Qt.Key_D) {
22+ listView.delegate = otherRect
23+ } else if (event.key == Qt.Key_F) {
24+ listView.header = null
25+ }
26+ }
27+
28+
29+ ListModel {
30+ id: model
31+
32+ function insertItem(index, size) {
33+ insert(index, { size: size });
34+ }
35+
36+ function removeItems(index, count) {
37+ remove(index, count);
38+ }
39+
40+ function moveItems(indexFrom, indexTo, count) {
41+ move(indexFrom, indexTo, count);
42+ }
43+
44+ ListElement { size: 150 }
45+ ListElement { size: 200 }
46+ ListElement { size: 350 }
47+ ListElement { size: 350 }
48+ ListElement { size: 350 }
49+ ListElement { size: 350 }
50+ }
51+
52+ Component {
53+ id: otherRect
54+ Rectangle {
55+ height: 35
56+ width: parent.width
57+ color: index % 2 == 0 ? "yellow" : "purple"
58+ }
59+ }
60+
61+ ListViewWithPageHeader {
62+ id: listView
63+ width: parent.width
64+ anchors.top: parent.top
65+ anchors.bottom: parent.bottom
66+ model: model
67+ delegate: Rectangle {
68+ property bool timerDone: false
69+ width: parent.width - 20
70+ x: 10
71+ color: index % 2 == 0 ? "red" : "blue"
72+ height: timerDone ? size : 350
73+ Text {
74+ text: index
75+ }
76+ Timer {
77+ id: sizeTimer
78+ interval: 10;
79+ onTriggered: {
80+ timerDone = true
81+ }
82+ }
83+ Component.onCompleted: {
84+ sizeTimer.start()
85+ }
86+ }
87+
88+ pageHeader: Rectangle {
89+ color: "transparent"
90+ width: parent.width
91+ height: 50
92+ Text {
93+ anchors.fill: parent
94+ text: "APPS"
95+ font.pixelSize: 40
96+ }
97+ }
98+ }
99+}