File indexing completed on 2024-12-01 04:35:27

0001 /*
0002    SPDX-FileCopyrightText: 2021 David Faure <faure@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 #include "roomlistheadingsproxymodeltest.h"
0007 #include "model/roomfilterproxymodel.h"
0008 #include "model/roomlistheadingsproxymodel.h"
0009 
0010 #include "rocketchataccount.h"
0011 #include <QStandardPaths>
0012 #include <QTest>
0013 
0014 QTEST_GUILESS_MAIN(RoomListHeadingsProxyModelTest)
0015 
0016 RoomListHeadingsProxyModelTest::RoomListHeadingsProxyModelTest(QObject *parent)
0017     : QObject(parent)
0018 {
0019     QStandardPaths::setTestModeEnabled(true);
0020 }
0021 
0022 static QStandardItem *newItem(const char *text, RoomModel::Section section)
0023 {
0024     auto item = new QStandardItem(QString::fromUtf8(text));
0025     item->setData(QVariant::fromValue(section), RoomModel::RoomSection);
0026     return item;
0027 }
0028 
0029 void RoomListHeadingsProxyModelTest::initTestCase()
0030 {
0031     // 0 favorites, 2 teams, 1 discussion, 2 private messages
0032     int row = 0;
0033     mSourceModel.setItem(row++, 0, newItem("Team 1", RoomModel::Section::Teams));
0034     mSourceModel.setItem(row++, 0, newItem("Team 2", RoomModel::Section::Teams));
0035     mSourceModel.setItem(row++, 0, newItem("PM 1", RoomModel::Section::PrivateMessages));
0036     mSourceModel.setItem(row++, 0, newItem("Discuss 1", RoomModel::Section::Discussions));
0037     mSourceModel.setItem(row++, 0, newItem("Discuss 2", RoomModel::Section::Discussions));
0038     QCOMPARE(mSourceModel.rowCount(), row);
0039 }
0040 
0041 void RoomListHeadingsProxyModelTest::shouldBeEmptyByDefault()
0042 {
0043     // GIVEN
0044     RoomListHeadingsProxyModel proxy;
0045     QStandardItemModel sourceModel;
0046     // WHEN
0047     proxy.setSourceModel(&sourceModel);
0048     // THEN
0049     QCOMPARE(proxy.rowCount({}), proxy.sectionCount);
0050     for (uint section = 0; section < proxy.sectionCount; ++section) {
0051         QCOMPARE(proxy.rowCount(proxy.index(section, 0, {})), 0);
0052     }
0053     QCOMPARE(proxy.sourceModel(), &sourceModel);
0054 }
0055 
0056 void RoomListHeadingsProxyModelTest::shouldReturnRowCount()
0057 {
0058     // GIVEN
0059     RoomListHeadingsProxyModel proxy;
0060     // WHEN
0061     proxy.setSourceModel(&mSourceModel);
0062     // THEN
0063     const auto expectedCount = [](RoomModel::Section section) {
0064         switch (section) {
0065         case RoomModel::Section::Unread:
0066         case RoomModel::Section::Favorites:
0067         case RoomModel::Section::Rooms:
0068         case RoomModel::Section::Unknown:
0069             return 0;
0070         case RoomModel::Section::Teams:
0071         case RoomModel::Section::Discussions:
0072             return 2;
0073         case RoomModel::Section::PrivateMessages:
0074             return 1;
0075         case RoomModel::Section::NSections:
0076             Q_UNREACHABLE();
0077         }
0078         Q_UNREACHABLE();
0079     };
0080 
0081     for (uint section = 0; section < proxy.sectionCount; ++section) {
0082         QCOMPARE(proxy.rowCount(proxy.index(section, 0, {})), expectedCount(RoomModel::Section(section)));
0083     }
0084 }
0085 
0086 void RoomListHeadingsProxyModelTest::shouldMapProxyRows_data()
0087 {
0088     QTest::addColumn<RoomModel::Section>("section");
0089     QTest::addColumn<int>("proxyRow");
0090     QTest::addColumn<int>("expectedSourceRow");
0091 
0092     QTest::newRow("0") << RoomModel::Section::Teams << 0 << 0;
0093     QTest::newRow("1") << RoomModel::Section::Teams << 1 << 1;
0094     QTest::newRow("2") << RoomModel::Section::PrivateMessages << 0 << 2;
0095     QTest::newRow("3") << RoomModel::Section::Discussions << 0 << 3;
0096     QTest::newRow("4") << RoomModel::Section::Discussions << 1 << 4;
0097 }
0098 
0099 void RoomListHeadingsProxyModelTest::shouldMapProxyRows()
0100 {
0101     // GIVEN
0102     QFETCH(RoomModel::Section, section);
0103     QFETCH(int, proxyRow);
0104     QFETCH(int, expectedSourceRow);
0105     RoomListHeadingsProxyModel proxy;
0106     proxy.setSourceModel(&mSourceModel);
0107     // WHEN
0108     const QModelIndex proxyIndex = proxy.index(proxyRow, 0, proxy.index(int(section), 0, {}));
0109     // THEN
0110     QCOMPARE(proxy.mapToSource(proxyIndex).row(), expectedSourceRow);
0111 }
0112 
0113 void RoomListHeadingsProxyModelTest::shouldMapSourceRows_data()
0114 {
0115     QTest::addColumn<int>("sourceRow");
0116     QTest::addColumn<RoomModel::Section>("expectedSection");
0117     QTest::addColumn<int>("expectedProxyRow");
0118 
0119     QTest::newRow("0") << 0 << RoomModel::Section::Teams << 0;
0120     QTest::newRow("1") << 1 << RoomModel::Section::Teams << 1;
0121     QTest::newRow("2") << 2 << RoomModel::Section::PrivateMessages << 0;
0122     QTest::newRow("3") << 3 << RoomModel::Section::Discussions << 0;
0123     QTest::newRow("4") << 4 << RoomModel::Section::Discussions << 1;
0124 }
0125 
0126 void RoomListHeadingsProxyModelTest::shouldMapSourceRows()
0127 {
0128     // GIVEN
0129     QFETCH(int, sourceRow);
0130     QFETCH(RoomModel::Section, expectedSection);
0131     QFETCH(int, expectedProxyRow);
0132     RoomListHeadingsProxyModel proxy;
0133     proxy.setSourceModel(&mSourceModel);
0134     // WHEN
0135     const QModelIndex sourceIndex = mSourceModel.index(sourceRow, 0);
0136     // THEN
0137     const QModelIndex proxyIndex = proxy.mapFromSource(sourceIndex);
0138     QCOMPARE(proxyIndex.row(), expectedProxyRow);
0139     QCOMPARE(proxyIndex.parent().row(), int(expectedSection));
0140 }
0141 
0142 static QStringList initialExpectedList()
0143 {
0144     return QStringList{QStringLiteral("Teams"),
0145                        QStringLiteral("Team 1"),
0146                        QStringLiteral("Team 2"),
0147                        QStringLiteral("Private Messages"),
0148                        QStringLiteral("PM 1"),
0149                        QStringLiteral("Discussions"),
0150                        QStringLiteral("Discuss 1"),
0151                        QStringLiteral("Discuss 2")};
0152 }
0153 
0154 static QStringList extractTexts(QAbstractItemModel *model)
0155 {
0156     const int count = model->rowCount();
0157     QStringList texts;
0158     texts.reserve(count);
0159     for (int sectionId = 0; sectionId < count; ++sectionId) {
0160         const auto section = model->index(sectionId, 0, {});
0161         const auto sectionSize = model->rowCount(section);
0162 
0163         if (sectionSize == 0)
0164             continue;
0165 
0166         texts.append(section.data().toString());
0167 
0168         for (int row = 0; row < sectionSize; ++row) {
0169             texts.append(model->index(row, 0, section).data().toString());
0170         }
0171     }
0172     return texts;
0173 }
0174 
0175 static bool compareWithExpected(const QStringList &texts, const QStringList &expected)
0176 {
0177     if (expected.count() != texts.count()) {
0178         qWarning() << "FAIL: expected" << expected.count() << "got" << texts.count() << '\n' << texts;
0179         return false;
0180     }
0181     for (int row = 0; row < expected.count(); ++row) {
0182         if (texts[row] != expected[row]) {
0183             qWarning() << "FAIL:" << row << texts[row] << expected[row];
0184             return false;
0185         }
0186     }
0187     return true;
0188 }
0189 
0190 void RoomListHeadingsProxyModelTest::shouldReturnData()
0191 {
0192     // GIVEN
0193     RoomListHeadingsProxyModel proxy;
0194     proxy.setSourceModel(&mSourceModel);
0195     // WHEN/THEN
0196     QVERIFY(compareWithExpected(extractTexts(&proxy), initialExpectedList()));
0197 }
0198 
0199 void RoomListHeadingsProxyModelTest::shouldUpdateOnSectionUpdates()
0200 {
0201     // GIVEN
0202     RoomListHeadingsProxyModel proxy;
0203     proxy.setSourceModel(&mSourceModel);
0204 
0205     // WHEN
0206     mSourceModel.item(0)->setData(QVariant::fromValue(RoomModel::Section::Favorites), RoomModel::RoomSection);
0207 
0208     // THEN
0209     const QStringList newExpected{QStringLiteral("Favorites"),
0210                                   QStringLiteral("Team 1"),
0211                                   QStringLiteral("Teams"),
0212                                   QStringLiteral("Team 2"),
0213                                   QStringLiteral("Private Messages"),
0214                                   QStringLiteral("PM 1"),
0215                                   QStringLiteral("Discussions"),
0216                                   QStringLiteral("Discuss 1"),
0217                                   QStringLiteral("Discuss 2")};
0218     QVERIFY(compareWithExpected(extractTexts(&proxy), newExpected));
0219 }
0220 
0221 #include "moc_roomlistheadingsproxymodeltest.cpp"