File indexing completed on 2024-12-01 03:41:34

0001 /*
0002     SPDX-FileCopyrightText: 2013 Aurélien Gateau <agateau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "klinkitemselectionmodeltest.h"
0008 
0009 #include <klinkitemselectionmodel.h>
0010 
0011 #include <QIdentityProxyModel>
0012 #include <QItemSelectionModel>
0013 #include <QSortFilterProxyModel>
0014 #include <QStandardItem>
0015 #include <QStandardItemModel>
0016 
0017 #include <QTest>
0018 
0019 void KLinkItemSelectionModelTest::init()
0020 {
0021     // Init m_mainModel
0022     m_mainModel = new QStandardItemModel;
0023     for (int x = 0; x < 10; ++x) {
0024         m_mainModel->appendRow(new QStandardItem(QString::number(x)));
0025     }
0026     m_mainSelectionModel = new QItemSelectionModel(m_mainModel);
0027 
0028     // Init subModel
0029     m_subModel = new QSortFilterProxyModel;
0030     m_subModel->setFilterRegularExpression(QRegularExpression(QStringLiteral("^[5-9]")));
0031     m_subModel->setSourceModel(m_mainModel);
0032     m_subSelectionModel = new KLinkItemSelectionModel(m_subModel, m_mainSelectionModel);
0033 }
0034 
0035 void KLinkItemSelectionModelTest::cleanup()
0036 {
0037     delete m_mainSelectionModel;
0038     m_mainSelectionModel = nullptr;
0039     delete m_mainModel;
0040     m_mainModel = nullptr;
0041     delete m_subSelectionModel;
0042     m_subSelectionModel = nullptr;
0043     delete m_subModel;
0044     m_subModel = nullptr;
0045 }
0046 
0047 void KLinkItemSelectionModelTest::testToggle()
0048 {
0049     // Select last index in subModel
0050     QModelIndex subIndex = m_subModel->index(m_subModel->rowCount() - 1, 0);
0051     m_subSelectionModel->select(subIndex, QItemSelectionModel::Toggle);
0052 
0053     // Check selections
0054     QModelIndexList subList = m_subSelectionModel->selectedIndexes();
0055     QCOMPARE(subList.count(), 1);
0056     QCOMPARE(subList.first(), subIndex);
0057 
0058     QModelIndexList mainList = m_mainSelectionModel->selectedIndexes();
0059     QModelIndex mainIndex = m_mainModel->index(m_mainModel->rowCount() - 1, 0);
0060     QCOMPARE(mainList.count(), 1);
0061     QCOMPARE(mainList.first(), mainIndex);
0062 }
0063 
0064 void KLinkItemSelectionModelTest::testMainSetCurrent()
0065 {
0066     // Set last index of mainModel as current
0067     QModelIndex mainIndex = m_mainModel->index(m_mainModel->rowCount() - 1, 0);
0068     m_mainSelectionModel->setCurrentIndex(mainIndex, QItemSelectionModel::Current);
0069 
0070     // Last index of subModel should be current as well
0071     QModelIndex subIndex = m_subSelectionModel->currentIndex();
0072     QVERIFY(subIndex.isValid());
0073     QCOMPARE(subIndex, m_subModel->index(m_subModel->rowCount() - 1, 0));
0074 
0075     // Set first index of mainModel as current. First index of mainModel does
0076     // not exist in subModel, so its current index should remain the same.
0077     subIndex = m_subSelectionModel->currentIndex();
0078     QVERIFY(subIndex.isValid());
0079     mainIndex = m_mainModel->index(0, 0);
0080     m_mainSelectionModel->setCurrentIndex(mainIndex, QItemSelectionModel::Current);
0081     QCOMPARE(subIndex, m_subSelectionModel->currentIndex());
0082 }
0083 
0084 void KLinkItemSelectionModelTest::testSubSetCurrent()
0085 {
0086     // Set last index of subModel as current
0087     QModelIndex subIndex = m_subModel->index(m_subModel->rowCount() - 1, 0);
0088     m_subSelectionModel->setCurrentIndex(subIndex, QItemSelectionModel::Current);
0089 
0090     // Last index of mainModel should be current as well
0091     QModelIndex mainIndex = m_mainSelectionModel->currentIndex();
0092     QVERIFY(mainIndex.isValid());
0093     QCOMPARE(mainIndex, m_mainModel->index(m_mainModel->rowCount() - 1, 0));
0094 }
0095 
0096 void KLinkItemSelectionModelTest::testChangeModel()
0097 {
0098     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0099 
0100     {
0101         auto idx = m_mainModel->index(6, 0);
0102         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0103     }
0104 
0105     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0106     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0107     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0108     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0109 
0110     QIdentityProxyModel newIntermediateProxy;
0111 
0112     newIntermediateProxy.setSourceModel(m_mainModel);
0113 
0114     // Change the model of the KLinkItemSelectionModel
0115     m_subSelectionModel->setModel(&newIntermediateProxy);
0116 
0117     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0118     QVERIFY(m_subSelectionModel->selection().isEmpty());
0119 }
0120 
0121 void KLinkItemSelectionModelTest::testChangeModelOfExternal()
0122 {
0123     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0124 
0125     {
0126         auto idx = m_mainModel->index(6, 0);
0127         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0128     }
0129 
0130     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0131     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0132     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0133     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0134 
0135     QIdentityProxyModel newIntermediateProxy;
0136 
0137     newIntermediateProxy.setSourceModel(m_mainModel);
0138 
0139     // Change the model of the external QISM
0140     m_mainSelectionModel->setModel(&newIntermediateProxy);
0141 
0142     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0143     QVERIFY(m_subSelectionModel->selection().isEmpty());
0144 }
0145 
0146 void KLinkItemSelectionModelTest::testChangeLinkedSelectionModel()
0147 {
0148     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0149 
0150     {
0151         auto idx = m_mainModel->index(6, 0);
0152         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0153     }
0154 
0155     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0156     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0157     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0158     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0159 
0160     QItemSelectionModel replacementSelectionModel(m_mainModel, nullptr);
0161     {
0162         auto idx = m_mainModel->index(7, 0);
0163         replacementSelectionModel.select(idx, QItemSelectionModel::Select);
0164     }
0165 
0166     m_subSelectionModel->setLinkedItemSelectionModel(&replacementSelectionModel);
0167 
0168     QVERIFY(!replacementSelectionModel.selection().isEmpty());
0169     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0170     QCOMPARE(replacementSelectionModel.selection().indexes().first().row(), 7);
0171     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 2);
0172 }
0173 
0174 void KLinkItemSelectionModelTest::testAdditionalLink()
0175 {
0176     {
0177         auto idx = m_mainModel->index(6, 0);
0178         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0179     }
0180 
0181     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0182     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0183     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0184     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0185 
0186     {
0187         QSortFilterProxyModel additionalProxy;
0188         additionalProxy.setFilterRegularExpression(QRegularExpression(QStringLiteral("^[3-9]")));
0189         additionalProxy.setSourceModel(m_mainModel);
0190 
0191         KLinkItemSelectionModel additionalLink;
0192         additionalLink.setModel(&additionalProxy);
0193         additionalLink.setLinkedItemSelectionModel(m_mainSelectionModel);
0194         QVERIFY(!additionalLink.selection().isEmpty());
0195         QCOMPARE(additionalLink.selection().indexes().first().row(), 3);
0196 
0197         auto idx = additionalProxy.index(4, 0);
0198         QVERIFY(idx.isValid());
0199         additionalLink.select(idx, QItemSelectionModel::ClearAndSelect);
0200 
0201         QVERIFY(!additionalLink.selection().isEmpty());
0202         QCOMPARE(additionalLink.selection().indexes().first().row(), 4);
0203 
0204         QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0205         QVERIFY(!m_subSelectionModel->selection().isEmpty());
0206         QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 7);
0207         QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 2);
0208     }
0209 
0210     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0211     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0212     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 7);
0213     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 2);
0214 }
0215 
0216 void KLinkItemSelectionModelTest::testClearSelection()
0217 {
0218     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0219 
0220     {
0221         auto idx = m_mainModel->index(6, 0);
0222         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0223     }
0224 
0225     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0226     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0227     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0228     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0229 
0230     m_subSelectionModel->clear();
0231 
0232     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0233     QVERIFY(m_subSelectionModel->selection().isEmpty());
0234 
0235     {
0236         auto idx = m_mainModel->index(6, 0);
0237         m_mainSelectionModel->select(idx, QItemSelectionModel::Select);
0238     }
0239 
0240     QVERIFY(!m_mainSelectionModel->selection().isEmpty());
0241     QVERIFY(!m_subSelectionModel->selection().isEmpty());
0242     QCOMPARE(m_mainSelectionModel->selection().indexes().first().row(), 6);
0243     QCOMPARE(m_subSelectionModel->selection().indexes().first().row(), 1);
0244 
0245     m_mainSelectionModel->clear();
0246 
0247     QVERIFY(m_mainSelectionModel->selection().isEmpty());
0248     QVERIFY(m_subSelectionModel->selection().isEmpty());
0249 }
0250 
0251 QTEST_MAIN(KLinkItemSelectionModelTest)
0252 
0253 #include "moc_klinkitemselectionmodeltest.cpp"