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