File indexing completed on 2022-10-04 15:34:13

0001 /*
0002     SPDX-FileCopyrightText: 2011 Michal Malek <michalm@jabster.pl>
0003     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "k3bmetaitemmodeltest.h"
0009 #include "k3bmetaitemmodel.h"
0010 
0011 #include <QStringList>
0012 #include <QIcon>
0013 #include <QStandardItemModel>
0014 #include <QSignalSpy>
0015 #include <QTest>
0016 
0017 QTEST_GUILESS_MAIN( MetaItemModelTest )
0018 
0019 Q_DECLARE_METATYPE( QModelIndex )
0020 
0021 namespace
0022 {
0023     
0024     void checkForIdenticalData(
0025         QAbstractItemModel const& model1, QAbstractItemModel const& model2,
0026         QModelIndex root1 = QModelIndex(), QModelIndex root2 = QModelIndex() )
0027     {
0028         QCOMPARE( model1.rowCount( root1 ), model2.rowCount( root2 ) );
0029         
0030         for( int row = 0; row < model1.rowCount( root1 ); ++row )
0031         {
0032             QCOMPARE( model1.columnCount( root1 ), model2.columnCount( root2 ) );
0033             
0034             for( int col = 0; col < model1.columnCount( root1 ); ++col )
0035             {
0036                 const QModelIndex index1 = model1.index( row, col, root1 );
0037                 const QModelIndex index2 = model2.index( row, col, root2 );
0038                 QCOMPARE( model1.data( index1 ).toString(), model2.data( index2 ).toString() );
0039             }
0040             
0041             const QModelIndex newRoot1 = model1.index( row, 0, root1 );
0042             const QModelIndex newRoot2 = model2.index( row, 0, root2 );
0043             checkForIdenticalData( model1, model2, newRoot1, newRoot2 );
0044         }
0045     }
0046     
0047 } // namespace
0048 
0049 
0050 MetaItemModelTest::MetaItemModelTest()
0051 {
0052     qRegisterMetaType<QModelIndex>();
0053 }
0054 
0055 
0056 void MetaItemModelTest::init()
0057 {
0058     m_listModel = new QStandardItemModel( this );
0059     m_listModel->appendRow( new QStandardItem( "a" ) );
0060     m_listModel->appendRow( new QStandardItem( "b" ) );
0061     m_listModel->appendRow( new QStandardItem( "c" ) );
0062     m_listModel->appendRow( new QStandardItem( "d" ) );
0063     
0064     m_treeModel = new QStandardItemModel( this );
0065     m_treeModel->appendRow( new QStandardItem( QIcon::fromTheme( "edit-copy" ), "copy" ) );
0066     m_treeModel->appendRow( new QStandardItem( QIcon::fromTheme( "edit-paste" ), "paste" ) );
0067     m_treeModel->item( 0 )->appendRow( new QStandardItem( QIcon::fromTheme( "edit-cut" ), "cut" ) );
0068 }
0069 
0070 
0071 void MetaItemModelTest::testCreate()
0072 {
0073     K3b::MetaItemModel model;
0074 }
0075 
0076 
0077 void MetaItemModelTest::testAddSubModel()
0078 {
0079     K3b::MetaItemModel model;
0080     model.addSubModel( "stringList", QIcon::fromTheme( "configure" ), m_listModel );
0081     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel );
0082     
0083     QCOMPARE( model.rowCount(), 2 );
0084     
0085     checkForIdenticalData( model, *m_listModel, model.index( 0, 0 ) );
0086     checkForIdenticalData( model, *m_treeModel, model.index( 1, 0 ) );
0087     
0088     QModelIndex firstIndex = model.index( 0, 0 );
0089     QVERIFY( firstIndex.isValid() );
0090     QCOMPARE( model.rowCount( firstIndex ), 4 );
0091     
0092     QModelIndex secondIndex = model.index( 1, 0 );
0093     QVERIFY( secondIndex.isValid() );
0094     QCOMPARE( model.rowCount( secondIndex ), 2 );
0095 }
0096 
0097 
0098 void MetaItemModelTest::testAddFlatSubModel()
0099 {
0100     K3b::MetaItemModel model;
0101     model.addSubModel( "stringList", QIcon::fromTheme( "configure" ), m_listModel, true );
0102     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel, true );
0103     
0104     QCOMPARE( model.rowCount(), 6 );
0105     
0106     QModelIndex fifthIndex = model.index( 4, 0 );
0107     QVERIFY( fifthIndex.isValid() );
0108     QCOMPARE( model.rowCount( fifthIndex ), 1 );
0109 }
0110 
0111 
0112 void MetaItemModelTest::testRemoveSubModel()
0113 {
0114     K3b::MetaItemModel model;
0115     model.addSubModel( "stringList", QIcon::fromTheme( "configure" ), m_listModel );
0116     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel, true );
0117     
0118     checkForIdenticalData( model, *m_listModel, model.index( 0, 0 ) );
0119     
0120     QCOMPARE( model.rowCount(), 3 );
0121     
0122     model.removeSubModel( m_listModel );
0123     QCOMPARE( model.rowCount(), 2 );
0124     
0125     model.removeSubModel( m_treeModel );
0126     QCOMPARE( model.rowCount(), 0 );
0127 }
0128 
0129 
0130 void MetaItemModelTest::testDynamicChanges()
0131 {
0132     K3b::MetaItemModel model;
0133     model.addSubModel( "stringList", QIcon::fromTheme( "configure" ), m_listModel );
0134     
0135     QSignalSpy rowsAboutToBeRemovedSpy( &model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)) );
0136     QSignalSpy rowsRemovedSpy( &model, SIGNAL(rowsRemoved(QModelIndex,int,int)) );
0137     QList<QVariant> arguments;
0138     
0139     QModelIndex firstIndex = model.index( 0, 0 );
0140     
0141     QCOMPARE( model.rowCount(), 1 );
0142     QCOMPARE( model.rowCount( firstIndex ), 4 ); 
0143     checkForIdenticalData( model, *m_listModel, firstIndex );
0144     
0145     m_listModel->removeRow( 2 );
0146     QCOMPARE( rowsAboutToBeRemovedSpy.count(), 1 );
0147     arguments = rowsAboutToBeRemovedSpy.takeFirst();
0148     QCOMPARE( arguments.count(), 3 );
0149     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), firstIndex );
0150     QCOMPARE( arguments.at( 1 ).value<int>(), 2 );
0151     QCOMPARE( arguments.at( 2 ).value<int>(), 2 );
0152     QCOMPARE( rowsRemovedSpy.count(), 1 );
0153     arguments = rowsRemovedSpy.takeFirst();
0154     QCOMPARE( arguments.count(), 3 );
0155     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), firstIndex );
0156     QCOMPARE( arguments.at( 1 ).value<int>(), 2 );
0157     QCOMPARE( arguments.at( 2 ).value<int>(), 2 );
0158     QCOMPARE( model.rowCount( firstIndex ), 3 );
0159     checkForIdenticalData( model, *m_listModel, firstIndex );
0160     
0161     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel );
0162     QModelIndex secondIndex = model.index( 1, 0 );
0163     
0164     QCOMPARE( model.rowCount(), 2 );
0165     QCOMPARE( model.rowCount( secondIndex ), 2 );
0166     checkForIdenticalData( model, *m_listModel, firstIndex );
0167     
0168     m_treeModel->removeRow( 1 );
0169     QCOMPARE( rowsAboutToBeRemovedSpy.count(), 1 );
0170     arguments = rowsAboutToBeRemovedSpy.takeFirst();
0171     QCOMPARE( arguments.count(), 3 );
0172     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), secondIndex );
0173     QCOMPARE( arguments.at( 1 ).value<int>(), 1 );
0174     QCOMPARE( arguments.at( 2 ).value<int>(), 1 );
0175     QCOMPARE( rowsRemovedSpy.count(), 1 );
0176     arguments = rowsRemovedSpy.takeFirst();
0177     QCOMPARE( arguments.count(), 3 );
0178     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), secondIndex );
0179     QCOMPARE( arguments.at( 1 ).value<int>(), 1 );
0180     QCOMPARE( arguments.at( 2 ).value<int>(), 1 );
0181     QCOMPARE( model.rowCount( secondIndex ), 1 );
0182     
0183     model.removeSubModel( m_listModel );
0184     QCOMPARE( model.rowCount(), 1 );
0185 }
0186 
0187 
0188 void MetaItemModelTest::testDynamicChangesInFlatModel()
0189 {
0190     K3b::MetaItemModel model;
0191     model.addSubModel( "stringList", QIcon::fromTheme( "configure" ), m_listModel, true );
0192     QCOMPARE( model.rowCount(), 4 );
0193     checkForIdenticalData( model, *m_listModel );
0194     
0195     QSignalSpy rowsAboutToBeRemovedSpy( &model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)) );
0196     QSignalSpy rowsRemovedSpy( &model, SIGNAL(rowsRemoved(QModelIndex,int,int)) );
0197     QList<QVariant> arguments;
0198     
0199     m_listModel->removeRow( 2 );
0200     QCOMPARE( rowsAboutToBeRemovedSpy.count(), 1 );
0201     arguments = rowsAboutToBeRemovedSpy.takeFirst();
0202     QCOMPARE( arguments.count(), 3 );
0203     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), QModelIndex() );
0204     QCOMPARE( arguments.at( 1 ).value<int>(), 2 );
0205     QCOMPARE( arguments.at( 2 ).value<int>(), 2 );
0206     QCOMPARE( rowsRemovedSpy.count(), 1 );
0207     arguments = rowsRemovedSpy.takeFirst();
0208     QCOMPARE( arguments.count(), 3 );
0209     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), QModelIndex() );
0210     QCOMPARE( arguments.at( 1 ).value<int>(), 2 );
0211     QCOMPARE( arguments.at( 2 ).value<int>(), 2 );
0212     QCOMPARE( model.rowCount(), 3 );
0213     checkForIdenticalData( model, *m_listModel );
0214     
0215     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel, true );
0216     QCOMPARE( model.rowCount(), 5 );
0217     
0218     m_treeModel->removeRow( 1 );
0219     QCOMPARE( rowsAboutToBeRemovedSpy.count(), 1 );
0220     arguments = rowsAboutToBeRemovedSpy.takeFirst();
0221     QCOMPARE( arguments.count(), 3 );
0222     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), QModelIndex() );
0223     QCOMPARE( arguments.at( 1 ).value<int>(), 4 );
0224     QCOMPARE( arguments.at( 2 ).value<int>(), 4 );
0225     QCOMPARE( rowsRemovedSpy.count(), 1 );
0226     arguments = rowsRemovedSpy.takeFirst();
0227     QCOMPARE( arguments.count(), 3 );
0228     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), QModelIndex() );
0229     QCOMPARE( arguments.at( 1 ).value<int>(), 4 );
0230     QCOMPARE( arguments.at( 2 ).value<int>(), 4 );
0231     QCOMPARE( model.rowCount(), 4 );
0232     
0233     model.removeSubModel( m_listModel );
0234     QCOMPARE( model.rowCount(), 1 );
0235 }
0236 
0237 
0238 void MetaItemModelTest::testDataChanges()
0239 {
0240     K3b::MetaItemModel model;
0241     model.addSubModel( "standard", QIcon::fromTheme( "go-previous" ), m_treeModel, true );
0242     checkForIdenticalData( model, *m_treeModel );
0243     
0244     QSignalSpy dataChangedSpy( &model, SIGNAL(dataChanged(QModelIndex,QModelIndex)) );
0245     m_treeModel->setData( m_treeModel->index( 1, 0 ), "somethingElse" );
0246     checkForIdenticalData( model, *m_treeModel );
0247     
0248     // Check if dataChanged() signal has been emitted
0249     QCOMPARE( dataChangedSpy.count(), 1 );
0250     QList<QVariant> arguments = dataChangedSpy.takeFirst();
0251     QCOMPARE( arguments.count(), 2 );
0252     
0253     QCOMPARE( arguments.at( 0 ).value<QModelIndex>(), model.index( 1, 0 ) );
0254     QCOMPARE( arguments.at( 1 ).value<QModelIndex>(), model.index( 1, 0 ) );
0255 }
0256 
0257 
0258