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 }