/*
* Copyright (C) 2014 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
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-pedantic"
#include
#pragma GCC diagnostic pop
#include "organicgrid.h"
class DummyModel : public QAbstractListModel {
public:
DummyModel() : m_count(0) {}
int rowCount(const QModelIndex & /*parent*/) const
{
return m_count;
}
QVariant data(const QModelIndex & /*index*/, int /*role*/) const
{
return QVariant();
}
void setCount(int count)
{
beginResetModel();
m_count = count;
endResetModel();
}
void addItem()
{
beginInsertRows(QModelIndex(), m_count, m_count);
m_count++;
endInsertRows();
}
void removeLast()
{
beginRemoveRows(QModelIndex(), m_count - 1, m_count - 1);
m_count--;
endRemoveRows();
}
private:
int m_count;
};
class OrganicGridTest : public QObject
{
Q_OBJECT
private:
void verifyItem(const QQuickItem *item, int modelIndex, qreal x, qreal y, bool visible)
{
QTRY_COMPARE(item->x(), x);
QTRY_COMPARE(item->y(), y);
QTRY_COMPARE(QQuickItemPrivate::get(item)->culled, !visible);
const int inModuleIndex = modelIndex % 6;
if (inModuleIndex == 0 || inModuleIndex == 1 || inModuleIndex == 3 || inModuleIndex == 5) {
QTRY_COMPARE(item->height(), grid->smallDelegateSize().height());
QTRY_COMPARE(item->width(), grid->smallDelegateSize().width());
} else {
QTRY_COMPARE(item->height(), grid->bigDelegateSize().height());
QTRY_COMPARE(item->width(), grid->bigDelegateSize().width());
}
}
void checkInitialPositions()
{
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
checkImplicitHeight(1150);
}
void checkImplicitHeight(qreal implicitHeight)
{
QTRY_COMPARE(grid->m_implicitHeightDirty, false);
QCOMPARE(grid->implicitHeight(), implicitHeight);
}
private Q_SLOTS:
void init()
{
view = new QQuickView();
view->setResizeMode(QQuickView::SizeRootObjectToView);
view->engine()->addImportPath(BUILT_PLUGINS_DIR);
model = new DummyModel();
model->setCount(21);
view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
view->show();
QTest::qWaitForWindowExposed(view);
view->resize(470, 400);
grid = dynamic_cast(view->rootObject()->findChild("grid"));
grid->setModel(model);
QTRY_COMPARE(grid->width(), 470.);
checkInitialPositions();
}
void cleanup()
{
delete view;
delete model;
}
void testInitialPosition()
{
}
void testWidthResize()
{
view->resize(770, 400);
QTRY_COMPARE(grid->width(), 770.);
QTRY_COMPARE(grid->m_visibleItems.count(), 21);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 2);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 390, 0, true);
verifyItem(grid->m_visibleItems[ 7], 7, 490, 0, true);
verifyItem(grid->m_visibleItems[ 8], 8, 390, 100, true);
verifyItem(grid->m_visibleItems[ 9], 9, 580, 190, true);
verifyItem(grid->m_visibleItems[10], 10, 590, 0, true);
verifyItem(grid->m_visibleItems[11], 11, 680, 190, true);
verifyItem(grid->m_visibleItems[12], 12, 0, 290, true);
verifyItem(grid->m_visibleItems[13], 13, 100, 290, true);
verifyItem(grid->m_visibleItems[14], 14, 0, 390, true);
verifyItem(grid->m_visibleItems[15], 15, 190, 480, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 290, true);
verifyItem(grid->m_visibleItems[17], 17, 290, 480, false);
verifyItem(grid->m_visibleItems[18], 18, 390, 290, true);
verifyItem(grid->m_visibleItems[19], 19, 490, 290, true);
verifyItem(grid->m_visibleItems[20], 20, 390, 390, true);
checkImplicitHeight(570);
view->resize(769, 400);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testColumnSpacing()
{
grid->setColumnSpacing(11);
QTRY_COMPARE(grid->m_needsRelayout, false);
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 101, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 191, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 202, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 292, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[ 7], 7, 101, 290, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
verifyItem(grid->m_visibleItems[ 9], 9, 191, 480, false);
verifyItem(grid->m_visibleItems[10], 10, 202, 290, true);
verifyItem(grid->m_visibleItems[11], 11, 292, 480, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
verifyItem(grid->m_visibleItems[13], 13, 101, 580, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
verifyItem(grid->m_visibleItems[15], 15, 191, 770, false);
verifyItem(grid->m_visibleItems[16], 16, 202, 580, false);
verifyItem(grid->m_visibleItems[17], 17, 292, 770, false);
checkImplicitHeight(1150);
grid->setColumnSpacing(10);
QTRY_COMPARE(grid->m_needsRelayout, false);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testRowSpacing()
{
grid->setRowSpacing(11);
QTRY_COMPARE(grid->m_needsRelayout, false);
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 101, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 191, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 191, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 292, true);
verifyItem(grid->m_visibleItems[ 7], 7, 100, 292, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 393, true);
verifyItem(grid->m_visibleItems[ 9], 9, 190, 483, false);
verifyItem(grid->m_visibleItems[10], 10, 200, 292, true);
verifyItem(grid->m_visibleItems[11], 11, 290, 483, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 584, false);
verifyItem(grid->m_visibleItems[13], 13, 100, 584, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 685, false);
verifyItem(grid->m_visibleItems[15], 15, 190, 775, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 584, false);
verifyItem(grid->m_visibleItems[17], 17, 290, 775, false);
checkImplicitHeight(1157);
grid->setRowSpacing(10);
QTRY_COMPARE(grid->m_needsRelayout, false);
// This is exactly the same block as the first again
checkInitialPositions();
}
void testDelegateSizeChange()
{
grid->setSmallDelegateSize(QSizeF(30, 30));
grid->setBigDelegateSize(QSizeF(50, 50));
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 21);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 40, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 40, true);
verifyItem(grid->m_visibleItems[ 3], 3, 60, 60, true);
verifyItem(grid->m_visibleItems[ 4], 4, 80, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 100, 60, true);
verifyItem(grid->m_visibleItems[ 6], 6, 140, 0, true);
verifyItem(grid->m_visibleItems[ 7], 7, 180, 0, true);
verifyItem(grid->m_visibleItems[ 8], 8, 140, 40, true);
verifyItem(grid->m_visibleItems[ 9], 9, 200, 60, true);
verifyItem(grid->m_visibleItems[10], 10, 220, 0, true);
verifyItem(grid->m_visibleItems[11], 11, 240, 60, true);
verifyItem(grid->m_visibleItems[12], 12, 280, 0, true);
verifyItem(grid->m_visibleItems[13], 13, 320, 0, true);
verifyItem(grid->m_visibleItems[14], 14, 280, 40, true);
verifyItem(grid->m_visibleItems[15], 15, 340, 60, true);
verifyItem(grid->m_visibleItems[16], 16, 360, 0, true);
verifyItem(grid->m_visibleItems[17], 17, 380, 60, true);
verifyItem(grid->m_visibleItems[18], 18, 0, 100, true);
verifyItem(grid->m_visibleItems[19], 19, 40, 100, true);
verifyItem(grid->m_visibleItems[20], 20, 0, 140, true);
checkImplicitHeight(190);
grid->setSmallDelegateSize(QSizeF(90, 90));
grid->setBigDelegateSize(QSizeF(180, 180));
// This is exactly the same block as the first again
checkInitialPositions();
}
void testChangeModel()
{
DummyModel *model2 = new DummyModel();
model2->setCount(6);
grid->setModel(model2);
delete model;
model = model2;
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 6);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
checkImplicitHeight(280);
}
void testModelReset()
{
model->setCount(6);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 6);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
checkImplicitHeight(280);
}
void testModelRemoveLastNonVisible()
{
model->removeLast();
// This is the same than checkInitialPositions but
// with a different implicitHeight since there's an item less
// in the model
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
checkImplicitHeight(960);
model->removeLast();
// Removing this one didn't cause any change since it only
// was the second item of a non visible 6-module
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
checkImplicitHeight(960);
model->removeLast();
// Removing this one removes the first of a 6-module so
// it does change height again
QTRY_COMPARE(grid->m_visibleItems.count(), 18);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_numberOfModulesPerRow, 1);
verifyItem(grid->m_visibleItems[ 0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[ 1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[ 2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[ 3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[ 4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[ 5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[ 6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[ 7], 7, 100, 290, true);
verifyItem(grid->m_visibleItems[ 8], 8, 0, 390, true);
verifyItem(grid->m_visibleItems[ 9], 9, 190, 480, false);
verifyItem(grid->m_visibleItems[10], 10, 200, 290, true);
verifyItem(grid->m_visibleItems[11], 11, 290, 480, false);
verifyItem(grid->m_visibleItems[12], 12, 0, 580, false);
verifyItem(grid->m_visibleItems[13], 13, 100, 580, false);
verifyItem(grid->m_visibleItems[14], 14, 0, 680, false);
verifyItem(grid->m_visibleItems[15], 15, 190, 770, false);
verifyItem(grid->m_visibleItems[16], 16, 200, 580, false);
verifyItem(grid->m_visibleItems[17], 17, 290, 770, false);
checkImplicitHeight(860);
}
void testModelAppendRemoveLast()
{
DummyModel *model2 = new DummyModel();
model2->setCount(6);
grid->setModel(model2);
delete model;
model = model2;
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 6);
verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
checkImplicitHeight(280);
model2->addItem();
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 7);
verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
checkImplicitHeight(380);
model2->addItem();
model2->addItem();
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 9);
verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[7], 7, 100, 290, true);
verifyItem(grid->m_visibleItems[8], 8, 0, 390, true);
checkImplicitHeight(570);
model2->removeLast();
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 8);
verifyItem(grid->m_visibleItems[0], 0, 0, 0, true);
verifyItem(grid->m_visibleItems[1], 1, 100, 0, true);
verifyItem(grid->m_visibleItems[2], 2, 0, 100, true);
verifyItem(grid->m_visibleItems[3], 3, 190, 190, true);
verifyItem(grid->m_visibleItems[4], 4, 200, 0, true);
verifyItem(grid->m_visibleItems[5], 5, 290, 190, true);
verifyItem(grid->m_visibleItems[6], 6, 0, 290, true);
verifyItem(grid->m_visibleItems[7], 7, 100, 290, true);
checkImplicitHeight(380);
}
void testDelegateCreationRanges()
{
grid->setSmallDelegateSize(QSizeF(30, 30));
grid->setBigDelegateSize(QSizeF(50, 50));
model->setCount(400);
checkImplicitHeight(2290);
view->resize(470, 700);
QTRY_COMPARE(grid->height(), 700.);
checkImplicitHeight(2290);
QTRY_COMPARE(grid->m_firstVisibleIndex, 0);
QTRY_COMPARE(grid->m_visibleItems.count(), 198);
grid->setDelegateCreationBegin(300);
grid->setDelegateCreationEnd(400);
checkImplicitHeight(2290);
QTRY_COMPARE(grid->m_firstVisibleIndex, 36);
QTRY_COMPARE(grid->m_visibleItems.count(), 54);
checkImplicitHeight(2290);
grid->resetDelegateCreationBegin();
grid->resetDelegateCreationEnd();
view->resize(470, 470);
grid->setSmallDelegateSize(QSizeF(90, 90));
grid->setBigDelegateSize(QSizeF(180, 180));
model->setCount(21);
// This is exactly the same block as the first again
checkInitialPositions();
}
private:
QQuickView *view;
OrganicGrid *grid;
DummyModel *model;
};
QTEST_MAIN(OrganicGridTest)
#include "organicgridtest.moc"