/* * 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 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-pedantic" #include #pragma GCC diagnostic pop #include "horizontaljournal.h" class WidthModel : public QAbstractListModel { public: QHash roleNames() const { QHash roles; roles.insert(Qt::DisplayRole, "modelWidth"); return roles; } int rowCount(const QModelIndex & /*parent*/) const { return m_list.count(); } QVariant data(const QModelIndex &index, int /*role*/) const { return m_list[index.row()]; } QStringList stringList() const { return m_list; } void setStringList(const QStringList &list) { beginResetModel(); m_list = list; endResetModel(); } void addString(const QString& string) { beginInsertRows(QModelIndex(), m_list.count(), m_list.count()); m_list << string; endInsertRows(); } void removeLast() { beginRemoveRows(QModelIndex(), m_list.count() - 1, m_list.count() - 1); m_list.takeLast(); endRemoveRows(); } private: QStringList m_list; }; class HorizontalJournalTest : 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(item->width(), model->stringList()[modelIndex].toDouble()); QTRY_COMPARE(QQuickItemPrivate::get(item)->culled, !visible); } void checkInitialPositions() { QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 14); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true); verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true); verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true); verifyItem(hj->m_visibleItems[10], 10, 200, 320, true); verifyItem(hj->m_visibleItems[11], 11, 230, 320, true); verifyItem(hj->m_visibleItems[12], 12, 305, 320, true); verifyItem(hj->m_visibleItems[13], 13, 0, 480, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.); QCOMPARE(hj->implicitHeight(), 900.); } private Q_SLOTS: void init() { view = new QQuickView(); view->setResizeMode(QQuickView::SizeRootObjectToView); view->engine()->addImportPath(BUILT_PLUGINS_DIR); model = new WidthModel(); QStringList widthList; widthList << "100" << "50" << "125" << "10" << "40" << "70" << "200" << "110" << "160" << "20" << "20" << "65" << "80" << "200" << "300" << "130" << "400" << "300" << "500" << "10"; model->setStringList(widthList); view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/horizontaljournaltest.qml")); view->show(); view->resize(470, 400); QTest::qWaitForWindowExposed(view); hj = dynamic_cast(view->rootObject()->findChild("hj")); hj->setModel(model); checkInitialPositions(); } void cleanup() { delete view; delete model; } void testWidthResize() { view->resize(629, 400); QTRY_COMPARE(hj->width(), 629.); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 17); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true); verifyItem(hj->m_visibleItems[ 8], 8, 330, 160, true); verifyItem(hj->m_visibleItems[ 9], 9, 500, 160, true); verifyItem(hj->m_visibleItems[10], 10, 530, 160, true); verifyItem(hj->m_visibleItems[11], 11, 560, 160, true); verifyItem(hj->m_visibleItems[12], 12, 0, 320, true); verifyItem(hj->m_visibleItems[13], 13, 90, 320, true); verifyItem(hj->m_visibleItems[14], 14, 300, 320, true); verifyItem(hj->m_visibleItems[15], 15, 0, 480, false); verifyItem(hj->m_visibleItems[16], 16, 140, 480, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[11], 560.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[14], 300.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[16], 140.); QCOMPARE(hj->implicitHeight(), 630. + 3. * 630. / 17.); view->resize(470, 400); // This is exactly the same block as the first again checkInitialPositions(); } void testColumnSpacing() { hj->setColumnSpacing(11); QTRY_COMPARE(hj->m_needsRelayout, false); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 14); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 111, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 172, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 308, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 329, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 380, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[ 7], 7, 211, 160, true); verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true); verifyItem(hj->m_visibleItems[ 9], 9, 171, 320, true); verifyItem(hj->m_visibleItems[10], 10, 202, 320, true); verifyItem(hj->m_visibleItems[11], 11, 233, 320, true); verifyItem(hj->m_visibleItems[12], 12, 309, 320, true); verifyItem(hj->m_visibleItems[13], 13, 0, 480, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 380.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 211.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 309.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.); QCOMPARE(hj->implicitHeight(), 900.); hj->setColumnSpacing(10); QTRY_COMPARE(hj->m_needsRelayout, false); // This is exactly the same block as the first again checkInitialPositions(); } void testRowSpacing() { hj->setRowSpacing(11); QTRY_COMPARE(hj->m_needsRelayout, false); QTRY_COMPARE(hj->m_needsRelayout, false); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 14); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 161, true); verifyItem(hj->m_visibleItems[ 7], 7, 210, 161, true); verifyItem(hj->m_visibleItems[ 8], 8, 0, 322, true); verifyItem(hj->m_visibleItems[ 9], 9, 170, 322, true); verifyItem(hj->m_visibleItems[10], 10, 200, 322, true); verifyItem(hj->m_visibleItems[11], 11, 230, 322, true); verifyItem(hj->m_visibleItems[12], 12, 305, 322, true); verifyItem(hj->m_visibleItems[13], 13, 0, 483, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.); QCOMPARE(hj->implicitHeight(), 633. + 6. * 633. / 14.); hj->setRowSpacing(10); QTRY_COMPARE(hj->m_needsRelayout, false); // This is exactly the same block as the first again checkInitialPositions(); } void testDelegateCreationRanges() { hj->setDelegateCreationBegin(300); hj->setDelegateCreationEnd(view->height()); QTRY_COMPARE(hj->m_firstVisibleIndex, 6); QTRY_COMPARE(hj->m_visibleItems.count(), 7); verifyItem(hj->m_visibleItems[0], 6, 0, 160, true); verifyItem(hj->m_visibleItems[1], 7, 210, 160, true); verifyItem(hj->m_visibleItems[2], 8, 0, 320, true); verifyItem(hj->m_visibleItems[3], 9, 170, 320, true); verifyItem(hj->m_visibleItems[4], 10, 200, 320, true); verifyItem(hj->m_visibleItems[5], 11, 230, 320, true); verifyItem(hj->m_visibleItems[6], 12, 305, 320, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.); hj->resetDelegateCreationBegin(); hj->resetDelegateCreationEnd(); // This is exactly the same block as the first again checkInitialPositions(); } void testRowHeightChange() { hj->setRowHeight(200); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 13); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 210, true); verifyItem(hj->m_visibleItems[ 7], 7, 210, 210, true); verifyItem(hj->m_visibleItems[ 8], 8, 0, 420, false); verifyItem(hj->m_visibleItems[ 9], 9, 170, 420, false); verifyItem(hj->m_visibleItems[10], 10, 200, 420, false); verifyItem(hj->m_visibleItems[11], 11, 230, 420, false); verifyItem(hj->m_visibleItems[12], 12, 305, 420, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 3); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.); QCOMPARE(hj->implicitHeight(), 620. + 7. * 620. / 13.); hj->setRowHeight(150); // This is exactly the same block as the first again checkInitialPositions(); } void testChangeModel() { WidthModel *model2 = new WidthModel(); QStringList list2; list2 << "100" << "50" << "125" << "25" << "50" << "50"; model2->setStringList(list2); hj->setModel(model2); delete model; model = model2; QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 6); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0); QCOMPARE(hj->implicitHeight(), 150.); } void testModelReset() { QStringList widthList; widthList << "100" << "50" << "125" << "25" << "50" << "50"; model->setStringList(widthList); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 6); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 400, 0, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0); QCOMPARE(hj->implicitHeight(), 150.); } 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(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 14); verifyItem(hj->m_visibleItems[ 0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[ 1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[ 2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[ 3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[ 4], 4, 325, 0, true); verifyItem(hj->m_visibleItems[ 5], 5, 375, 0, true); verifyItem(hj->m_visibleItems[ 6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[ 7], 7, 210, 160, true); verifyItem(hj->m_visibleItems[ 8], 8, 0, 320, true); verifyItem(hj->m_visibleItems[ 9], 9, 170, 320, true); verifyItem(hj->m_visibleItems[10], 10, 200, 320, true); verifyItem(hj->m_visibleItems[11], 11, 230, 320, true); verifyItem(hj->m_visibleItems[12], 12, 305, 320, true); verifyItem(hj->m_visibleItems[13], 13, 0, 480, false); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 4); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 5], 375.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[ 7], 210.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[12], 305.); QTRY_COMPARE(hj->m_lastInRowIndexPosition[13], 0.); QTRY_COMPARE(hj->implicitHeight(), 855.); } void testModelAppendRemoveLast() { WidthModel *model2 = new WidthModel(); QStringList widthList; widthList << "100" << "50" << "125" << "25" << "50" << "50"; model2->setStringList(widthList); hj->setModel(model2); delete model; model = model2; QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 6); verifyItem(hj->m_visibleItems[0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[5], 5, 400, 0, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 0); QCOMPARE(hj->implicitHeight(), 150.); model2->addString("75"); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 7); verifyItem(hj->m_visibleItems[0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[5], 5, 400, 0, true); verifyItem(hj->m_visibleItems[6], 6, 0, 160, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1); QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.); QCOMPARE(hj->implicitHeight(), 310.); model2->addString("50"); model2->addString("50"); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 9); verifyItem(hj->m_visibleItems[0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[5], 5, 400, 0, true); verifyItem(hj->m_visibleItems[6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[7], 7, 85, 160, true); verifyItem(hj->m_visibleItems[8], 8, 145, 160, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1); QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.); QCOMPARE(hj->implicitHeight(), 310.); model2->removeLast(); QTRY_COMPARE(hj->m_firstVisibleIndex, 0); QTRY_COMPARE(hj->m_visibleItems.count(), 8); verifyItem(hj->m_visibleItems[0], 0, 0, 0, true); verifyItem(hj->m_visibleItems[1], 1, 110, 0, true); verifyItem(hj->m_visibleItems[2], 2, 170, 0, true); verifyItem(hj->m_visibleItems[3], 3, 305, 0, true); verifyItem(hj->m_visibleItems[4], 4, 340, 0, true); verifyItem(hj->m_visibleItems[5], 5, 400, 0, true); verifyItem(hj->m_visibleItems[6], 6, 0, 160, true); verifyItem(hj->m_visibleItems[7], 7, 85, 160, true); QTRY_COMPARE(hj->m_lastInRowIndexPosition.count(), 1); QTRY_COMPARE(hj->m_lastInRowIndexPosition[5], 400.); QCOMPARE(hj->implicitHeight(), 310.); } void testNegativeHeight() { QQuickItemPrivate::get(hj)->anchors()->resetFill(); hj->setHeight(-8); QStringList widthList; widthList << "100" << "50" << "125" << "25" << "50" << "50"; model->setStringList(widthList); QTRY_COMPARE(hj->m_visibleItems.count(), 0); QTRY_COMPARE(hj->implicitHeight(), 0.); } void testNegativeDelegateCreationRange() { hj->setDelegateCreationBegin(0); hj->setDelegateCreationEnd(-100); QStringList widthList; widthList << "100" << "50" << "50" << "30"; model->setStringList(widthList); QTRY_COMPARE(hj->m_visibleItems.count(), 0); QTRY_COMPARE(hj->implicitHeight(), 0.); } private: QQuickView *view; HorizontalJournal *hj; WidthModel *model; }; QTEST_MAIN(HorizontalJournalTest) #include "horizontaljournaltest.moc"