File indexing completed on 2024-04-14 04:43:08

0001 /***************************************************************************
0002  *   Copyright (c) 2010 Casey Link <unnamedrambler@gmail.com>              *
0003  *   Copyright (c) 2010 Maximilian Kossick <maximilian.kossick@googlemail.com>*
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
0019  ***************************************************************************/
0020 
0021 #include "TestTrackOrganizer.h"
0022 
0023 #include "dialogs/TrackOrganizer.h"
0024 #include "core/support/Debug.h"
0025 
0026 #include "CollectionTestImpl.h"
0027 
0028 #include "mocks/MockTrack.h"
0029 #include "mocks/MockAlbum.h"
0030 #include "mocks/MockArtist.h"
0031 
0032 #include <QMap>
0033 #include <QTest>
0034 
0035 #include <gmock/gmock.h>
0036 
0037 using ::testing::Return;
0038 using ::testing::AnyNumber;
0039 
0040 QTEST_GUILESS_MAIN( TestTrackOrganizer )
0041 
0042 namespace Collections {
0043 
0044 class MyCollectionTestImpl : public CollectionTestImpl
0045 {
0046 public:
0047     MyCollectionTestImpl( const QString &id ) : CollectionTestImpl( id ) {}
0048 
0049 };
0050 
0051 } //namespace Collections
0052 
0053 TestTrackOrganizer::TestTrackOrganizer()
0054 {
0055 
0056 }
0057 
0058 void TestTrackOrganizer::init()
0059 {
0060   mColl = new Collections::MyCollectionTestImpl("A");
0061 }
0062 
0063 void TestTrackOrganizer::cleanup()
0064 {
0065   delete mColl;
0066   delete mTrackOrganizer;
0067 }
0068 
0069 void TestTrackOrganizer::testBasic()
0070 {
0071 
0072   mTracks = makeTracks( 10 );
0073   mTrackOrganizer = new TrackOrganizer( mTracks, this );
0074   QString folder = "/home/user/Music" ;
0075   mTrackOrganizer->setFormatString( "%collectionroot%/%artist%/%album%/%track%-%title%.%filetype%" );
0076   mTrackOrganizer->setFolderPrefix( folder );
0077   QMap <Meta::TrackPtr, QString > dests = mTrackOrganizer->getDestinations();
0078   QVERIFY( dests.size() == 10 );
0079 
0080   foreach( Meta::TrackPtr track, mTracks )
0081   {
0082     QVERIFY( dests.contains( track ) );
0083     QString format = "%1/%2/%3/%4-%5.%6";
0084     QString trackNum = QString("%1").arg( track->trackNumber(), 2, 10, QChar('0') );
0085     QString result = format.arg( folder, track->artist()->prettyName(), track->album()->prettyName(), trackNum, track->prettyName(), "mp3");
0086     QCOMPARE( dests.value( track ), result );
0087   }
0088 }
0089 
0090 Meta::TrackPtr TestTrackOrganizer::makeMockTrack( const QString &trackName, const QString &artistName, const QString &albumName, int trackNumber )
0091 {
0092     Meta::MockTrack *track = new Meta::MockTrack();
0093     ::testing::Mock::AllowLeak( track );
0094     Meta::TrackPtr trackPtr( track );
0095     EXPECT_CALL( *track, name() ).Times( AnyNumber() ).WillRepeatedly( Return( trackName ) );
0096     EXPECT_CALL( *track, prettyName() ).Times( AnyNumber() ).WillRepeatedly( Return( trackName ) );
0097     EXPECT_CALL( *track, uidUrl() ).Times( AnyNumber() ).WillRepeatedly( Return( trackName + '_' + artistName + '_' + albumName ) );
0098     EXPECT_CALL( *track, playableUrl() ).Times( AnyNumber() ).WillRepeatedly( Return( QUrl( '/' + track->uidUrl() ) ) );
0099     EXPECT_CALL( *track, trackNumber() ).Times( AnyNumber() ).WillRepeatedly( Return( trackNumber ) );
0100     EXPECT_CALL( *track, type() ).Times( AnyNumber() ).WillRepeatedly( Return( "mp3" ) );
0101     EXPECT_CALL( *track, composer() ).Times( AnyNumber() ).WillRepeatedly( Return( Meta::ComposerPtr() ) );
0102     EXPECT_CALL( *track, year() ).Times( AnyNumber() ).WillRepeatedly( Return( Meta::YearPtr() ) );
0103     EXPECT_CALL( *track, genre() ).Times( AnyNumber() ).WillRepeatedly( Return( Meta::GenrePtr() ) );
0104     EXPECT_CALL( *track, discNumber() ).Times( AnyNumber() ).WillRepeatedly( Return( 0 ) );
0105     EXPECT_CALL( *track, rating() ).Times( AnyNumber() ).WillRepeatedly( Return( 0 ) );
0106     EXPECT_CALL( *track, filesize() ).Times( AnyNumber() ).WillRepeatedly( Return( 0 ) );
0107     EXPECT_CALL( *track, length() ).Times( AnyNumber() ).WillRepeatedly( Return( 0 ) );
0108     EXPECT_CALL( *track, comment() ).Times( AnyNumber() ).WillRepeatedly( Return( "" ) );
0109 
0110     mColl->mc->addTrack( trackPtr );
0111 
0112     Meta::AlbumPtr albumPtr = mColl->mc->albumMap().value( albumName, QString() /* no album artist */ );
0113     Meta::MockAlbum *album;
0114     Meta::TrackList albumTracks;
0115     if( albumPtr )
0116     {
0117         album = dynamic_cast<Meta::MockAlbum*>( albumPtr.data() );
0118         if( !album )
0119         {
0120             qFatal("expected a Meta::MockAlbum");
0121 //             QFAIL( "expected a Meta::MockAlbum" );
0122             return trackPtr;
0123         }
0124         albumTracks = albumPtr->tracks();
0125     }
0126     else
0127     {
0128         album = new Meta::MockAlbum();
0129         ::testing::Mock::AllowLeak( album );
0130         albumPtr = Meta::AlbumPtr( album );
0131         EXPECT_CALL( *album, name() ).Times( AnyNumber() ).WillRepeatedly( Return( albumName ) );
0132         EXPECT_CALL( *album, prettyName() ).Times( AnyNumber() ).WillRepeatedly( Return( albumName ) );
0133         EXPECT_CALL( *album, hasAlbumArtist() ).Times( AnyNumber() ).WillRepeatedly( Return( false ) );
0134         EXPECT_CALL( *album, albumArtist() ).Times( AnyNumber() ).WillRepeatedly( Return( Meta::ArtistPtr() ) );
0135         EXPECT_CALL( *album, isCompilation() ).Times( AnyNumber() ).WillRepeatedly( Return( false ) );
0136         mColl->mc->addAlbum( albumPtr );
0137     }
0138     albumTracks << trackPtr;
0139     EXPECT_CALL( *album, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( albumTracks ) );
0140 
0141     EXPECT_CALL( *track, album() ).Times( AnyNumber() ).WillRepeatedly( Return( albumPtr ) );
0142 
0143     Meta::ArtistPtr artistPtr = mColl->mc->artistMap().value( artistName );
0144     Meta::MockArtist *artist;
0145     Meta::TrackList artistTracks;
0146     if( artistPtr )
0147     {
0148         artist = dynamic_cast<Meta::MockArtist*>( artistPtr.data() );
0149         if( !artist )
0150         {
0151             qFatal("expected a Meta::MockArtist");
0152 //             QFAIL( "expected a Meta::MockArtist" );
0153             return trackPtr;
0154         }
0155         artistTracks = artistPtr->tracks();
0156     }
0157     else
0158     {
0159         artist = new Meta::MockArtist();
0160         ::testing::Mock::AllowLeak( artist );
0161         artistPtr = Meta::ArtistPtr( artist );
0162         EXPECT_CALL( *artist, name() ).Times( AnyNumber() ).WillRepeatedly( Return( artistName ) );
0163     EXPECT_CALL( *artist, prettyName() ).Times( AnyNumber() ).WillRepeatedly( Return( artistName ) );
0164         mColl->mc->addArtist( artistPtr );
0165     }
0166     artistTracks << trackPtr;
0167     EXPECT_CALL( *artist, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( artistTracks ) );
0168     EXPECT_CALL( *track, artist() ).Times( AnyNumber() ).WillRepeatedly( Return( artistPtr ) );
0169     return trackPtr;
0170 }
0171 
0172 Meta::TrackList TestTrackOrganizer::makeTracks( int numTracks )
0173 {
0174   Meta::TrackList tracks;
0175   for( int i = 1; i <= numTracks; ++i )
0176   {
0177     QString title = "Title" + QString::number(i);
0178     Meta::TrackPtr t = makeMockTrack( title, "Artist1", "Album1", i );
0179     if( t )
0180       tracks << t;
0181   }
0182   return tracks;
0183 }