on 68669d9 help sign in
unity8/tests/plugins/ListViewWithPageHeader/listviewwithpageheadertestsection.cpp
1567 lines 72 kB history raw
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 */
17#include "listviewwithpageheader.h"
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>
27class ListViewWithPageHeaderTestSection : public QObject
29 Q_OBJECT
31private:
32 void verifyItem(int visibleIndex, qreal pos, qreal height, bool culled, const QString &sectionHeader, bool sectionHeaderCulled)
33 {
34 QTRY_VERIFY(visibleIndex < lvwph->m_visibleItems.count());
35 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->y(), pos);
36 QTRY_COMPARE(lvwph->m_visibleItems[visibleIndex]->height(), height);
37 QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_item)->culled, culled);
38 QCOMPARE(section(lvwph->m_visibleItems[visibleIndex]->m_sectionItem), sectionHeader);
39 if (!sectionHeader.isNull()) {
40 QCOMPARE(QQuickItemPrivate::get(lvwph->m_visibleItems[visibleIndex]->m_sectionItem)->culled, sectionHeaderCulled);
41 }
42 }
44 void changeContentY(qreal change)
45 {
46 const qreal dest = lvwph->contentY() + change;
47 if (dest > lvwph->contentY()) {
48 const qreal jump = 25;
49 while (lvwph->contentY() + jump < dest) {
50 lvwph->setContentY(lvwph->contentY() + jump);
51 QTest::qWait(1);
52 }
53 } else {
54 const qreal jump = -25;
55 while (lvwph->contentY() + jump > dest) {
56 lvwph->setContentY(lvwph->contentY() + jump);
57 QTest::qWait(1);
58 }
59 }
60 lvwph->setContentY(dest);
61 QTest::qWait(1);
62 }
64 void scrollToTop()
65 {
66 const qreal jump = -25;
67 while (!lvwph->isAtYBeginning()) {
68 if (lvwph->contentY() + jump > -lvwph->minYExtent()) {
69 lvwph->setContentY(lvwph->contentY() + jump);
70 } else {
71 lvwph->setContentY(lvwph->contentY() - 1);
72 }
73 QTest::qWait(1);
74 }
75 }
77 void scrollToBottom()
78 {
79 const qreal jump = 25;
80 while (!lvwph->isAtYEnd()) {
81 if (lvwph->contentY() + lvwph->height() + jump < lvwph->contentHeight()) {
82 lvwph->setContentY(lvwph->contentY() + jump);
83 } else {
84 lvwph->setContentY(lvwph->contentY() + 1);
85 }
86 QTest::qWait(1);
87 }
88 }
90 void verifyInitialTopPosition()
91 {
92 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
93 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
94 verifyItem(0, 50., 190., false, "Agressive", false);
95 verifyItem(1, 240., 240., false, "Regular", false);
96 verifyItem(2, 480., 390., false, "Mild", false);
97 QCOMPARE(lvwph->m_minYExtent, 0.);
98 QCOMPARE(lvwph->m_clipItem->y(), 0.);
99 QCOMPARE(lvwph->m_clipItem->clip(), false);
100 QCOMPARE(lvwph->m_headerItem->y(), 0.);
101 QCOMPARE(lvwph->m_headerItem->height(), 50.);
102 QCOMPARE(lvwph->contentY(), 0.);
103 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
104 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
105 }
107 QString section(QQuickItem *item)
108 {
109 return item ? QQmlEngine::contextForObject(item)->parentContext()->contextProperty(QLatin1String("section")).toString() : QString();
110 }
112private Q_SLOTS:
114 void initTestCase()
115 {
116 }
118 void init()
119 {
120 view = new QQuickView();
121 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
122 view->setSource(QUrl::fromLocalFile(LISTVIEWWITHPAGEHEADER_FOLDER "/test_section.qml"));
123 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
124 model = view->rootObject()->findChild<QQuickListModel*>();
125 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
126 QVERIFY(lvwph);
127 QVERIFY(model);
128 QVERIFY(otherDelegate);
129 view->show();
130 QTest::qWaitForWindowExposed(view);
132 verifyInitialTopPosition();
133 }
135 void cleanup()
136 {
137 delete view;
138 }
140 void testCreationDeletion()
141 {
142 // Nothing, init/cleanup already tests this
143 }
145 void testDrag1PixelUp()
146 {
147 lvwph->setContentY(lvwph->contentY() + 1);
148 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
149 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
150 verifyItem(0, 49., 190., false, "Agressive", false);
151 verifyItem(1, 239., 240., false, "Regular", false);
152 verifyItem(2, 479., 390., false, "Mild", false);
153 QCOMPARE(lvwph->m_minYExtent, 0.);
154 QCOMPARE(lvwph->m_clipItem->y(), 1.);
155 QCOMPARE(lvwph->m_clipItem->clip(), false);
156 QCOMPARE(lvwph->m_headerItem->y(), 0.);
157 QCOMPARE(lvwph->m_headerItem->height(), 50.);
158 QCOMPARE(lvwph->contentY(), 1.);
159 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
160 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
161 }
163 void testHeaderDetachDragDown()
164 {
165 QTest::mousePress(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0));
166 QTest::qWait(100);
167 QTest::mouseMove(view, QPoint(0, 5));
168 QTest::qWait(100);
169 QTest::mouseMove(view, QPoint(0, 10));
170 QTest::qWait(100);
171 QTest::mouseMove(view, QPoint(0, 15));
172 QTest::qWait(100);
173 QTest::mouseMove(view, QPoint(0, 20));
174 QTest::qWait(100);
175 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
176 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
177 verifyItem(0, 55., 190., false, "Agressive", false);
178 verifyItem(1, 245., 240., false, "Regular", false);
179 verifyItem(2, 485., 390., false, "Mild", false);
180 QCOMPARE(lvwph->m_minYExtent, 0.);
181 QCOMPARE(lvwph->m_clipItem->y(), -5.);
182 QCOMPARE(lvwph->m_clipItem->clip(), false);
183 QCOMPARE(lvwph->m_headerItem->y(), -5.);
184 QCOMPARE(lvwph->m_headerItem->height(), 55.);
185 QCOMPARE(lvwph->contentY(), -5.);
186 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
187 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
189 QTest::mouseRelease(view, Qt::LeftButton, Qt::NoModifier, QPoint(0, 15));
191 verifyInitialTopPosition();
192 }
194 void testDrag375PixelUp()
195 {
196 changeContentY(375);
197 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
198 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
199 verifyItem(0, -325., 190., true, "Agressive", true);
200 verifyItem(1, -135, 240., false, "Regular", true);
201 verifyItem(2, 105, 390., false, "Mild", false);
202 verifyItem(3, 495, 390., false, "Bold", false);
203 QCOMPARE(lvwph->m_minYExtent, 0.);
204 QCOMPARE(lvwph->m_clipItem->y(), 375.);
205 QCOMPARE(lvwph->m_clipItem->clip(), false);
206 QCOMPARE(lvwph->m_headerItem->y(), 0.);
207 QCOMPARE(lvwph->m_headerItem->height(), 50.);
208 QCOMPARE(lvwph->contentY(), 375.);
209 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
210 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
211 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
212 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
213 }
215 void testDrag520PixelUp()
216 {
217 changeContentY(520);
218 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
219 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
220 verifyItem(0, -280., 240., true, "Regular", true);
221 verifyItem(1, -40, 390., false, "Mild", true);
222 verifyItem(2, 350, 390., false, "Bold", false);
223 verifyItem(3, 740, 350., true, QString(), true);
224 QCOMPARE(lvwph->m_minYExtent, 152.5);
225 QCOMPARE(lvwph->m_clipItem->y(), 520.);
226 QCOMPARE(lvwph->m_clipItem->clip(), false);
227 QCOMPARE(lvwph->m_headerItem->y(), 0.);
228 QCOMPARE(lvwph->m_headerItem->height(), 50.);
229 QCOMPARE(lvwph->contentY(), 520.);
230 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
231 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
232 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
233 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
234 }
236 void testDragHeaderUpThenShow()
237 {
238 changeContentY(120);
239 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
240 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
241 verifyItem(0, -70., 190., false, "Agressive", true);
242 verifyItem(1, 120., 240., false, "Regular", false);
243 verifyItem(2, 360., 390., false, "Mild", false);
244 verifyItem(3, 750., 390., true, "Bold", true);
245 QCOMPARE(lvwph->m_minYExtent, 0.);
246 QCOMPARE(lvwph->m_clipItem->y(), 120.);
247 QCOMPARE(lvwph->m_clipItem->clip(), false);
248 QCOMPARE(lvwph->m_headerItem->y(), 0.);
249 QCOMPARE(lvwph->m_headerItem->height(), 50.);
250 QCOMPARE(lvwph->contentY(), 120.);
251 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
252 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
253 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
254 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
256 changeContentY(-30);
257 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
258 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
259 verifyItem(0, -70., 190., false, "Agressive", true);
260 verifyItem(1, 120., 240., false, "Regular", false);
261 verifyItem(2, 360., 390., false, "Mild", false);
262 verifyItem(3, 750., 390., true, "Bold", true);
263 QCOMPARE(lvwph->m_minYExtent, 0.);
264 QCOMPARE(lvwph->m_clipItem->y(), 120.);
265 QCOMPARE(lvwph->m_clipItem->clip(), true);
266 QTRY_COMPARE(lvwph->m_headerItem->y(), 70.);
267 QCOMPARE(lvwph->m_headerItem->height(), 50.);
268 QCOMPARE(lvwph->contentY(), 90.);
269 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
270 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
271 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
272 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
273 }
275 void testDragHeaderUpThenShowWithoutHidingTotally()
276 {
277 changeContentY(10);
278 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
279 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
280 verifyItem(0, 40., 190., false, "Agressive", false);
281 verifyItem(1, 230., 240., false, "Regular", false);
282 verifyItem(2, 470., 390., false, "Mild", false);
283 QCOMPARE(lvwph->m_minYExtent, 0.);
284 QCOMPARE(lvwph->m_clipItem->y(), 10.);
285 QCOMPARE(lvwph->m_clipItem->clip(), false);
286 QCOMPARE(lvwph->m_headerItem->y(), 0.);
287 QCOMPARE(lvwph->m_headerItem->height(), 50.);
288 QCOMPARE(lvwph->contentY(), 10.);
289 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
290 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
292 changeContentY(-1);
294 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
295 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
296 verifyItem(0, 41., 190., false, "Agressive", false);
297 verifyItem(1, 231., 240., false, "Regular", false);
298 verifyItem(2, 471., 390., false, "Mild", false);
299 QCOMPARE(lvwph->m_minYExtent, 0.);
300 QCOMPARE(lvwph->m_clipItem->y(), 9.);
301 QCOMPARE(lvwph->m_clipItem->clip(), false);
302 QTRY_COMPARE(lvwph->m_headerItem->y(), 0.);
303 QCOMPARE(lvwph->m_headerItem->height(), 50.);
304 QCOMPARE(lvwph->contentY(), 9.);
305 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
306 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
307 }
309 void testPositionAtBeginningIndex0Visible()
310 {
311 changeContentY(375);
312 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
313 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
314 verifyItem(0, -325., 190., true, "Agressive", true);
315 verifyItem(1, -135, 240., false, "Regular", true);
316 verifyItem(2, 105, 390., false, "Mild", false);
317 verifyItem(3, 495, 390., false, "Bold", false);
318 QCOMPARE(lvwph->m_minYExtent, 0.);
319 QCOMPARE(lvwph->m_clipItem->y(), 375.);
320 QCOMPARE(lvwph->m_clipItem->clip(), false);
321 QCOMPARE(lvwph->m_headerItem->y(), 0.);
322 QCOMPARE(lvwph->m_headerItem->height(), 50.);
323 QCOMPARE(lvwph->contentY(), 375.);
324 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
325 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
326 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
327 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
329 lvwph->positionAtBeginning();
331 verifyInitialTopPosition();
332 }
334 void testPositionAtBeginningIndex0NotVisible()
335 {
336 changeContentY(520);
337 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
338 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
339 verifyItem(0, -280., 240., true, "Regular", true);
340 verifyItem(1, -40, 390., false, "Mild", true);
341 verifyItem(2, 350, 390., false, "Bold", false);
342 verifyItem(3, 740, 350., true, QString(), true);
343 QCOMPARE(lvwph->m_minYExtent, 152.5);
344 QCOMPARE(lvwph->m_clipItem->y(), 520.);
345 QCOMPARE(lvwph->m_clipItem->clip(), false);
346 QCOMPARE(lvwph->m_headerItem->y(), 0.);
347 QCOMPARE(lvwph->m_headerItem->height(), 50.);
348 QCOMPARE(lvwph->contentY(), 520.);
349 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
350 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
351 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
352 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
354 lvwph->positionAtBeginning();
356 verifyInitialTopPosition();
357 }
359 void testIndex0GrowOnScreen()
360 {
361 model->setProperty(0, "size", 400);
363 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
364 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
365 verifyItem(0, 50., 440., false, "Agressive", false);
366 verifyItem(1, 490., 240., false, "Regular", false);
367 verifyItem(2, 730., 390., true, "Mild", true);
368 QCOMPARE(lvwph->m_minYExtent, 0.);
369 QCOMPARE(lvwph->m_clipItem->y(), 0.);
370 QCOMPARE(lvwph->m_clipItem->clip(), false);
371 QCOMPARE(lvwph->m_headerItem->y(), 0.);
372 QCOMPARE(lvwph->m_headerItem->height(), 50.);
373 QCOMPARE(lvwph->contentY(), 0.);
374 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
375 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
376 }
378 void testIndex0GrowOffScreen()
379 {
380 changeContentY(375);
381 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
382 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
383 verifyItem(0, -325., 190., true, "Agressive", true);
384 verifyItem(1, -135, 240., false, "Regular", true);
385 verifyItem(2, 105, 390., false, "Mild", false);
386 verifyItem(3, 495, 390., false, "Bold", false);
387 QCOMPARE(lvwph->m_minYExtent, 0.);
388 QCOMPARE(lvwph->m_clipItem->y(), 375.);
389 QCOMPARE(lvwph->m_clipItem->clip(), false);
390 QCOMPARE(lvwph->m_headerItem->y(), 0.);
391 QCOMPARE(lvwph->m_headerItem->height(), 50.);
392 QCOMPARE(lvwph->contentY(), 375.);
393 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
394 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
395 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
396 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
398 model->setProperty(0, "size", 400);
400 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
401 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
402 verifyItem(0, -575., 440., true, "Agressive", true);
403 verifyItem(1, -135, 240., false, "Regular", true);
404 verifyItem(2, 105, 390., false, "Mild", false);
405 verifyItem(3, 495, 390., false, "Bold", false);
406 QCOMPARE(lvwph->m_minYExtent, 250.);
407 QCOMPARE(lvwph->m_clipItem->y(), 375.);
408 QCOMPARE(lvwph->m_clipItem->clip(), false);
409 QCOMPARE(lvwph->m_headerItem->y(), 0.);
410 QCOMPARE(lvwph->m_headerItem->height(), 50.);
411 QCOMPARE(lvwph->contentY(), 375.);
412 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
413 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
414 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
415 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
417 scrollToTop();
419 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
420 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
421 verifyItem(0, 50., 440., false, "Agressive", false);
422 verifyItem(1, 490, 240., false, "Regular", false);
423 verifyItem(2, 730, 390., true, "Mild", true);
424 QCOMPARE(lvwph->m_minYExtent, 250.);
425 QCOMPARE(lvwph->m_clipItem->y(), -250.);
426 QCOMPARE(lvwph->m_clipItem->clip(), false);
427 QCOMPARE(lvwph->m_headerItem->y(), -250.);
428 QCOMPARE(lvwph->m_headerItem->height(), 50.);
429 QCOMPARE(lvwph->contentY(), -250.);
430 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
431 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
433 changeContentY(30);
435 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
436 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
437 verifyItem(0, 20., 440., false, "Agressive", false);
438 verifyItem(1, 460, 240., false, "Regular", false);
439 verifyItem(2, 700, 390., true, "Mild", true);
440 QCOMPARE(lvwph->m_minYExtent, 250.);
441 QCOMPARE(lvwph->m_clipItem->y(), -220.);
442 QCOMPARE(lvwph->m_clipItem->clip(), false);
443 QCOMPARE(lvwph->m_headerItem->y(), -250.);
444 QCOMPARE(lvwph->m_headerItem->height(), 50.);
445 QCOMPARE(lvwph->contentY(), -220.);
446 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
447 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
448 }
450 void testIndex0GrowNotCreated()
451 {
452 changeContentY(520);
453 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
454 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
455 verifyItem(0, -280., 240., true, "Regular", true);
456 verifyItem(1, -40, 390., false, "Mild", true);
457 verifyItem(2, 350, 390., false, "Bold", false);
458 verifyItem(3, 740, 350., true, QString(), true);
459 QCOMPARE(lvwph->m_minYExtent, 152.5);
460 QCOMPARE(lvwph->m_clipItem->y(), 520.);
461 QCOMPARE(lvwph->m_clipItem->clip(), false);
462 QCOMPARE(lvwph->m_headerItem->y(), 0.);
463 QCOMPARE(lvwph->m_headerItem->height(), 50.);
464 QCOMPARE(lvwph->contentY(), 520.);
465 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
466 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
467 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
468 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
470 model->setProperty(0, "size", 400);
472 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
473 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
474 verifyItem(0, -280., 240., true, "Regular", true);
475 verifyItem(1, -40, 390., false, "Mild", true);
476 verifyItem(2, 350, 390., false, "Bold", false);
477 verifyItem(3, 740, 350., true, QString(), true);
478 QCOMPARE(lvwph->m_minYExtent, 152.5);
479 QCOMPARE(lvwph->m_clipItem->y(), 520.);
480 QCOMPARE(lvwph->m_clipItem->clip(), false);
481 QCOMPARE(lvwph->m_headerItem->y(), 0.);
482 QCOMPARE(lvwph->m_headerItem->height(), 50.);
483 QCOMPARE(lvwph->contentY(), 520.);
484 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
485 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
486 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
487 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
489 scrollToTop();
491 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
492 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
493 verifyItem(0, 50., 440., false, "Agressive", false);
494 verifyItem(1, 490, 240., false, "Regular", false);
495 verifyItem(2, 730, 390., true, "Mild", true);
496 QCOMPARE(lvwph->m_minYExtent, 250.);
497 QCOMPARE(lvwph->m_clipItem->y(), -250.);
498 QCOMPARE(lvwph->m_clipItem->clip(), false);
499 QCOMPARE(lvwph->m_headerItem->y(), -250.);
500 QCOMPARE(lvwph->m_headerItem->height(), 50.);
501 QCOMPARE(lvwph->contentY(), -250.);
502 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
503 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
504 }
506 void testShowHideShowHeaderAtBottom()
507 {
508 scrollToBottom();
509 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
510 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
511 verifyItem(0, -588., 390., true, "Bold", true);
512 verifyItem(1, -198, 350., false, QString(), true);
513 verifyItem(2, 152, 390., false, "Lazy", false);
514 QCOMPARE(lvwph->m_minYExtent, 310.);
515 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
516 QCOMPARE(lvwph->m_clipItem->clip(), false);
517 QCOMPARE(lvwph->m_headerItem->y(), 0.);
518 QCOMPARE(lvwph->m_headerItem->height(), 50.);
519 QCOMPARE(lvwph->contentY(), 1458.);
520 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
521 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
522 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
523 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
525 changeContentY(-30);
526 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
527 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
528 verifyItem(0, -588., 390., true, "Bold", true);
529 verifyItem(1, -198, 350., false, QString(), true);
530 verifyItem(2, 152, 390., false, "Lazy", false);
531 QCOMPARE(lvwph->m_minYExtent, 310.);
532 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
533 QCOMPARE(lvwph->m_clipItem->clip(), true);
534 QCOMPARE(lvwph->m_headerItem->y(), 1408.);
535 QCOMPARE(lvwph->m_headerItem->height(), 50.);
536 QCOMPARE(lvwph->contentY(), 1428.);
537 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
538 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
539 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
540 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
542 changeContentY(30);
543 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
544 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
545 verifyItem(0, -588., 390., true, "Bold", true);
546 verifyItem(1, -198, 350., false, QString(), true);
547 verifyItem(2, 152, 390., false, "Lazy", false);
548 QCOMPARE(lvwph->m_minYExtent, 310.);
549 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
550 QCOMPARE(lvwph->m_clipItem->clip(), false);
551 QCOMPARE(lvwph->m_headerItem->y(), -310.);
552 QCOMPARE(lvwph->m_headerItem->height(), 50.);
553 QCOMPARE(lvwph->contentY(), 1458.);
554 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
555 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
556 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
557 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
559 changeContentY(-30);
560 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
561 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
562 verifyItem(0, -588., 390., true, "Bold", true);
563 verifyItem(1, -198, 350., false, QString(), true);
564 verifyItem(2, 152, 390., false, "Lazy", false);
565 QCOMPARE(lvwph->m_minYExtent, 310.);
566 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
567 QCOMPARE(lvwph->m_clipItem->clip(), true);
568 QCOMPARE(lvwph->m_headerItem->y(), 1408.);
569 QCOMPARE(lvwph->m_headerItem->height(), 50.);
570 QCOMPARE(lvwph->contentY(), 1428.);
571 QCOMPARE(lvwph->m_headerItemShownHeight, 30.);
572 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
573 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
574 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
575 }
577 void testChangeDelegateAtBottom()
578 {
579 scrollToBottom();
580 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
581 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
582 verifyItem(0, -588., 390., true, "Bold", true);
583 verifyItem(1, -198, 350., false, QString(), true);
584 verifyItem(2, 152, 390., false, "Lazy", false);
585 QCOMPARE(lvwph->m_minYExtent, 310.);
586 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
587 QCOMPARE(lvwph->m_clipItem->clip(), false);
588 QCOMPARE(lvwph->m_headerItem->y(), 0.);
589 QCOMPARE(lvwph->m_headerItem->height(), 50.);
590 QCOMPARE(lvwph->contentY(), 1458.);
591 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
592 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
593 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
594 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
596 lvwph->setDelegate(otherDelegate);
598 QTRY_COMPARE(lvwph->m_visibleItems.count(), 6);
599 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
600 verifyItem(0, 50., 75., false, "Agressive", false);
601 verifyItem(1, 125, 75., false, "Regular", false);
602 verifyItem(2, 200, 75., false, "Mild", false);
603 verifyItem(3, 275, 75., false, "Bold", false);
604 verifyItem(4, 350, 35., false, QString(), true);
605 verifyItem(5, 385, 75., false, "Lazy", false);
606 QCOMPARE(lvwph->m_minYExtent, 0.);
607 QCOMPARE(lvwph->m_clipItem->y(), 0.);
608 QCOMPARE(lvwph->m_clipItem->clip(), false);
609 QCOMPARE(lvwph->m_headerItem->y(), 0.);
610 QCOMPARE(lvwph->m_headerItem->height(), 50.);
611 QCOMPARE(lvwph->contentY(), 0.);
612 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
613 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
614 }
616 void testSetEmptyHeaderAtTop()
617 {
618 lvwph->setHeader(nullptr);
620 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
621 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
622 verifyItem(0, 0., 190., false, "Agressive", false);
623 verifyItem(1, 190., 240., false, "Regular", false);
624 verifyItem(2, 430., 390., false, "Mild", false);
625 QCOMPARE(lvwph->m_minYExtent, 0.);
626 QCOMPARE(lvwph->m_clipItem->y(), 0.);
627 QCOMPARE(lvwph->m_clipItem->clip(), false);
628 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
629 QCOMPARE(lvwph->contentY(), 0.);
630 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
631 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
632 }
634 void testSetEmptyHeaderAtBottom()
635 {
636 scrollToBottom();
637 lvwph->setHeader(nullptr);
639 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
640 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
641 verifyItem(0, -588., 390., true, "Bold", true);
642 verifyItem(1, -198, 350., false, QString(), true);
643 verifyItem(2, 152, 390., false, "Lazy", false);
644 QCOMPARE(lvwph->m_minYExtent, 260.);
645 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
646 QCOMPARE(lvwph->m_clipItem->clip(), false);
647 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
648 QCOMPARE(lvwph->contentY(), 1458.);
649 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
650 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
651 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
652 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
654 scrollToTop();
656 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
657 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
658 verifyItem(0, 0., 190., false, "Agressive", false);
659 verifyItem(1, 190., 240., false, "Regular", false);
660 verifyItem(2, 430., 390., false, "Mild", false);
661 QCOMPARE(lvwph->m_minYExtent, -50.);
662 QCOMPARE(lvwph->m_clipItem->y(), 50.);
663 QCOMPARE(lvwph->m_clipItem->clip(), false);
664 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
665 QCOMPARE(lvwph->contentY(), 50.);
666 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
667 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
668 }
670 void testSetEmptyHeaderWhenPartlyShownClipped()
671 {
672 scrollToBottom();
673 changeContentY(-30);
674 lvwph->setHeader(nullptr);
676 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
677 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
678 verifyItem(0, -588., 390., true, "Bold", true);
679 verifyItem(1, -198, 350., false, QString(), true);
680 verifyItem(2, 152, 390., false, "Lazy", false);
681 QCOMPARE(lvwph->m_minYExtent, 290.);
682 QCOMPARE(lvwph->m_clipItem->y(), 1428.);
683 QCOMPARE(lvwph->m_clipItem->clip(), false);
684 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
685 QCOMPARE(lvwph->contentY(), 1428.);
686 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
687 QTRY_VERIFY(lvwph->isAtYEnd());
688 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
689 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
690 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
692 scrollToTop();
694 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
695 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
696 verifyItem(0, 0., 190., false, "Agressive", false);
697 verifyItem(1, 190., 240., false, "Regular", false);
698 verifyItem(2, 430., 390., false, "Mild", false);
699 QCOMPARE(lvwph->m_minYExtent, -20.);
700 QCOMPARE(lvwph->m_clipItem->y(), 20.);
701 QCOMPARE(lvwph->m_clipItem->clip(), false);
702 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
703 QCOMPARE(lvwph->contentY(), 20.);
704 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
705 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
706 }
708 void testSetEmptyHeaderWhenPartlyShownNotClipped()
709 {
710 changeContentY(30);
711 lvwph->setHeader(nullptr);
713 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
714 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
715 verifyItem(0, -30., 190., false, "Agressive", true);
716 verifyItem(1, 160., 240., false, "Regular", false);
717 verifyItem(2, 400., 390., false, "Mild", false);
718 QCOMPARE(lvwph->m_minYExtent, 0.);
719 QCOMPARE(lvwph->m_clipItem->y(), 30.);
720 QCOMPARE(lvwph->m_clipItem->clip(), false);
721 QCOMPARE(lvwph->m_headerItem, (QQuickItem*)nullptr);
722 QCOMPARE(lvwph->contentY(), 30.);
723 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
724 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
725 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
726 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
727 }
729 void testSetNullDelegate()
730 {
731 lvwph->setDelegate(nullptr);
733 QTRY_COMPARE(lvwph->m_visibleItems.count(), 0);
734 QCOMPARE(lvwph->m_firstVisibleIndex, -1);
735 QCOMPARE(lvwph->m_minYExtent, 0.);
736 QCOMPARE(lvwph->m_clipItem->y(), 0.);
737 QCOMPARE(lvwph->m_clipItem->clip(), false);
738 QCOMPARE(lvwph->m_headerItem->y(), 0.);
739 QCOMPARE(lvwph->m_headerItem->height(), 50.);
740 QCOMPARE(lvwph->contentY(), 0.);
741 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
742 QTRY_COMPARE(lvwph->contentHeight(), 50.);
743 QVERIFY(lvwph->isAtYBeginning());
744 QVERIFY(lvwph->isAtYEnd());
745 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
746 }
748 void testInsertItems()
749 {
750 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
751 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
753 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
754 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
755 verifyItem(0, 50., 190., false, "Agressive", false);
756 verifyItem(1, 240., 165., false, "Regular", false);
757 verifyItem(2, 405., 140., false, "Agressive", false);
758 verifyItem(3, 545., 240., true, "Regular", true);
759 verifyItem(4, 785., 390., true, "Mild", true);
760 QCOMPARE(lvwph->m_minYExtent, 0.);
761 QCOMPARE(lvwph->m_clipItem->y(), 0.);
762 QCOMPARE(lvwph->m_clipItem->clip(), false);
763 QCOMPARE(lvwph->m_headerItem->y(), 0.);
764 QCOMPARE(lvwph->m_headerItem->height(), 50.);
765 QCOMPARE(lvwph->contentY(), 0.);
766 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
767 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
768 }
770 void testInsertItemsStealSectionItem()
771 {
772 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
774 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
775 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
776 verifyItem(0, 50., 190., false, "Agressive", false);
777 verifyItem(1, 240., 165., false, "Regular", false);
778 verifyItem(2, 405., 200., false, QString(), true);
779 verifyItem(3, 605., 390., true, "Mild", true);
780 QCOMPARE(lvwph->m_minYExtent, 0.);
781 QCOMPARE(lvwph->m_clipItem->y(), 0.);
782 QCOMPARE(lvwph->m_clipItem->clip(), false);
783 QCOMPARE(lvwph->m_headerItem->y(), 0.);
784 QCOMPARE(lvwph->m_headerItem->height(), 50.);
785 QCOMPARE(lvwph->contentY(), 0.);
786 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
787 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
788 }
791 void testInsertItemsOnNotShownPosition()
792 {
793 changeContentY(800);
795 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
796 QTRY_COMPARE(lvwph->m_firstVisibleIndex, 2);
797 verifyItem(0, -320., 390., false, "Mild", true);
798 verifyItem(1, 70, 390., false, "Bold", false);
799 verifyItem(2, 460, 350., false, QString(), false);
800 verifyItem(3, 810, 390., true, "Lazy", true);
801 QCOMPARE(lvwph->m_minYExtent, 330.);
802 QCOMPARE(lvwph->m_clipItem->y(), 800.);
803 QCOMPARE(lvwph->m_clipItem->clip(), false);
804 QCOMPARE(lvwph->m_headerItem->y(), 0.);
805 QCOMPARE(lvwph->m_headerItem->height(), 50.);
806 QCOMPARE(lvwph->contentY(), 800.);
807 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
808 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
809 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
810 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
812 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
813 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
815 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
816 QCOMPARE(lvwph->m_firstVisibleIndex, 4);
817 verifyItem(0, -320., 390., false, "Mild", true);
818 verifyItem(1, 70, 390., false, "Bold", false);
819 verifyItem(2, 460, 350., false, QString(), false);
820 verifyItem(3, 810, 390., true, "Lazy", true);
821 QCOMPARE(lvwph->m_minYExtent, 1090.);
822 QCOMPARE(lvwph->m_clipItem->y(), 800.);
823 QCOMPARE(lvwph->m_clipItem->clip(), false);
824 QCOMPARE(lvwph->m_headerItem->y(), 0.);
825 QCOMPARE(lvwph->m_headerItem->height(), 50.);
826 QCOMPARE(lvwph->contentY(), 800.);
827 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
828 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
829 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
830 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
832 scrollToTop();
834 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
835 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
836 verifyItem(0, 50., 190., false, "Agressive", false);
837 verifyItem(1, 240., 165., false, "Regular", false);
838 verifyItem(2, 405., 140., false, "Agressive", false);
839 verifyItem(3, 545., 240., true, "Regular", true);
840 verifyItem(4, 785., 390., true, "Mild", true);
841 QCOMPARE(lvwph->m_minYExtent, 305.);
842 QCOMPARE(lvwph->m_clipItem->y(), -305.);
843 QCOMPARE(lvwph->m_clipItem->clip(), false);
844 QCOMPARE(lvwph->m_headerItem->y(), -305.);
845 QCOMPARE(lvwph->m_headerItem->height(), 50.);
846 QCOMPARE(lvwph->contentY(), -305.);
847 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
848 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
849 }
851 void testInsertItemsAtEndOfViewport()
852 {
853 changeContentY(60);
855 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
856 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
857 verifyItem(0, -10., 190., false, "Agressive", true);
858 verifyItem(1, 180., 240., false, "Regular", false);
859 verifyItem(2, 420., 390., false, "Mild", false);
860 verifyItem(3, 810., 390., true, "Bold", true);
861 QCOMPARE(lvwph->m_minYExtent, 0.);
862 QCOMPARE(lvwph->m_clipItem->y(), 60.);
863 QCOMPARE(lvwph->m_clipItem->clip(), false);
864 QCOMPARE(lvwph->m_headerItem->y(), 0.);
865 QCOMPARE(lvwph->m_headerItem->height(), 50.);
866 QCOMPARE(lvwph->contentY(), 60.);
867 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
868 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
869 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
870 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
872 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
873 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 3), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
875 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
876 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
877 verifyItem(0, -10., 190., false, "Agressive", true);
878 verifyItem(1, 180., 240., false, "Regular", false);
879 verifyItem(2, 420., 390., false, "Mild", false);
880 verifyItem(3, 810., 165., true, "Regular", true);
881 QCOMPARE(lvwph->m_minYExtent, 0.);
882 QCOMPARE(lvwph->m_clipItem->y(), 60.);
883 QCOMPARE(lvwph->m_clipItem->clip(), false);
884 QCOMPARE(lvwph->m_headerItem->y(), 0.);
885 QCOMPARE(lvwph->m_headerItem->height(), 50.);
886 QCOMPARE(lvwph->contentY(), 60.);
887 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
888 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
889 QCOMPARE(section(lvwph->m_topSectionItem), QString("Agressive"));
890 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
891 }
893 void testInsertItemsBeforeValidIndex()
894 {
895 changeContentY(520);
897 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
898 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
899 verifyItem(0, -280., 240., true, "Regular", true);
900 verifyItem(1, -40, 390., false, "Mild", true);
901 verifyItem(2, 350, 390., false, "Bold", false);
902 verifyItem(3, 740, 350., true, QString(), true);
903 QCOMPARE(lvwph->m_minYExtent, 152.5);
904 QCOMPARE(lvwph->m_clipItem->y(), 520.);
905 QCOMPARE(lvwph->m_clipItem->clip(), false);
906 QCOMPARE(lvwph->m_headerItem->y(), 0.);
907 QCOMPARE(lvwph->m_headerItem->height(), 50.);
908 QCOMPARE(lvwph->contentY(), 520.);
909 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
910 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
911 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
912 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
914 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
915 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
917 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
918 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
919 verifyItem(0, -280., 240., true, "Regular", true);
920 verifyItem(1, -40, 390., false, "Mild", true);
921 verifyItem(2, 350, 390., false, "Bold", false);
922 verifyItem(3, 740, 350., true, QString(), true);
923 QCOMPARE(lvwph->m_minYExtent, 837.5);
924 QCOMPARE(lvwph->m_clipItem->y(), 520.);
925 QCOMPARE(lvwph->m_clipItem->clip(), false);
926 QCOMPARE(lvwph->m_headerItem->y(), 0.);
927 QCOMPARE(lvwph->m_headerItem->height(), 50.);
928 QCOMPARE(lvwph->contentY(), 520.);
929 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
930 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
931 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
932 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
933 }
935 void testInsertItemsBeforeViewport()
936 {
937 changeContentY(375);
939 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
940 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
941 verifyItem(0, -325., 190., true, "Agressive", true);
942 verifyItem(1, -135, 240., false, "Regular", true);
943 verifyItem(2, 105, 390., false, "Mild", false);
944 verifyItem(3, 495, 390., false, "Bold", false);
945 QCOMPARE(lvwph->m_minYExtent, 0.);
946 QCOMPARE(lvwph->m_clipItem->y(), 375.);
947 QCOMPARE(lvwph->m_clipItem->clip(), false);
948 QCOMPARE(lvwph->m_headerItem->y(), 0.);
949 QCOMPARE(lvwph->m_headerItem->height(), 50.);
950 QCOMPARE(lvwph->contentY(), 375.);
951 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
952 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
953 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
954 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
956 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
957 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
959 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
960 QCOMPARE(lvwph->m_firstVisibleIndex, 2);
961 verifyItem(0, -275., 140., true, "Agressive", true);
962 verifyItem(1, -135., 240., false, "Regular", true);
963 verifyItem(2, 105, 390., false, "Mild", false);
964 verifyItem(3, 495, 390., false, "Bold", false);
965 QCOMPARE(lvwph->m_minYExtent, 530.);
966 QCOMPARE(lvwph->m_clipItem->y(), 375.);
967 QCOMPARE(lvwph->m_clipItem->clip(), false);
968 QCOMPARE(lvwph->m_headerItem->y(), 0.);
969 QCOMPARE(lvwph->m_headerItem->height(), 50.);
970 QCOMPARE(lvwph->contentY(), 375.);
971 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
972 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
973 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
974 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
976 scrollToTop();
978 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
979 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
980 verifyItem(0, 50., 190., false, "Agressive", false);
981 verifyItem(1, 240., 165., false, "Regular", false);
982 verifyItem(2, 405., 140., false, "Agressive", false);
983 verifyItem(3, 545., 240., true, "Regular", true);
984 verifyItem(4, 785., 390., true, "Mild", true);
985 QCOMPARE(lvwph->m_minYExtent, 305.);
986 QCOMPARE(lvwph->m_clipItem->y(), -305.);
987 QCOMPARE(lvwph->m_clipItem->clip(), false);
988 QCOMPARE(lvwph->m_headerItem->y(), -305.);
989 QCOMPARE(lvwph->m_headerItem->height(), 50.);
990 QCOMPARE(lvwph->contentY(), -305.);
991 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
992 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
993 }
995 void testInsertItemsAtBottom()
996 {
997 scrollToBottom();
999 QVERIFY(lvwph->isAtYEnd());
1001 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 100), Q_ARG(QVariant, "Agressive"));
1002 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 125), Q_ARG(QVariant, "Regular"));
1004 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1005 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1006 verifyItem(0, -588., 390., true, "Bold", true);
1007 verifyItem(1, -198, 350., false, QString(), true);
1008 verifyItem(2, 152, 390., false, "Lazy", false);
1009 verifyItem(3, 542, 165., true, "Regular", true);
1010 verifyItem(4, 707, 140., true, "Agressive", true);
1011 QCOMPARE(lvwph->m_minYExtent, 41.);
1012 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1013 QCOMPARE(lvwph->m_clipItem->clip(), false);
1014 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1015 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1016 QCOMPARE(lvwph->contentY(), 1458.);
1017 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1018 QVERIFY(!lvwph->isAtYEnd());
1019 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1020 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1021 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1023 scrollToBottom();
1025 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1026 QCOMPARE(lvwph->m_firstVisibleIndex, 4);
1027 verifyItem(0, -503., 350., true, QString(), true);
1028 verifyItem(1, -153, 390., false, "Lazy", true);
1029 verifyItem(2, 237, 165., false, "Regular", false);
1030 verifyItem(3, 402, 140., false, "Agressive", false);
1031 QCOMPARE(lvwph->m_minYExtent, -165.);
1032 QCOMPARE(lvwph->m_clipItem->y(), 1763.);
1033 QCOMPARE(lvwph->m_clipItem->clip(), false);
1034 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1035 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1036 QCOMPARE(lvwph->contentY(), 1763.);
1037 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1038 QVERIFY(lvwph->isAtYEnd());
1039 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1040 QCOMPARE(section(lvwph->m_topSectionItem), QString("Lazy"));
1041 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1044 void testInsertItemAtTop()
1046 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1048 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1049 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1050 verifyItem(0, 50., 115., false, "Agressive", false);
1051 verifyItem(1, 165., 150., false, QString(), false);
1052 verifyItem(2, 315., 240., false, "Regular", false);
1053 verifyItem(3, 555., 390., true, "Mild", true);
1054 QCOMPARE(lvwph->m_minYExtent, 0.);
1055 QCOMPARE(lvwph->m_clipItem->y(), 0.);
1056 QCOMPARE(lvwph->m_clipItem->clip(), false);
1057 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1058 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1059 QCOMPARE(lvwph->contentY(), 0.);
1060 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1061 QVERIFY(lvwph->isAtYBeginning());
1062 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1065 void testInsertItem10SmallItemsAtTopWhenAtBottom()
1067 scrollToBottom();
1069 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1070 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1071 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1072 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1073 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1074 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1075 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1076 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1077 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Regular"));
1078 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 75), Q_ARG(QVariant, "Agressive"));
1080 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1081 QCOMPARE(lvwph->m_firstVisibleIndex, 13);
1082 verifyItem(0, -588., 390., true, "Bold", true);
1083 verifyItem(1, -198, 350., false, QString(), true);
1084 verifyItem(2, 152, 390., false, "Lazy", false);
1085 QCOMPARE(lvwph->m_minYExtent, 12230./3.);
1086 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1087 QCOMPARE(lvwph->m_clipItem->clip(), false);
1088 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1089 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1090 QCOMPARE(lvwph->contentY(), 1458.);
1091 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1092 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1093 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1094 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1096 changeContentY(-1700);
1098 QTRY_COMPARE(lvwph->m_visibleItems.count(), 10);
1099 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1100 verifyItem(0, -323., 75., true, QString(), true);
1101 verifyItem(1, -248., 115., true, "Regular", true);
1102 verifyItem(2, -133., 75., true, QString(), true);
1103 verifyItem(3, -58., 75., false, QString(), true);
1104 verifyItem(4, 17., 115., false, "Agressive", false);
1105 verifyItem(5, 132., 75., false, QString(), true);
1106 verifyItem(6, 207., 75., false, QString(), true);
1107 verifyItem(7, 282., 150., false, QString(), true);
1108 verifyItem(8, 432., 240., false, "Regular", false);
1109 QCOMPARE(lvwph->m_minYExtent, 980.5);
1110 QCOMPARE(lvwph->m_clipItem->y(), -192.);
1111 QCOMPARE(lvwph->m_clipItem->clip(), true);
1112 QCOMPARE(lvwph->m_headerItem->y(), -242.);
1113 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1114 QCOMPARE(lvwph->contentY(), -242.);
1115 QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1116 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1117 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1118 QCOMPARE(lvwph->m_topSectionItem->y(), -23.);
1121 void testRemoveItemsAtTop()
1123 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1125 QTRY_COMPARE(lvwph->m_visibleItems.count(), 2);
1126 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1127 verifyItem(0, 50., 390., false, "Mild", false);
1128 verifyItem(1, 440., 390., false, "Bold", false);
1129 QCOMPARE(lvwph->m_minYExtent, 0.);
1130 QCOMPARE(lvwph->m_clipItem->y(), 0.);
1131 QCOMPARE(lvwph->m_clipItem->clip(), false);
1132 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1133 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1134 QCOMPARE(lvwph->contentY(), 0.);
1135 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1136 QVERIFY(lvwph->isAtYBeginning());
1137 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1140 void testRemoveNonCreatedItemsAtTopWhenAtBottom()
1142 scrollToBottom();
1144 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 2));
1146 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1147 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1148 verifyItem(0, -588., 390., true, "Bold", true);
1149 verifyItem(1, -198, 350., false, QString(), true);
1150 verifyItem(2, 152, 390., false, "Lazy", false);
1151 QCOMPARE(lvwph->m_minYExtent, -1330./3.);
1152 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1153 QCOMPARE(lvwph->m_clipItem->clip(), false);
1154 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1155 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1156 QCOMPARE(lvwph->contentY(), 1458.);
1157 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1158 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1159 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1160 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1163 void testRemoveLastItemsAtBottom()
1165 scrollToBottom();
1167 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 4), Q_ARG(QVariant, 2));
1169 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1170 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1171 verifyItem(0, -478., 240., true, "Regular", true);
1172 verifyItem(1, -238, 390., false, "Mild", true);
1173 verifyItem(2, 152, 390., false, "Bold", false);
1174 QCOMPARE(lvwph->m_minYExtent, 150.);
1175 QCOMPARE(lvwph->m_clipItem->y(), 718.);
1176 QCOMPARE(lvwph->m_clipItem->clip(), false);
1177 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1178 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1179 QCOMPARE(lvwph->contentY(), 718.);
1180 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1181 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1182 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1183 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1186 void testRemoveItemOutOfViewport()
1188 changeContentY(520);
1190 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1191 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1192 verifyItem(0, -280., 240., true, "Regular", true);
1193 verifyItem(1, -40, 390., false, "Mild", true);
1194 verifyItem(2, 350, 390., false, "Bold", false);
1195 verifyItem(3, 740, 350., true, QString(), true);
1196 QCOMPARE(lvwph->m_minYExtent, 152.5);
1197 QCOMPARE(lvwph->m_clipItem->y(), 520.);
1198 QCOMPARE(lvwph->m_clipItem->clip(), false);
1199 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1200 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1201 QCOMPARE(lvwph->contentY(), 520.);
1202 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1203 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1204 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1205 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1207 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1209 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1210 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1211 verifyItem(0, -230., 190., true, "Agressive", true);
1212 verifyItem(1, -40, 390., false, "Mild", true);
1213 verifyItem(2, 350, 390., false, "Bold", false);
1214 verifyItem(3, 740, 350., true, QString(), true);
1215 QCOMPARE(lvwph->m_minYExtent, -240.);
1216 QCOMPARE(lvwph->m_clipItem->y(), 520.);
1217 QCOMPARE(lvwph->m_clipItem->clip(), false);
1218 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1219 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1220 QCOMPARE(lvwph->contentY(), 520.);
1221 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1222 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1223 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1224 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1227 void testRemoveFirstOfCategory()
1229 changeContentY(520);
1231 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1232 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1233 verifyItem(0, -280., 240., true, "Regular", true);
1234 verifyItem(1, -40, 390., false, "Mild", true);
1235 verifyItem(2, 350, 390., false, "Bold", false);
1236 verifyItem(3, 740, 350., true, QString(), true);
1237 QCOMPARE(lvwph->m_minYExtent, 152.5);
1238 QCOMPARE(lvwph->m_clipItem->y(), 520.);
1239 QCOMPARE(lvwph->m_clipItem->clip(), false);
1240 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1241 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1242 QCOMPARE(lvwph->contentY(), 520.);
1243 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1244 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1245 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1246 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1248 QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 3), Q_ARG(QVariant, 1));
1250 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1251 QCOMPARE(lvwph->m_firstVisibleIndex, 1);
1252 verifyItem(0, -280., 240., true, "Regular", true);
1253 verifyItem(1, -40, 390., false, "Mild", true);
1254 verifyItem(2, 350, 390., false, "Bold", false);
1255 verifyItem(3, 740, 390., true, "Lazy", true);
1256 QCOMPARE(lvwph->m_minYExtent, 162.5);
1257 QCOMPARE(lvwph->m_clipItem->y(), 520.);
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(), 520.);
1262 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1263 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1264 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1265 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1268 void testAddSecondToCulledCategoryOfTwo()
1270 // Do some setup
1271 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 25), Q_ARG(QVariant, "Agressive"));
1272 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 25), Q_ARG(QVariant, "Agressive"));
1274 changeContentY(200);
1276 // Very the items are culled
1277 verifyItem(0, -150., 65., true, "Agressive", true);
1278 verifyItem(1, -85, 25., true, QString(), true);
1280 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 1), Q_ARG(QVariant, 25), Q_ARG(QVariant, "Agressive"));
1282 // Very the new item is there correctly
1283 verifyItem(0, -175., 65., true, "Agressive", true);
1284 verifyItem(1, -110, 25., true, QString(), true);
1285 verifyItem(2, -85, 25., true, QString(), true);
1288 void testMoveFirstItems()
1290 QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 1), Q_ARG(QVariant, 1));
1292 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1293 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1294 verifyItem(0, 50., 240., false, "Regular", false);
1295 verifyItem(1, 290., 190., false, "Agressive", false);
1296 verifyItem(2, 480., 390., false, "Mild", false);
1297 QCOMPARE(lvwph->m_minYExtent, 0.);
1298 QCOMPARE(lvwph->m_clipItem->y(), 0.);
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(), 0.);
1303 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1304 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1307 void testMoveFirstOutOfVisibleItems()
1309 QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 4), Q_ARG(QVariant, 1));
1311 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1312 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1313 verifyItem(0, 50., 240., false, "Regular", false);
1314 verifyItem(1, 290., 390., false, "Mild", false);
1315 verifyItem(2, 680., 390., true, "Bold", true);
1316 QCOMPARE(lvwph->m_minYExtent, 0.);
1317 QCOMPARE(lvwph->m_clipItem->y(), 0.);
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(), 0.);
1322 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1323 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1326 void testMoveFirstToLastAtBottom()
1328 scrollToBottom();
1330 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1331 QCOMPARE(lvwph->m_firstVisibleIndex, 3);
1332 verifyItem(0, -588., 390., true, "Bold", true);
1333 verifyItem(1, -198, 350., false, QString(), true);
1334 verifyItem(2, 152, 390., false, "Lazy", false);
1335 QCOMPARE(lvwph->m_minYExtent, 310.);
1336 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1337 QCOMPARE(lvwph->m_clipItem->clip(), false);
1338 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1339 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1340 QCOMPARE(lvwph->contentY(), 1458.);
1341 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1342 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1343 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1344 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1346 QMetaObject::invokeMethod(model, "moveItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 5), Q_ARG(QVariant, 1));
1348 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1349 QCOMPARE(lvwph->m_firstVisibleIndex, 2);
1350 verifyItem(0, -588., 390., true, "Bold", true);
1351 verifyItem(1, -198, 350., false, QString(), true);
1352 verifyItem(2, 152, 390., false, "Lazy", false);
1353 verifyItem(3, 542, 190., true, "Agressive", true);
1354 QCOMPARE(lvwph->m_minYExtent, -160.);
1355 QCOMPARE(lvwph->m_clipItem->y(), 1458.);
1356 QCOMPARE(lvwph->m_clipItem->clip(), false);
1357 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1358 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1359 QCOMPARE(lvwph->contentY(), 1458.);
1360 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1361 QVERIFY(!lvwph->isAtYEnd());
1362 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1363 QCOMPARE(section(lvwph->m_topSectionItem), QString("Bold"));
1364 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1367 void testChangeSizeVisibleItemNotOnViewport()
1369 changeContentY(490);
1371 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1372 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1373 verifyItem(0, -440., 190., true, "Agressive", true);
1374 verifyItem(1, -250., 240., true, "Regular", true);
1375 verifyItem(2, -10, 390., false, "Mild", true);
1376 verifyItem(3, 380, 390., false, "Bold", false);
1377 verifyItem(4, 770, 350., true, QString(), true);
1378 QCOMPARE(lvwph->m_minYExtent, 0.);
1379 QCOMPARE(lvwph->m_clipItem->y(), 490.);
1380 QCOMPARE(lvwph->m_clipItem->clip(), false);
1381 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1382 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1383 QCOMPARE(lvwph->contentY(), 490.);
1384 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1385 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1386 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1387 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1389 model->setProperty(1, "size", 100);
1391 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1392 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1393 verifyItem(0, -340., 190., true, "Agressive", true);
1394 verifyItem(1, -150., 140., true, "Regular", true);
1395 verifyItem(2, -10, 390., false, "Mild", true);
1396 verifyItem(3, 380, 390., false, "Bold", false);
1397 verifyItem(4, 770, 350., true, QString(), true);
1398 QCOMPARE(lvwph->m_minYExtent, -100.);
1399 QCOMPARE(lvwph->m_clipItem->y(), 490.);
1400 QCOMPARE(lvwph->m_clipItem->clip(), false);
1401 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1402 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1403 QCOMPARE(lvwph->contentY(), 490.);
1404 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1405 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1406 QCOMPARE(section(lvwph->m_topSectionItem), QString("Mild"));
1407 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1410 void testShowHeaderCloseToTheTop()
1412 changeContentY(375);
1414 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1415 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1416 verifyItem(0, -325., 190., true, "Agressive", true);
1417 verifyItem(1, -135, 240., false, "Regular", true);
1418 verifyItem(2, 105, 390., false, "Mild", false);
1419 verifyItem(3, 495, 390., false, "Bold", false);
1420 QCOMPARE(lvwph->m_minYExtent, 0.);
1421 QCOMPARE(lvwph->m_clipItem->y(), 375.);
1422 QCOMPARE(lvwph->m_clipItem->clip(), false);
1423 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1424 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1425 QCOMPARE(lvwph->contentY(), 375.);
1426 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);;
1427 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1428 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1429 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1431 lvwph->showHeader();
1433 QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1434 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1435 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1436 verifyItem(0, -375., 190., true, "Agressive", true);
1437 verifyItem(1, -185, 240., false, "Regular", true);
1438 verifyItem(2, 55, 390., false, "Mild", false);
1439 verifyItem(3, 445, 390., false, "Bold", false);
1440 QCOMPARE(lvwph->m_minYExtent, 50.);
1441 QCOMPARE(lvwph->m_clipItem->y(), 375.);
1442 QCOMPARE(lvwph->m_clipItem->clip(), true);
1443 QCOMPARE(lvwph->m_headerItem->y(), 325.);
1444 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1445 QCOMPARE(lvwph->contentY(), 325.);
1446 QCOMPARE(lvwph->m_headerItemShownHeight, 50.);
1447 QVERIFY(!QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1448 QCOMPARE(section(lvwph->m_topSectionItem), QString("Regular"));
1449 QCOMPARE(lvwph->m_topSectionItem->y(), 0.);
1451 scrollToTop();
1453 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1454 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1455 verifyItem(0, 50., 190., false, "Agressive", false);
1456 verifyItem(1, 240., 240., false, "Regular", false);
1457 verifyItem(2, 480., 390., false, "Mild", false);
1458 QCOMPARE(lvwph->m_minYExtent, 50.);
1459 QCOMPARE(lvwph->m_clipItem->y(), -50.);
1460 QCOMPARE(lvwph->m_clipItem->clip(), false);
1461 QCOMPARE(lvwph->m_headerItem->y(), -50.);
1462 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1463 QCOMPARE(lvwph->contentY(), -50.);
1464 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1465 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
1468 void testShowHeaderAtBottom()
1470 scrollToBottom();
1472 lvwph->showHeader();
1474 QTRY_VERIFY(!lvwph->m_headerShowAnimation->isRunning());
1475 QTRY_VERIFY (lvwph->isAtYEnd());
1478 void growWindow()
1480 view->rootObject()->setHeight(850);
1482 QTRY_COMPARE(lvwph->m_visibleItems.count(), 5);
1483 QCOMPARE(lvwph->m_firstVisibleIndex, 0);
1484 verifyItem(0, 50., 190., false, "Agressive", false);
1485 verifyItem(1, 240., 240., false, "Regular", false);
1486 verifyItem(2, 480., 390., false, "Mild", false);
1487 verifyItem(3, 870., 390., true, "Bold", true);
1488 verifyItem(4, 1260., 350., true, QString(), true);
1489 QCOMPARE(lvwph->m_minYExtent, 0.);
1490 QCOMPARE(lvwph->m_clipItem->y(), 0.);
1491 QCOMPARE(lvwph->m_clipItem->clip(), false);
1492 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1493 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1494 QCOMPARE(lvwph->contentY(), 0.);
1495 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1498 void growWindowAtBottom()
1500 // Need a bunch small items at the bottom to trigger the problem
1501 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1502 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1503 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1504 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1505 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1506 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1507 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1508 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1509 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1510 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1511 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1512 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Regular"));
1513 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1514 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1515 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1516 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1517 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1518 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1519 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1520 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 6), Q_ARG(QVariant, 50), Q_ARG(QVariant, "Agressive"));
1522 scrollToBottom();
1524 view->rootObject()->setHeight(850);
1526 QTRY_COMPARE(lvwph->m_visibleItems.count(), 21);
1527 QCOMPARE(lvwph->m_firstVisibleIndex, 5);
1528 verifyItem(0, -660., 390., true, "Lazy", true);
1529 verifyItem(1, -270., 90., true, "Agressive", true);
1530 verifyItem(2, -180, 50., true, QString(), true);
1531 verifyItem(3, -130, 50., true, QString(), true);
1532 verifyItem(4, -80, 50., true, QString(), true);
1533 verifyItem(5, -30, 50., false, QString(), true);
1534 verifyItem(6, 20, 50., false, QString(), true);
1535 verifyItem(7, 70, 50., false, QString(), true);
1536 verifyItem(8, 120, 50., false, QString(), true);
1537 verifyItem(9, 170, 90., false, "Regular", false);
1538 verifyItem(10, 260, 50., false, QString(), true);
1539 verifyItem(11, 310, 50., false, QString(), true);
1540 verifyItem(12, 360, 50., false, QString(), true);
1541 verifyItem(13, 410, 50., false, QString(), true);
1542 verifyItem(14, 460, 50., false, QString(), true);
1543 verifyItem(15, 510, 90., false, "Agressive", false);
1544 verifyItem(16, 600, 50., false, QString(), true);
1545 verifyItem(17, 650, 50., false, QString(), true);
1546 verifyItem(18, 700, 50., false, QString(), true);
1547 verifyItem(19, 750, 50., false, QString(), true);
1548 verifyItem(20, 800, 50., false, QString(), true);
1549 QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - 1970 + 50);
1550 QCOMPARE(lvwph->m_clipItem->y(), 1970.);
1551 QCOMPARE(lvwph->m_clipItem->clip(), false);
1552 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1553 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1554 QCOMPARE(lvwph->contentY(), 1970.);
1555 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1558private:
1559 QQuickView *view;
1560 ListViewWithPageHeader *lvwph;
1561 QQuickListModel *model;
1562 QQmlComponent *otherDelegate;
1565QTEST_MAIN(ListViewWithPageHeaderTestSection)
1567#include "listviewwithpageheadertestsection.moc"