/*
* Copyright (C) 2013 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "verticaljournal.h"
class QHeightModel : public QStringListModel {
public:
QHash roleNames() const
{
QHash roles;
roles.insert(Qt::DisplayRole, "modelHeight");
return roles;
}
};
class VerticalJournalTest : public QObject
{
Q_OBJECT
private:
void verifyItem(const VerticalJournal::ViewItem &item, int modelIndex, qreal x, qreal y, bool visible)
{
QTRY_COMPARE(item.m_modelIndex, modelIndex);
QTRY_COMPARE(item.x(), x);
QTRY_COMPARE(item.y(), y);
QTRY_COMPARE(item.height(), heightList[modelIndex].toDouble());
QTRY_COMPARE(QQuickItemPrivate::get(item.m_item)->culled, !visible);
}
void checkInitialPositions()
{
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
verifyItem(vj->m_columnVisibleItems[1][1], 3, 170, 70, true);
verifyItem(vj->m_columnVisibleItems[1][2], 4, 170, 90, true);
verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 120, true);
verifyItem(vj->m_columnVisibleItems[1][3], 6, 170, 140, true);
verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 145, true);
verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 200, true);
verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 265, true);
verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 295, true);
verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 325, true);
verifyItem(vj->m_columnVisibleItems[1][4], 12, 170, 350, true);
verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 370, true);
verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 400, false);
verifyItem(vj->m_columnVisibleItems[1][5], 15, 170, 440, false);
verifyItem(vj->m_columnVisibleItems[0][4], 16, 10, 580, false);
verifyItem(vj->m_columnVisibleItems[1][6], 17, 170, 580, false);
QCOMPARE(vj->implicitHeight(), 990. + 2. * 990. / 18.);
}
private Q_SLOTS:
void initTestCase()
{
qmlRegisterType();
qmlRegisterType("Journals", 0, 1, "VerticalJournal");
}
void init()
{
view = new QQuickView();
view->setResizeMode(QQuickView::SizeRootObjectToView);
model = new QHeightModel();
heightList.clear();
heightList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10";
model->setStringList(heightList);
view->rootContext()->setContextProperty("theModel", model);
view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
view->show();
view->resize(490, 400);
QTest::qWaitForWindowExposed(view);
vj = view->rootObject()->findChild();
vj->setModel(model);
checkInitialPositions();
}
void cleanup()
{
delete view;
delete model;
}
void testWidthResize()
{
view->resize(649, 400);
// This is exactly the same block as above as nothing changed, just white space on the right
checkInitialPositions();
view->resize(650, 400);
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 4);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 4);
QTRY_COMPARE(vj->m_columnVisibleItems[3].count(), 5);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
verifyItem(vj->m_columnVisibleItems[3][0], 3, 490, 10, true);
verifyItem(vj->m_columnVisibleItems[3][1], 4, 490, 30, true);
verifyItem(vj->m_columnVisibleItems[1][1], 5, 170, 70, true);
verifyItem(vj->m_columnVisibleItems[3][2], 6, 490, 80, true);
verifyItem(vj->m_columnVisibleItems[0][1], 7, 10, 120, true);
verifyItem(vj->m_columnVisibleItems[2][1], 8, 330, 145, true);
verifyItem(vj->m_columnVisibleItems[1][2], 9, 170, 150, true);
verifyItem(vj->m_columnVisibleItems[1][3], 10, 170, 180, true);
verifyItem(vj->m_columnVisibleItems[1][4], 11, 170, 210, true);
verifyItem(vj->m_columnVisibleItems[0][2], 12, 10, 240, true);
verifyItem(vj->m_columnVisibleItems[1][5], 13, 170, 285, true);
verifyItem(vj->m_columnVisibleItems[3][3], 14, 490, 290, true);
verifyItem(vj->m_columnVisibleItems[2][2], 15, 330, 315, true);
verifyItem(vj->m_columnVisibleItems[0][3], 16, 10, 330, true);
verifyItem(vj->m_columnVisibleItems[2][3], 17, 330, 455, false);
verifyItem(vj->m_columnVisibleItems[1][6], 18, 170, 495, false);
verifyItem(vj->m_columnVisibleItems[3][4], 19, 490, 600, false);
QTRY_COMPARE(vj->implicitHeight(), 1005.);
view->resize(490, 400);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testHorizontalSpacing()
{
vj->setHorizontalSpacing(11);
QTRY_COMPARE(vj->m_needsRelayout, false);
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 11, 10, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 172, 10, true);
verifyItem(vj->m_columnVisibleItems[1][1], 2, 172, 70, true);
verifyItem(vj->m_columnVisibleItems[0][1], 3, 11, 120, true);
verifyItem(vj->m_columnVisibleItems[0][2], 4, 11, 140, true);
verifyItem(vj->m_columnVisibleItems[0][3], 5, 11, 190, true);
verifyItem(vj->m_columnVisibleItems[1][2], 6, 172, 205, true);
verifyItem(vj->m_columnVisibleItems[0][4], 7, 11, 270, true);
verifyItem(vj->m_columnVisibleItems[0][5], 8, 11, 390, true);
verifyItem(vj->m_columnVisibleItems[1][3], 9, 172, 415, false);
verifyItem(vj->m_columnVisibleItems[1][4], 10, 172, 445, false);
verifyItem(vj->m_columnVisibleItems[1][5], 11, 172, 475, false);
verifyItem(vj->m_columnVisibleItems[1][6], 12, 172, 550, false);
verifyItem(vj->m_columnVisibleItems[0][6], 13, 11, 560, false);
QCOMPARE(vj->implicitHeight(), 770. + 6. * 770. / 14.);
vj->setHorizontalSpacing(10);
QTRY_COMPARE(vj->m_needsRelayout, false);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testVerticalSpacing()
{
vj->setVerticalSpacing(11);
QTRY_COMPARE(vj->m_needsRelayout, false);
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 5);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 11, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 11, true);
verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 11, true);
verifyItem(vj->m_columnVisibleItems[1][1], 3, 170, 72, true);
verifyItem(vj->m_columnVisibleItems[1][2], 4, 170, 93, true);
verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 122, true);
verifyItem(vj->m_columnVisibleItems[1][3], 6, 170, 144, true);
verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 147, true);
verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 203, true);
verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 268, true);
verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 299, true);
verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 330, true);
verifyItem(vj->m_columnVisibleItems[1][4], 12, 170, 355, true);
verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 374, true);
verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 406, false);
verifyItem(vj->m_columnVisibleItems[1][5], 15, 170, 446, false);
verifyItem(vj->m_columnVisibleItems[0][4], 16, 10, 585, false);
verifyItem(vj->m_columnVisibleItems[1][6], 17, 170, 587, false);
QCOMPARE(vj->implicitHeight(), 990. + 2. * 990. / 18.);
vj->setVerticalSpacing(10);
QTRY_COMPARE(vj->m_needsRelayout, false);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testDelegateCreationRanges()
{
vj->setDelegateCreationBegin(200);
vj->setDelegateCreationEnd(view->height());
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 4);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 4);
QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 6);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, false);
verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, false);
verifyItem(vj->m_columnVisibleItems[1][0], 4, 170, 90, false);
verifyItem(vj->m_columnVisibleItems[0][1], 5, 10, 120, false);
verifyItem(vj->m_columnVisibleItems[1][1], 6, 170, 140, true);
verifyItem(vj->m_columnVisibleItems[2][1], 7, 330, 145, true);
verifyItem(vj->m_columnVisibleItems[0][2], 8, 10, 200, true);
verifyItem(vj->m_columnVisibleItems[2][2], 9, 330, 265, true);
verifyItem(vj->m_columnVisibleItems[2][3], 10, 330, 295, true);
verifyItem(vj->m_columnVisibleItems[2][4], 11, 330, 325, true);
verifyItem(vj->m_columnVisibleItems[1][2], 12, 170, 350, true);
verifyItem(vj->m_columnVisibleItems[0][3], 13, 10, 370, true);
verifyItem(vj->m_columnVisibleItems[2][5], 14, 330, 400, false);
verifyItem(vj->m_columnVisibleItems[1][3], 15, 170, 440, false);
QCOMPARE(vj->implicitHeight(), 710. + 4. * 710. / 16.);
vj->resetDelegateCreationBegin();
vj->resetDelegateCreationEnd();
// This is exactly the same block as the first again
checkInitialPositions();
}
void testColumnWidthChange()
{
vj->setColumnWidth(200);
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 2);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 7);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 7);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 220, 10, true);
verifyItem(vj->m_columnVisibleItems[1][1], 2, 220, 70, true);
verifyItem(vj->m_columnVisibleItems[0][1], 3, 10, 120, true);
verifyItem(vj->m_columnVisibleItems[0][2], 4, 10, 140, true);
verifyItem(vj->m_columnVisibleItems[0][3], 5, 10, 190, true);
verifyItem(vj->m_columnVisibleItems[1][2], 6, 220, 205, true);
verifyItem(vj->m_columnVisibleItems[0][4], 7, 10, 270, true);
verifyItem(vj->m_columnVisibleItems[0][5], 8, 10, 390, true);
verifyItem(vj->m_columnVisibleItems[1][3], 9, 220, 415, false);
verifyItem(vj->m_columnVisibleItems[1][4], 10, 220, 445, false);
verifyItem(vj->m_columnVisibleItems[1][5], 11, 220, 475, false);
verifyItem(vj->m_columnVisibleItems[1][6], 12, 220, 550, false);
verifyItem(vj->m_columnVisibleItems[0][6], 13, 10, 560, false);
QCOMPARE(vj->implicitHeight(), 770. + 6. * 770. / 14.);
vj->setColumnWidth(150);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testChangeModel()
{
QHeightModel model2;
QStringList list2;
list2 << "100" << "50" << "25" << "25" << "50" << "50";
model2.setStringList(list2);
vj->setModel(&model2);
heightList = list2;
QTRY_COMPARE(vj->m_columnVisibleItems.count(), 3);
QTRY_COMPARE(vj->m_columnVisibleItems[0].count(), 1);
QTRY_COMPARE(vj->m_columnVisibleItems[1].count(), 2);
QTRY_COMPARE(vj->m_columnVisibleItems[2].count(), 3);
verifyItem(vj->m_columnVisibleItems[0][0], 0, 10, 10, true);
verifyItem(vj->m_columnVisibleItems[1][0], 1, 170, 10, true);
verifyItem(vj->m_columnVisibleItems[2][0], 2, 330, 10, true);
verifyItem(vj->m_columnVisibleItems[2][1], 3, 330, 45, true);
verifyItem(vj->m_columnVisibleItems[1][1], 4, 170, 70, true);
verifyItem(vj->m_columnVisibleItems[2][2], 5, 330, 80, true);
}
private:
QQuickView *view;
VerticalJournal *vj;
QStringList heightList;
QHeightModel *model;
};
QTEST_MAIN(VerticalJournalTest)
#include "verticaljournaltest.moc"