@@ -0,0 +1,302 @@
1+
2+#include <QQuickView>
3+#include <QtTestGui>
4+#include <QDebug>
5+#include <QGuiApplication>
6+#include <QQuickView>
7+#include <QtQml/qqml.h>
8+#include <QStringListModel>
9+#include <QQmlContext>
10+#include <private/qquickitem_p.h>
11+
12+#include "verticaljournal.h"
13+
14+class QHeightModel : public QStringListModel {
15+public:
16+ QHash<int, QByteArray> roleNames() const
17+ {
18+ QHash<int, QByteArray> roles;
19+ roles.insert(Qt::DisplayRole, "modelHeight");
20+ return roles;
21+ }
22+};
23+
24+class VerticalJournalTest : public QObject
25+{
26+ Q_OBJECT
27+
28+private:
29+ void verifyItem(const VerticalJournal::ViewItem &item, int modelIndex, qreal x, qreal y, bool visible)
30+ {
31+ QTRY_COMPARE(item.m_modelIndex, modelIndex);
32+ QTRY_COMPARE(item.x(), x);
33+ QTRY_COMPARE(item.y(), y);
34+ QTRY_COMPARE(item.height(), heightList[modelIndex].toDouble());
35+ QTRY_COMPARE(QQuickItemPrivate::get(item.m_item)->culled, !visible);
36+ }
37+
38+ void checkInitialPositions()
39+ {
40+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
41+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
42+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
43+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
44+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
45+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
46+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
47+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 170, 70, true);
48+ verifyItem(vj->m_columnVisibleItems[1][2], 4, 170, 90, true);
49+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 120, true);
50+ verifyItem(vj->m_columnVisibleItems[1][3], 6, 170, 140, true);
51+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 145, true);
52+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 200, true);
53+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 265, true);
54+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 295, true);
55+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 325, true);
56+ verifyItem(vj->m_columnVisibleItems[1][4], 12, 170, 350, true);
57+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 370, true);
58+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 400, false);
59+ verifyItem(vj->m_columnVisibleItems[1][5], 15, 170, 440, false);
60+ verifyItem(vj->m_columnVisibleItems[0][4], 16, 10, 580, false);
61+ verifyItem(vj->m_columnVisibleItems[1][6], 17, 170, 580, false);
62+ QCOMPARE(vj->implicitHeight(), 990. + 2. * 990. / 18.);
63+ }
64+
65+private Q_SLOTS:
66+ void initTestCase()
67+ {
68+ qmlRegisterType<QAbstractItemModel>();
69+ qmlRegisterType<VerticalJournal>("Journals", 0, 1, "VerticalJournal");
70+ }
71+
72+ void init()
73+ {
74+ view = new QQuickView();
75+ view->setResizeMode(QQuickView::SizeRootObjectToView);
76+
77+ model = new QHeightModel();
78+ heightList.clear();
79+ heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
80+ model->setStringList(heightList);
81+
82+ view->rootContext()->setContextProperty("theModel", model);
83+
84+ view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
85+
86+ view->show();
87+ view->resize(490, 400);
88+ QTest::qWaitForWindowExposed(view);
89+
90+ vj = view->rootObject()->findChild<VerticalJournal*>();
91+ vj->setModel(model);
92+
93+ checkInitialPositions();
94+ }
95+
96+ void cleanup()
97+ {
98+ delete view;
99+ delete model;
100+ }
101+
102+ void testWidthResize()
103+ {
104+ view->resize(649, 400);
105+
106+ // This is exactly the same block as above as nothing changed, just white space on the right
107+ checkInitialPositions();
108+
109+ view->resize(650, 400);
110+
111+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 4);
112+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
113+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
114+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 4);
115+ QTRY_COMPARE(vj->m_columnVisibleItems[3].count(), 5);
116+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
117+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
118+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
119+ verifyItem(vj->m_columnVisibleItems[3][0], 3, 490, 10, true);
120+ verifyItem(vj->m_columnVisibleItems[3][1], 4, 490, 30, true);
121+ verifyItem(vj->m_columnVisibleItems[1][1], 5, 170, 70, true);
122+ verifyItem(vj->m_columnVisibleItems[3][2], 6, 490, 80, true);
123+ verifyItem(vj->m_columnVisibleItems[0][1], 7, 10, 120, true);
124+ verifyItem(vj->m_columnVisibleItems[2][1], 8, 330, 145, true);
125+ verifyItem(vj->m_columnVisibleItems[1][2], 9, 170, 150, true);
126+ verifyItem(vj->m_columnVisibleItems[1][3], 10, 170, 180, true);
127+ verifyItem(vj->m_columnVisibleItems[1][4], 11, 170, 210, true);
128+ verifyItem(vj->m_columnVisibleItems[0][2], 12, 10, 240, true);
129+ verifyItem(vj->m_columnVisibleItems[1][5], 13, 170, 285, true);
130+ verifyItem(vj->m_columnVisibleItems[3][3], 14, 490, 290, true);
131+ verifyItem(vj->m_columnVisibleItems[2][2], 15, 330, 315, true);
132+ verifyItem(vj->m_columnVisibleItems[0][3], 16, 10, 330, true);
133+ verifyItem(vj->m_columnVisibleItems[2][3], 17, 330, 455, false);
134+ verifyItem(vj->m_columnVisibleItems[1][6], 18, 170, 495, false);
135+ verifyItem(vj->m_columnVisibleItems[3][4], 19, 490, 600, false);
136+ QTRY_COMPARE(vj->implicitHeight(), 1005.);
137+
138+ view->resize(490, 400);
139+
140+ // This is exactly the same block as the first again
141+ checkInitialPositions();
142+ }
143+
144+ void testHorizontalSpacing()
145+ {
146+ vj->setHorizontalSpacing(11);
147+
148+ QTRY_COMPARE(vj->m_needsRelayout, false);
149+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
150+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
151+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
152+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 11, 10, true);
153+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 172, 10, true);
154+ verifyItem(vj->m_columnVisibleItems[1][1], 2, 172, 70, true);
155+ verifyItem(vj->m_columnVisibleItems[0][1], 3, 11, 120, true);
156+ verifyItem(vj->m_columnVisibleItems[0][2], 4, 11, 140, true);
157+ verifyItem(vj->m_columnVisibleItems[0][3], 5, 11, 190, true);
158+ verifyItem(vj->m_columnVisibleItems[1][2], 6, 172, 205, true);
159+ verifyItem(vj->m_columnVisibleItems[0][4], 7, 11, 270, true);
160+ verifyItem(vj->m_columnVisibleItems[0][5], 8, 11, 390, true);
161+ verifyItem(vj->m_columnVisibleItems[1][3], 9, 172, 415, false);
162+ verifyItem(vj->m_columnVisibleItems[1][4], 10, 172, 445, false);
163+ verifyItem(vj->m_columnVisibleItems[1][5], 11, 172, 475, false);
164+ verifyItem(vj->m_columnVisibleItems[1][6], 12, 172, 550, false);
165+ verifyItem(vj->m_columnVisibleItems[0][6], 13, 11, 560, false);
166+ QCOMPARE(vj->implicitHeight(), 770. + 6. * 770. / 14.);
167+
168+ vj->setHorizontalSpacing(10);
169+ QTRY_COMPARE(vj->m_needsRelayout, false);
170+
171+ // This is exactly the same block as the first again
172+ checkInitialPositions();
173+ }
174+
175+ void testVerticalSpacing()
176+ {
177+ vj->setVerticalSpacing(11);
178+
179+ QTRY_COMPARE(vj->m_needsRelayout, false);
180+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
181+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
182+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
183+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
184+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 11, true);
185+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 11, true);
186+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 11, true);
187+ verifyItem(vj->m_columnVisibleItems[1][1], 3, 170, 72, true);
188+ verifyItem(vj->m_columnVisibleItems[1][2], 4, 170, 93, true);
189+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 122, true);
190+ verifyItem(vj->m_columnVisibleItems[1][3], 6, 170, 144, true);
191+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 147, true);
192+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 203, true);
193+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 268, true);
194+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 299, true);
195+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 330, true);
196+ verifyItem(vj->m_columnVisibleItems[1][4], 12, 170, 355, true);
197+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 374, true);
198+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 406, false);
199+ verifyItem(vj->m_columnVisibleItems[1][5], 15, 170, 446, false);
200+ verifyItem(vj->m_columnVisibleItems[0][4], 16, 10, 585, false);
201+ verifyItem(vj->m_columnVisibleItems[1][6], 17, 170, 587, false);
202+ QCOMPARE(vj->implicitHeight(), 990. + 2. * 990. / 18.);
203+
204+ vj->setVerticalSpacing(10);
205+ QTRY_COMPARE(vj->m_needsRelayout, false);
206+
207+ // This is exactly the same block as the first again
208+ checkInitialPositions();
209+ }
210+
211+ void testDelegateCreationRanges()
212+ {
213+ vj->setDelegateCreationBegin(200);
214+ vj->setDelegateCreationEnd(view->height());
215+
216+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
217+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
218+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 4);
219+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
220+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, false);
221+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, false);
222+ verifyItem(vj->m_columnVisibleItems[1][0], 4, 170, 90, false);
223+ verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 120, false);
224+ verifyItem(vj->m_columnVisibleItems[1][1], 6, 170, 140, true);
225+ verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 145, true);
226+ verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 200, true);
227+ verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 265, true);
228+ verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 295, true);
229+ verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 325, true);
230+ verifyItem(vj->m_columnVisibleItems[1][2], 12, 170, 350, true);
231+ verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 370, true);
232+ verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 400, false);
233+ verifyItem(vj->m_columnVisibleItems[1][3], 15, 170, 440, false);
234+ QCOMPARE(vj->implicitHeight(), 710. + 4. * 710. / 16.);
235+
236+ vj->resetDelegateCreationBegin();
237+ vj->resetDelegateCreationEnd();
238+
239+ // This is exactly the same block as the first again
240+ checkInitialPositions();
241+ }
242+
243+
244+ void testColumnWidthChange()
245+ {
246+ vj->setColumnWidth(200);
247+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
248+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
249+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
250+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
251+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 220, 10, true);
252+ verifyItem(vj->m_columnVisibleItems[1][1], 2, 220, 70, true);
253+ verifyItem(vj->m_columnVisibleItems[0][1], 3, 10, 120, true);
254+ verifyItem(vj->m_columnVisibleItems[0][2], 4, 10, 140, true);
255+ verifyItem(vj->m_columnVisibleItems[0][3], 5, 10, 190, true);
256+ verifyItem(vj->m_columnVisibleItems[1][2], 6, 220, 205, true);
257+ verifyItem(vj->m_columnVisibleItems[0][4], 7, 10, 270, true);
258+ verifyItem(vj->m_columnVisibleItems[0][5], 8, 10, 390, true);
259+ verifyItem(vj->m_columnVisibleItems[1][3], 9, 220, 415, false);
260+ verifyItem(vj->m_columnVisibleItems[1][4], 10, 220, 445, false);
261+ verifyItem(vj->m_columnVisibleItems[1][5], 11, 220, 475, false);
262+ verifyItem(vj->m_columnVisibleItems[1][6], 12, 220, 550, false);
263+ verifyItem(vj->m_columnVisibleItems[0][6], 13, 10, 560, false);
264+ QCOMPARE(vj->implicitHeight(), 770. + 6. * 770. / 14.);
265+
266+ vj->setColumnWidth(150);
267+
268+ // This is exactly the same block as the first again
269+ checkInitialPositions();
270+ }
271+
272+ void testChangeModel()
273+ {
274+ QHeightModel model2;
275+ QStringList list2;
276+ list2 << "100" << "50" << "25" << "25" << "50" << "50";
277+ model2.setStringList(list2);
278+ vj->setModel(&model2);
279+ heightList = list2;
280+
281+ QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
282+ QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 1);
283+ QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
284+ QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
285+ verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
286+ verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
287+ verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
288+ verifyItem(vj->m_columnVisibleItems[2][1], 3, 330, 45, true);
289+ verifyItem(vj->m_columnVisibleItems[1][1], 4, 170, 70, true);
290+ verifyItem(vj->m_columnVisibleItems[2][2], 5, 330, 80, true);
291+ }
292+
293+private:
294+ QQuickView *view;
295+ VerticalJournal *vj;
296+ QStringList heightList;
297+ QHeightModel *model;
298+};
299+
300+QTEST_MAIN(VerticalJournalTest)
301+
302+#include "verticaljournaltest.moc"