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