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 }