File indexing completed on 2024-04-28 04:48:14
0001 /**************************************************************************************** 0002 * Copyright (c) 2010 Nikolaj Hald Nielsen <nhn@kde.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Pulic License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "TestPlaylistModels.h" 0018 0019 #include "amarokconfig.h" 0020 #include "core/support/Components.h" 0021 #include "EngineController.h" 0022 0023 #include "playlist/PlaylistActions.h" 0024 #include "playlist/PlaylistController.h" 0025 #include "playlist/PlaylistModelStack.h" 0026 #include "playlist/PlaylistModel.h" 0027 #include "playlist/UndoCommands.h" 0028 0029 #include "mocks/MetaMock.h" 0030 #include "mocks/MockTrack.h" 0031 0032 #include <QtDebug> 0033 #include <QTest> 0034 0035 0036 using namespace Playlist; 0037 0038 QTEST_GUILESS_MAIN( TestPlaylistModels ) 0039 0040 0041 TestPlaylistModels::TestPlaylistModels() 0042 : QObject() 0043 { 0044 } 0045 0046 void TestPlaylistModels::initTestCase() 0047 { 0048 AmarokConfig::instance("amarokrc"); 0049 0050 //apparently the engine controller is needed somewhere, or we will get a crash... 0051 EngineController *controller = new EngineController(); 0052 Amarok::Components::setEngineController( controller ); 0053 0054 // Initialize playlistAction before we set the playlist, lest our playlist be overwritten with Art Of Nations 0055 The::playlistActions(); 0056 The::playlistController()->removeRow( 0 ); 0057 0058 //we want to add a few tracks to the playlist so we can test sorting, filtering and so on. So first create a bunch of dummy tracks we can use. 0059 0060 Meta::TrackList tracks; 0061 0062 QVariantMap map1; 0063 map1.insert( Meta::Field::TITLE, QString( "Cool as honey" ) ); 0064 MetaMock * metaMock = new MetaMock( map1 ); 0065 metaMock->m_artist = new MockArtist( "Bonzai Bees" ); 0066 metaMock->m_album = new MockAlbum( "The Hive", metaMock->m_artist ); 0067 tracks << Meta::TrackPtr( metaMock ); 0068 0069 QVariantMap map2; 0070 map2.insert( Meta::Field::TITLE, QString( "xTreme buzzing sound" ) ); 0071 metaMock = new MetaMock( map2 ); 0072 metaMock->m_artist = new MockArtist( "Bonzai Bees" ); 0073 metaMock->m_album = new MockAlbum( "The Hive", metaMock->m_artist ); 0074 tracks << Meta::TrackPtr( metaMock ); 0075 0076 QVariantMap map3; 0077 map3.insert( Meta::Field::TITLE, QString( "Alphabet soup" ) ); 0078 metaMock = new MetaMock( map3 ); 0079 metaMock->m_artist = new MockArtist( "Grumpy Grizzlies" ); 0080 metaMock->m_album = new MockAlbum( "The Hive", metaMock->m_artist ); 0081 tracks << Meta::TrackPtr( metaMock ); 0082 0083 QVariantMap map4; 0084 map4.insert( Meta::Field::TITLE, QString( "Zlick" ) ); 0085 metaMock = new MetaMock( map4 ); 0086 metaMock->m_artist = new MockArtist( "Grumpy Grizzlies" ); 0087 metaMock->m_album = new MockAlbum( "Nice Long Nap", metaMock->m_artist ); 0088 tracks << Meta::TrackPtr( metaMock ); 0089 0090 QVariantMap map5; 0091 map5.insert( Meta::Field::TITLE, QString( "23 hours is not enough" ) ); 0092 metaMock = new MetaMock( map5 ); 0093 metaMock->m_artist = new MockArtist( "Grumpy Grizzlies" ); 0094 metaMock->m_album = new MockAlbum( "Nice Long Nap", metaMock->m_artist ); 0095 tracks << Meta::TrackPtr( metaMock ); 0096 0097 QVariantMap map6; 0098 map6.insert( Meta::Field::TITLE, QString( "1 song to rule them all" ) ); 0099 metaMock = new MetaMock( map6 ); 0100 metaMock->m_artist = new MockArtist( "Bonzai Bees" ); 0101 metaMock->m_album = new MockAlbum( "Pretty Flowers", metaMock->m_artist ); 0102 tracks << Meta::TrackPtr( metaMock ); 0103 0104 QVariantMap map7; 0105 map7.insert( Meta::Field::TITLE, QString( "zz ambience sound" ) ); 0106 metaMock = new MetaMock( map7 ); 0107 // note: no artist, no album! 0108 tracks << Meta::TrackPtr( metaMock ); 0109 0110 The::playlistController()->insertTracks( 0, tracks ); 0111 0112 QCOMPARE( The::playlist()->trackAt( 3 )->prettyName(), QString( "Zlick" ) ); 0113 } 0114 0115 void TestPlaylistModels::cleanup() 0116 { 0117 SortScheme scheme = SortScheme(); 0118 ModelStack::instance()->sortProxy()->updateSortMap( scheme ); 0119 ModelStack::instance()->filterProxy()->clearSearchTerm(); 0120 } 0121 0122 void TestPlaylistModels::testSorting() 0123 { 0124 //simple sort by title 0125 //******************************// 0126 0127 SortScheme scheme = SortScheme(); 0128 scheme.addLevel( SortLevel( Playlist::Title, Qt::AscendingOrder ) ); 0129 ModelStack::instance()->sortProxy()->updateSortMap( scheme ); 0130 0131 AbstractModel * topModel = The::playlist(); 0132 0133 QCOMPARE( topModel->trackAt( 0 )->prettyName(), QString( "1 song to rule them all" ) ); 0134 QCOMPARE( topModel->trackAt( 1 )->prettyName(), QString( "23 hours is not enough" ) ); 0135 QCOMPARE( topModel->trackAt( 2 )->prettyName(), QString( "Alphabet soup" ) ); 0136 QCOMPARE( topModel->trackAt( 3 )->prettyName(), QString( "Cool as honey" ) ); 0137 QCOMPARE( topModel->trackAt( 4 )->prettyName(), QString( "xTreme buzzing sound" ) ); 0138 QCOMPARE( topModel->trackAt( 5 )->prettyName(), QString( "Zlick" ) ); 0139 0140 0141 //Sort by Artist - Album - Title 0142 //******************************// 0143 0144 SortScheme scheme2 = SortScheme(); 0145 0146 scheme2.addLevel( SortLevel( Playlist::Artist, Qt::AscendingOrder ) ); 0147 scheme2.addLevel( SortLevel( Playlist::Album, Qt::AscendingOrder ) ); 0148 scheme2.addLevel( SortLevel( Playlist::Title, Qt::AscendingOrder ) ); 0149 0150 QCOMPARE( scheme2.length(), 3 ); 0151 0152 ModelStack::instance()->sortProxy()->updateSortMap( scheme2 ); 0153 topModel->qaim()->revert(); 0154 0155 // the one without artist or album comes first 0156 QCOMPARE( topModel->trackAt( 0 )->prettyName(), QString( "zz ambience sound" ) ); 0157 QCOMPARE( topModel->trackAt( 1 )->prettyName(), QString( "1 song to rule them all" ) ); 0158 QCOMPARE( topModel->trackAt( 2 )->prettyName(), QString( "Cool as honey" ) ); 0159 QCOMPARE( topModel->trackAt( 3 )->prettyName(), QString( "xTreme buzzing sound" ) ); 0160 QCOMPARE( topModel->trackAt( 4 )->prettyName(), QString( "23 hours is not enough" ) ); 0161 QCOMPARE( topModel->trackAt( 5 )->prettyName(), QString( "Zlick" ) ); 0162 QCOMPARE( topModel->trackAt( 6 )->prettyName(), QString( "Alphabet soup" ) ); 0163 0164 //reverse some stuff 0165 //******************************// 0166 0167 SortScheme scheme3 = SortScheme(); 0168 0169 scheme3.addLevel( SortLevel( Playlist::Artist, Qt::AscendingOrder ) ); 0170 scheme3.addLevel( SortLevel( Playlist::Album, Qt::DescendingOrder ) ); 0171 scheme3.addLevel( SortLevel( Playlist::Title, Qt::AscendingOrder ) ); 0172 0173 ModelStack::instance()->sortProxy()->updateSortMap( scheme3 ); 0174 topModel->qaim()->revert(); 0175 0176 QCOMPARE( topModel->trackAt( 0 )->prettyName(), QString( "zz ambience sound" ) ); 0177 QCOMPARE( topModel->trackAt( 1 )->prettyName(), QString( "Cool as honey" ) ); 0178 QCOMPARE( topModel->trackAt( 2 )->prettyName(), QString( "xTreme buzzing sound" ) ); 0179 QCOMPARE( topModel->trackAt( 3 )->prettyName(), QString( "1 song to rule them all" ) ); 0180 QCOMPARE( topModel->trackAt( 4 )->prettyName(), QString( "Alphabet soup" ) ); 0181 QCOMPARE( topModel->trackAt( 5 )->prettyName(), QString( "23 hours is not enough" ) ); 0182 QCOMPARE( topModel->trackAt( 6 )->prettyName(), QString( "Zlick" ) ); 0183 0184 //Sort by album when tracks have same album name and different artists 0185 //******************************// 0186 0187 SortScheme scheme4 = SortScheme(); 0188 0189 scheme4.addLevel( SortLevel( Playlist::Album, Qt::AscendingOrder ) ); 0190 scheme4.addLevel( SortLevel( Playlist::Title, Qt::AscendingOrder ) ); 0191 0192 ModelStack::instance()->sortProxy()->updateSortMap( scheme4 ); 0193 topModel->qaim()->revert(); 0194 0195 QCOMPARE( topModel->trackAt( 0 )->prettyName(), QString( "zz ambience sound" ) ); 0196 QCOMPARE( topModel->trackAt( 1 )->prettyName(), QString( "23 hours is not enough" ) ); 0197 QCOMPARE( topModel->trackAt( 2 )->prettyName(), QString( "Zlick" ) ); 0198 QCOMPARE( topModel->trackAt( 3 )->prettyName(), QString( "1 song to rule them all" ) ); 0199 QCOMPARE( topModel->trackAt( 4 )->prettyName(), QString( "Cool as honey" ) ); 0200 QCOMPARE( topModel->trackAt( 5 )->prettyName(), QString( "xTreme buzzing sound" ) ); 0201 QCOMPARE( topModel->trackAt( 6 )->prettyName(), QString( "Alphabet soup" ) ); 0202 } 0203 0204 void TestPlaylistModels::testFiltering() 0205 { 0206 ModelStack::instance()->filterProxy()->showOnlyMatches( true ); 0207 ModelStack::instance()->filterProxy()->find( "ou" ); 0208 ModelStack::instance()->filterProxy()->filterUpdated(); 0209 0210 AbstractModel * topModel = The::playlist(); 0211 0212 QCOMPARE( topModel->qaim()->rowCount(), 4 ); 0213 QCOMPARE( topModel->trackAt( 0 )->prettyName(), QString( "xTreme buzzing sound" ) ); 0214 QCOMPARE( topModel->trackAt( 1 )->prettyName(), QString( "Alphabet soup" ) ); 0215 QCOMPARE( topModel->trackAt( 2 )->prettyName(), QString( "23 hours is not enough" ) ); 0216 QCOMPARE( topModel->trackAt( 3 )->prettyName(), QString( "zz ambience sound" ) ); 0217 //TODO: More advanced filtering tests go here 0218 0219 } 0220 0221 void TestPlaylistModels::testSearching() 0222 { 0223 } 0224 0225 void TestPlaylistModels::testShuffling() 0226 { 0227 Meta::TrackList oldTrackList = The::playlist()->tracks(); 0228 0229 The::playlistActions()->shuffle(); 0230 0231 QVERIFY( oldTrackList != The::playlist()->tracks() ); 0232 0233 The::playlistController()->undo(); 0234 0235 QCOMPARE( oldTrackList, The::playlist()->tracks() ); 0236 }