File indexing completed on 2024-05-12 04:49:39
0001 /**************************************************************************************** 0002 * Copyright (c) 2010 Maximilian Kossick <maximilian.kossick@googlemail.com> * 0003 * Copyright (c) 2011 Ralf Engels <ralf-engels@gmx.de> * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify it under * 0006 * the terms of the GNU General Public License as published by the Free Software * 0007 * Foundation; either version 2 of the License, or (at your option) any later * 0008 * version. * 0009 * * 0010 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0011 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0012 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License along with * 0015 * this program. If not, see <http://www.gnu.org/licenses/>. * 0016 ****************************************************************************************/ 0017 0018 #include "TestMemoryQueryMaker.h" 0019 0020 #include "mocks/MetaMock.h" 0021 #include "mocks/MockTrack.h" 0022 0023 #include "FileType.h" 0024 0025 #include <QVariantMap> 0026 #include <QSharedPointer> 0027 #include <QSignalSpy> 0028 0029 #include <gmock/gmock.h> 0030 0031 using ::testing::AnyNumber; 0032 using ::testing::Return; 0033 0034 QTEST_GUILESS_MAIN( TestMemoryQueryMaker ) 0035 0036 TestMemoryQueryMaker::TestMemoryQueryMaker() 0037 { 0038 int argc = 1; 0039 char **argv = (char **) malloc(sizeof(char *)); 0040 argv[0] = strdup( QCoreApplication::applicationName().toLocal8Bit().data() ); 0041 ::testing::InitGoogleMock( &argc, argv ); 0042 qRegisterMetaType<Meta::TrackList>(); 0043 qRegisterMetaType<Meta::AlbumList>(); 0044 qRegisterMetaType<Meta::ArtistList>(); 0045 } 0046 0047 void 0048 TestMemoryQueryMaker::initTestCase() 0049 { 0050 // prepare a memory collection with some test data 0051 m_mc = QSharedPointer<Collections::MemoryCollection>( new Collections::MemoryCollection() ); 0052 0053 MetaMock *track; 0054 0055 QVariantMap map; 0056 map.insert( Meta::Field::UNIQUEID, "1" ); 0057 map.insert( Meta::Field::TITLE, "Skater Boy" ); 0058 map.insert( Meta::Field::RATING, 3 ); 0059 // map.insert( Meta::Field::TYPE, int(Amarok::Mp3) ); 0060 map.insert( Meta::Field::TRACKNUMBER, 3 ); 0061 track = new MetaMock( map ); 0062 track->m_artist = new MockArtist("Avril Lavigne"); 0063 track->m_album = new MockAlbum("Let Go"); 0064 m_mc->addTrack( Meta::TrackPtr( track ) ); 0065 0066 map.insert( Meta::Field::UNIQUEID, "2" ); 0067 map.insert( Meta::Field::TITLE, "Substitute" ); 0068 map.insert( Meta::Field::RATING, 4 ); 0069 // map.insert( Meta::Field::TYPE, int(Amarok::Ogg) ); 0070 map.insert( Meta::Field::TRACKNUMBER, 1 ); 0071 track = new MetaMock( map ); 0072 track->m_artist = new MockArtist("Clout" ); 0073 track->m_album = new MockAlbum("Substitute" ); 0074 m_mc->addTrack( Meta::TrackPtr( track ) ); 0075 0076 map.insert( Meta::Field::UNIQUEID, "3" ); 0077 map.insert( Meta::Field::TITLE, "I Say A Little Prayer" ); 0078 map.insert( Meta::Field::RATING, 2 ); 0079 // map.insert( Meta::Field::TYPE, int(Amarok::Wma) ); 0080 map.insert( Meta::Field::TRACKNUMBER, 1 ); 0081 map.insert( Meta::Field::DISCNUMBER, 2 ); 0082 track = new MetaMock( map ); 0083 track->m_artist = new MockArtist("The Bosshoss" ); 0084 track->m_album = new MockAlbum("Rodeo Radio" ); 0085 m_mc->addTrack( Meta::TrackPtr( track ) ); 0086 } 0087 0088 void TestMemoryQueryMaker::cleanupTestCase() 0089 { 0090 } 0091 0092 void 0093 TestMemoryQueryMaker::testDeleteQueryMakerWhileQueryIsRunning() 0094 { 0095 QSharedPointer<Collections::MemoryCollection> mc( new Collections::MemoryCollection() ); 0096 mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() ))); 0097 mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() ))); 0098 Meta::MockTrack *mock = new Meta::MockTrack(); 0099 EXPECT_CALL( *mock, uidUrl() ).Times( AnyNumber() ).WillRepeatedly( Return( "track3" ) ); 0100 Meta::TrackPtr trackPtr( mock ); 0101 mc->addTrack( trackPtr ); 0102 0103 Collections::MemoryQueryMaker *qm = new Collections::MemoryQueryMaker( mc.toWeakRef(), "test" ); 0104 qm->setQueryType( Collections::QueryMaker::Track ); 0105 0106 qm->run(); 0107 delete qm; 0108 //we cannot wait for a signal here.... 0109 //QTest::qWait( 500 ); 0110 } 0111 0112 void 0113 TestMemoryQueryMaker::testDeleteCollectionWhileQueryIsRunning() 0114 { 0115 QSharedPointer<Collections::MemoryCollection> mc( new Collections::MemoryCollection() ); 0116 mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() ))); 0117 mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() ))); 0118 0119 Collections::MemoryQueryMaker *qm = new Collections::MemoryQueryMaker( mc, "test" ); 0120 qm->setQueryType( Collections::QueryMaker::Track ); 0121 0122 QSignalSpy spy( qm, &Collections::QueryMaker::queryDone); 0123 0124 qm->run(); 0125 mc.clear(); 0126 QTest::qWait( 500 ); 0127 QCOMPARE( spy.count(), 1 ); 0128 0129 delete qm; 0130 } 0131 0132 class TestStringMemoryFilter : public StringMemoryFilter 0133 { 0134 public: 0135 TestStringMemoryFilter() : StringMemoryFilter() {} 0136 0137 protected: 0138 QString value( const Meta::TrackPtr &track ) const override { Q_UNUSED(track); return "abcdef"; } 0139 0140 }; 0141 0142 void 0143 TestMemoryQueryMaker::testStringMemoryFilterSpeedFullMatch() 0144 { 0145 //Test 1: match complete string 0146 TestStringMemoryFilter filter1; 0147 filter1.setFilter( QString( "abcdef" ), true, true ); 0148 0149 QBENCHMARK { 0150 filter1.filterMatches( Meta::TrackPtr() ); 0151 } 0152 } 0153 0154 void 0155 TestMemoryQueryMaker::testStringMemoryFilterSpeedMatchBegin() 0156 { 0157 //Test 2: match beginning of string 0158 TestStringMemoryFilter filter2; 0159 filter2.setFilter( QString( "abcd" ), true, false ); 0160 0161 QBENCHMARK { 0162 filter2.filterMatches( Meta::TrackPtr() ); 0163 } 0164 } 0165 0166 void 0167 TestMemoryQueryMaker::testStringMemoryFilterSpeedMatchEnd() 0168 { 0169 //Test 3: match end of string 0170 TestStringMemoryFilter filter3; 0171 filter3.setFilter( QString( "cdef" ), false, true ); 0172 0173 QBENCHMARK { 0174 filter3.filterMatches( Meta::TrackPtr() ); 0175 } 0176 } 0177 0178 void 0179 TestMemoryQueryMaker::testStringMemoryFilterSpeedMatchAnywhere() 0180 { 0181 //Test 4: match anywhere in string 0182 TestStringMemoryFilter filter4; 0183 filter4.setFilter( QString( "bcde" ), false, false ); 0184 0185 QBENCHMARK { 0186 filter4.filterMatches( Meta::TrackPtr() ); 0187 } 0188 } 0189 0190 Meta::TrackList 0191 TestMemoryQueryMaker::executeQueryMaker( Collections::QueryMaker *qm ) 0192 { 0193 QSignalSpy doneSpy1( qm, &Collections::QueryMaker::queryDone ); 0194 QSignalSpy resultSpy1( qm, &Collections::QueryMaker::newTracksReady ); 0195 0196 qm->setQueryType( Collections::QueryMaker::Track ); 0197 qm->run(); 0198 0199 doneSpy1.wait( 1000 ); 0200 0201 if( resultSpy1.count() != 1 ) return Meta::TrackList(); 0202 if( doneSpy1.count() != 1 ) return Meta::TrackList(); 0203 0204 QList<QVariant> args1 = resultSpy1.takeFirst(); 0205 if( !args1.value(0).canConvert<Meta::TrackList>() ) return Meta::TrackList(); 0206 0207 delete qm; 0208 0209 return args1.value(0).value<Meta::TrackList>(); 0210 } 0211 0212 0213 void 0214 TestMemoryQueryMaker::testFilterTitle() 0215 { 0216 Meta::TrackList tracks; 0217 0218 // -- just get all the tracks 0219 Collections::MemoryQueryMaker *qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0220 tracks = executeQueryMaker( qm ); 0221 QCOMPARE( tracks.count(), 3 ); 0222 0223 // -- filter for title 0224 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0225 qm->addFilter( Meta::valTitle, "Skater", true, false ); 0226 tracks = executeQueryMaker( qm ); 0227 QCOMPARE( tracks.count(), 1 ); 0228 QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); 0229 0230 // -- filter for album 0231 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0232 qm->addFilter( Meta::valAlbum, "S", false, false ); 0233 tracks = executeQueryMaker( qm ); 0234 QCOMPARE( tracks.count(), 1 ); 0235 QCOMPARE( tracks.first()->name(), QString("Substitute" ) ); 0236 0237 // -- filter for artist 0238 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0239 qm->addFilter( Meta::valArtist, "Lavigne", false, true ); 0240 tracks = executeQueryMaker( qm ); 0241 QCOMPARE( tracks.count(), 1 ); 0242 QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); 0243 } 0244 0245 void 0246 TestMemoryQueryMaker::testFilterRating() 0247 { 0248 Meta::TrackList tracks; 0249 Collections::MemoryQueryMaker *qm = nullptr; 0250 0251 // -- filter for Rating 0252 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0253 qm->addNumberFilter( Meta::valRating, 3, Collections::QueryMaker::Equals ); 0254 tracks = executeQueryMaker( qm ); 0255 QCOMPARE( tracks.count(), 1 ); 0256 QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); 0257 0258 // -- filter for Rating 0259 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0260 qm->addNumberFilter( Meta::valRating, 4, Collections::QueryMaker::LessThan ); 0261 tracks = executeQueryMaker( qm ); 0262 QCOMPARE( tracks.count(), 2 ); 0263 } 0264 0265 void 0266 TestMemoryQueryMaker::testFilterAnd() 0267 { 0268 Meta::TrackList tracks; 0269 Collections::MemoryQueryMaker *qm = nullptr; 0270 0271 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0272 qm->beginAnd(); 0273 qm->addNumberFilter( Meta::valTrackNr, 1, Collections::QueryMaker::Equals ); 0274 qm->addFilter( Meta::valAlbum, "o", false, false ); 0275 qm->endAndOr(); 0276 tracks = executeQueryMaker( qm ); 0277 QCOMPARE( tracks.count(), 1 ); 0278 QCOMPARE( tracks.first()->album()->name(), QString("Rodeo Radio" ) ); 0279 } 0280 0281 void 0282 TestMemoryQueryMaker::testFilterFormat() 0283 { 0284 Meta::TrackList tracks; 0285 Collections::MemoryQueryMaker *qm = nullptr; 0286 0287 // -- filter for title 0288 qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); 0289 qm->addNumberFilter( Meta::valFormat, 0290 int(Amarok::Mp3), 0291 Collections::QueryMaker::Equals ); 0292 tracks = executeQueryMaker( qm ); 0293 QCOMPARE( tracks.count(), 0 ); 0294 } 0295 0296