diff --git a/autotests/databaseinterfacetest.cpp b/autotests/databaseinterfacetest.cpp index 83a62b65..7ffa49d5 100644 --- a/autotests/databaseinterfacetest.cpp +++ b/autotests/databaseinterfacetest.cpp @@ -1,2017 +1,2129 @@ /* * Copyright 2015-2017 Matthieu Gallien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "databaseinterface.h" #include "musicalbum.h" #include "musicaudiotrack.h" #include #include #include #include #include #include #include #include #include #include #include #include #include class DatabaseInterfaceTests: public QObject { Q_OBJECT private: QList mNewTracks; QHash mNewCovers; private Q_SLOTS: void initTestCase() { mNewTracks = { {true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 1, 1, QTime::fromMSecsSinceStartOfDay(1), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, {QUrl::fromLocalFile(QStringLiteral("album1"))}, 1}, {true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 2, QTime::fromMSecsSinceStartOfDay(2), {QUrl::fromLocalFile(QStringLiteral("/$2"))}, {QUrl::fromLocalFile(QStringLiteral("album1"))}, 2}, {true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 3, 3, QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))}, {QUrl::fromLocalFile(QStringLiteral("album1"))}, 3}, {true, QStringLiteral("$4"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 4, 4, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$4"))}, {QUrl::fromLocalFile(QStringLiteral("album1"))}, 4}, {true, QStringLiteral("$4"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 4, 4, QTime::fromMSecsSinceStartOfDay(4), {QUrl::fromLocalFile(QStringLiteral("/$4Bis"))}, {QUrl::fromLocalFile(QStringLiteral("album1"))}, 4}, {true, QStringLiteral("$5"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 1, 1, QTime::fromMSecsSinceStartOfDay(5), {QUrl::fromLocalFile(QStringLiteral("/$5"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 5}, {true, QStringLiteral("$6"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 2, 1, QTime::fromMSecsSinceStartOfDay(6), {QUrl::fromLocalFile(QStringLiteral("/$6"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 1}, {true, QStringLiteral("$7"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 3, 1, QTime::fromMSecsSinceStartOfDay(7), {QUrl::fromLocalFile(QStringLiteral("/$7"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 2}, {true, QStringLiteral("$8"), QStringLiteral("0"), QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 4, 1, QTime::fromMSecsSinceStartOfDay(8), {QUrl::fromLocalFile(QStringLiteral("/$8"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 3}, {true, QStringLiteral("$9"), QStringLiteral("0"), QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("artist1"), 5, 1, QTime::fromMSecsSinceStartOfDay(9), {QUrl::fromLocalFile(QStringLiteral("/$9"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 4}, {true, QStringLiteral("$10"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), QStringLiteral("artist1"), 6, 1, QTime::fromMSecsSinceStartOfDay(10), {QUrl::fromLocalFile(QStringLiteral("/$10"))}, {QUrl::fromLocalFile(QStringLiteral("album2"))}, 5}, {true, QStringLiteral("$11"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(11), {QUrl::fromLocalFile(QStringLiteral("/$11"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 1}, {true, QStringLiteral("$12"), QStringLiteral("0"), QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 2, 1, QTime::fromMSecsSinceStartOfDay(12), {QUrl::fromLocalFile(QStringLiteral("/$12"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 2}, {true, QStringLiteral("$13"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 3, 1, QTime::fromMSecsSinceStartOfDay(13), {QUrl::fromLocalFile(QStringLiteral("/$13"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 3}, }; mNewCovers[QStringLiteral("album1")] = QUrl::fromLocalFile(QStringLiteral("album1")); mNewCovers[QStringLiteral("album2")] = QUrl::fromLocalFile(QStringLiteral("album2")); mNewCovers[QStringLiteral("album3")] = QUrl::fromLocalFile(QStringLiteral("album3")); mNewCovers[QStringLiteral("album4")] = QUrl::fromLocalFile(QStringLiteral("album4")); qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QList"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("MusicArtist"); } void avoidCrashInTrackIdFromTitleAlbumArtist() { DatabaseInterface musicDb; musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album3"), QStringLiteral("artist2")); } void avoidCrashInAllArtists() { DatabaseInterface musicDb; musicDb.allArtists(); } void avoidCrashInAllAlbums() { DatabaseInterface musicDb; musicDb.allAlbums(); } void addOneTrackWithoutAlbumArtist() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 1); QCOMPARE(musicDb.allArtists().count(), 1); QCOMPARE(musicDbArtistAddedSpy.count(), 1); QCOMPARE(musicDbAlbumAddedSpy.count(), 1); QCOMPARE(musicDbTrackAddedSpy.count(), 1); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto track = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), QStringLiteral("album3"), QStringLiteral("artist2"))); QCOMPARE(track.isValid(), true); QCOMPARE(track.title(), QStringLiteral("track6")); QCOMPARE(track.artist(), QStringLiteral("artist2")); QCOMPARE(track.albumName(), QStringLiteral("album3")); QCOMPARE(track.albumArtist(), QStringLiteral("artist2")); QCOMPARE(track.isValidAlbumArtist(), false); QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(track.trackNumber(), 6); QCOMPARE(track.discNumber(), 1); QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(19)); QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19"))); QCOMPARE(track.rating(), 5); auto album = musicDb.albumFromTitle(QStringLiteral("album3")); QCOMPARE(album.isValid(), true); QCOMPARE(album.tracksCount(), 1); QCOMPARE(album.title(), QStringLiteral("album3")); QCOMPARE(album.artist(), QStringLiteral("artist2")); QCOMPARE(album.isValidArtist(), false); QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(album.isSingleDiscAlbum(), true); } void addTwoTracksWithoutAlbumArtist() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newTracks = QList(); newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}, {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"), QStringLiteral("artist3"), QStringLiteral("album3"), {}, 7, 1, QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}}; musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 1); QCOMPARE(musicDb.allArtists().count(), 2); QCOMPARE(musicDbArtistAddedSpy.count(), 2); QCOMPARE(musicDbAlbumAddedSpy.count(), 1); QCOMPARE(musicDbTrackAddedSpy.count(), 2); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), QStringLiteral("album3"), QStringLiteral("artist2"))); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrack.title(), QStringLiteral("track6")); QCOMPARE(firstTrack.artist(), QStringLiteral("artist2")); QCOMPARE(firstTrack.albumName(), QStringLiteral("album3")); QCOMPARE(firstTrack.albumArtist(), QStringLiteral("artist2")); QCOMPARE(firstTrack.isValidAlbumArtist(), false); QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(firstTrack.trackNumber(), 6); QCOMPARE(firstTrack.discNumber(), 1); QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19)); QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19"))); QCOMPARE(firstTrack.rating(), 5); auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track7"), QStringLiteral("album3"), QStringLiteral("artist3"))); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrack.title(), QStringLiteral("track7")); QCOMPARE(secondTrack.artist(), QStringLiteral("artist3")); QCOMPARE(secondTrack.albumName(), QStringLiteral("album3")); QCOMPARE(secondTrack.albumArtist(), QStringLiteral("artist3")); QCOMPARE(secondTrack.isValidAlbumArtist(), false); QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(secondTrack.trackNumber(), 7); QCOMPARE(secondTrack.discNumber(), 1); QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20)); QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20"))); QCOMPARE(secondTrack.rating(), 5); auto album = musicDb.albumFromTitle(QStringLiteral("album3")); QCOMPARE(album.isValid(), true); QCOMPARE(album.tracksCount(), 2); QCOMPARE(album.title(), QStringLiteral("album3")); QCOMPARE(album.artist(), QStringLiteral("Various Artists")); QCOMPARE(album.isValidArtist(), false); QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(album.isSingleDiscAlbum(), true); } + void addThreeTracksWithoutAlbumArtistButSameArtist() + { + DatabaseInterface musicDb; + + musicDb.init(QStringLiteral("testDb")); + + QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); + QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); + QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); + QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); + QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); + QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); + QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); + QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); + QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDbArtistAddedSpy.count(), 0); + QCOMPARE(musicDbAlbumAddedSpy.count(), 0); + QCOMPARE(musicDbTrackAddedSpy.count(), 0); + QCOMPARE(musicDbArtistRemovedSpy.count(), 0); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); + QCOMPARE(musicDbTrackRemovedSpy.count(), 0); + QCOMPARE(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + + auto newTracks = QList(); + + newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), + QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, + {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}, + {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"), + QStringLiteral("artist2"), QStringLiteral("album3"), {}, 7, 1, QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))}, + {QUrl::fromLocalFile(QStringLiteral("album3"))}, 4}, + {true, QStringLiteral("$21"), QStringLiteral("0"), QStringLiteral("track8"), + QStringLiteral("artist2"), QStringLiteral("album3"), {}, 8, 1, QTime::fromMSecsSinceStartOfDay(21), {QUrl::fromLocalFile(QStringLiteral("/$21"))}, + {QUrl::fromLocalFile(QStringLiteral("album3"))}, 3}}; + + musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); + + musicDbTrackAddedSpy.wait(300); + + QCOMPARE(musicDb.allAlbums().count(), 1); + QCOMPARE(musicDb.allArtists().count(), 1); + QCOMPARE(musicDbArtistAddedSpy.count(), 1); + QCOMPARE(musicDbAlbumAddedSpy.count(), 1); + QCOMPARE(musicDbTrackAddedSpy.count(), 3); + QCOMPARE(musicDbArtistRemovedSpy.count(), 0); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); + QCOMPARE(musicDbTrackRemovedSpy.count(), 0); + QCOMPARE(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + + auto firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), QStringLiteral("album3"), QStringLiteral("artist2"))); + + QCOMPARE(firstTrack.isValid(), true); + QCOMPARE(firstTrack.title(), QStringLiteral("track6")); + QCOMPARE(firstTrack.artist(), QStringLiteral("artist2")); + QCOMPARE(firstTrack.albumName(), QStringLiteral("album3")); + QCOMPARE(firstTrack.albumArtist(), QStringLiteral("artist2")); + QCOMPARE(firstTrack.isValidAlbumArtist(), false); + QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); + QCOMPARE(firstTrack.trackNumber(), 6); + QCOMPARE(firstTrack.discNumber(), 1); + QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19)); + QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19"))); + QCOMPARE(firstTrack.rating(), 5); + + auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track7"), QStringLiteral("album3"), QStringLiteral("artist2"))); + + QCOMPARE(secondTrack.isValid(), true); + QCOMPARE(secondTrack.title(), QStringLiteral("track7")); + QCOMPARE(secondTrack.artist(), QStringLiteral("artist2")); + QCOMPARE(secondTrack.albumName(), QStringLiteral("album3")); + QCOMPARE(secondTrack.albumArtist(), QStringLiteral("artist2")); + QCOMPARE(secondTrack.isValidAlbumArtist(), false); + QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); + QCOMPARE(secondTrack.trackNumber(), 7); + QCOMPARE(secondTrack.discNumber(), 1); + QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20)); + QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20"))); + QCOMPARE(secondTrack.rating(), 4); + + auto thirdTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track8"), QStringLiteral("album3"), QStringLiteral("artist2"))); + + QCOMPARE(thirdTrack.isValid(), true); + QCOMPARE(thirdTrack.title(), QStringLiteral("track8")); + QCOMPARE(thirdTrack.artist(), QStringLiteral("artist2")); + QCOMPARE(thirdTrack.albumName(), QStringLiteral("album3")); + QCOMPARE(thirdTrack.albumArtist(), QStringLiteral("artist2")); + QCOMPARE(thirdTrack.isValidAlbumArtist(), false); + QCOMPARE(thirdTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); + QCOMPARE(thirdTrack.trackNumber(), 8); + QCOMPARE(thirdTrack.discNumber(), 1); + QCOMPARE(thirdTrack.duration(), QTime::fromMSecsSinceStartOfDay(21)); + QCOMPARE(thirdTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$21"))); + QCOMPARE(thirdTrack.rating(), 3); + + auto album = musicDb.albumFromTitle(QStringLiteral("album3")); + + QCOMPARE(album.isValid(), true); + QCOMPARE(album.tracksCount(), 3); + QCOMPARE(album.title(), QStringLiteral("album3")); + QCOMPARE(album.artist(), QStringLiteral("artist2")); + QCOMPARE(album.isValidArtist(), false); + QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3"))); + QCOMPARE(album.isSingleDiscAlbum(), true); + } + void addTwoTracksWithPartialAlbumArtist() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newTracks = QList(); newTracks = {{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), {}, 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}, {true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"), QStringLiteral("artist3"), QStringLiteral("album3"), {QStringLiteral("artist4")}, 7, 1, QTime::fromMSecsSinceStartOfDay(20), {QUrl::fromLocalFile(QStringLiteral("/$20"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}}; musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 1); QCOMPARE(musicDb.allArtists().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 3); QCOMPARE(musicDbAlbumAddedSpy.count(), 1); QCOMPARE(musicDbTrackAddedSpy.count(), 2); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 1); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), QStringLiteral("album3"), QStringLiteral("artist2"))); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrack.title(), QStringLiteral("track6")); QCOMPARE(firstTrack.artist(), QStringLiteral("artist2")); QCOMPARE(firstTrack.albumName(), QStringLiteral("album3")); QCOMPARE(firstTrack.albumArtist(), QStringLiteral("artist4")); QCOMPARE(firstTrack.isValidAlbumArtist(), true); QCOMPARE(firstTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(firstTrack.trackNumber(), 6); QCOMPARE(firstTrack.discNumber(), 1); QCOMPARE(firstTrack.duration(), QTime::fromMSecsSinceStartOfDay(19)); QCOMPARE(firstTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$19"))); QCOMPARE(firstTrack.rating(), 5); auto secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track7"), QStringLiteral("album3"), QStringLiteral("artist3"))); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrack.title(), QStringLiteral("track7")); QCOMPARE(secondTrack.artist(), QStringLiteral("artist3")); QCOMPARE(secondTrack.albumName(), QStringLiteral("album3")); QCOMPARE(secondTrack.albumArtist(), QStringLiteral("artist4")); QCOMPARE(secondTrack.isValidAlbumArtist(), true); QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(secondTrack.trackNumber(), 7); QCOMPARE(secondTrack.discNumber(), 1); QCOMPARE(secondTrack.duration(), QTime::fromMSecsSinceStartOfDay(20)); QCOMPARE(secondTrack.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$20"))); QCOMPARE(secondTrack.rating(), 5); auto album = musicDb.albumFromTitle(QStringLiteral("album3")); QCOMPARE(album.isValid(), true); QCOMPARE(album.tracksCount(), 2); QCOMPARE(album.title(), QStringLiteral("album3")); QCOMPARE(album.artist(), QStringLiteral("artist4")); QCOMPARE(album.isValidArtist(), true); QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(album.isSingleDiscAlbum(), true); } void addMultipleTimeSameTracks() { DatabaseInterface musicDb; QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto firstAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(firstAlbum.isValid(), true); QCOMPARE(firstAlbum.title(), QStringLiteral("album1")); auto firstAlbumInvalid = musicDb.albumFromTitle(QStringLiteral("album1Invalid")); QCOMPARE(firstAlbumInvalid.isValid(), false); } void addTwiceSameTracksWidthDatabaseFile() { QTemporaryFile myTempDatabase; myTempDatabase.open(); { DatabaseInterface musicDb; QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb1"), myTempDatabase.fileName()); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto firstAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(firstAlbum.isValid(), true); QCOMPARE(firstAlbum.title(), QStringLiteral("album1")); auto firstAlbumInvalid = musicDb.albumFromTitle(QStringLiteral("album1Invalid")); QCOMPARE(firstAlbumInvalid.isValid(), false); } { DatabaseInterface musicDb; QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb2"), myTempDatabase.fileName()); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto firstAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(firstAlbum.isValid(), true); QCOMPARE(firstAlbum.title(), QStringLiteral("album1")); auto firstAlbumInvalid = musicDb.albumFromTitle(QStringLiteral("album1Invalid")); QCOMPARE(firstAlbumInvalid.isValid(), false); } } void restoreModifiedTracksWidthDatabaseFile() { QTemporaryFile myTempDatabase; myTempDatabase.open(); { DatabaseInterface musicDb; auto allNewTracks = mNewTracks; allNewTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 5}); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb1"), myTempDatabase.fileName()); musicDb.insertTracksList(allNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto firstAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(firstAlbum.isValid(), true); QCOMPARE(firstAlbum.title(), QStringLiteral("album1")); auto firstAlbumInvalid = musicDb.albumFromTitle(QStringLiteral("album1Invalid")); QCOMPARE(firstAlbumInvalid.isValid(), false); auto fourthAlbum = musicDb.albumFromTitle(QStringLiteral("album3")); QCOMPARE(fourthAlbum.isValid(), true); QCOMPARE(fourthAlbum.title(), QStringLiteral("album3")); QCOMPARE(fourthAlbum.tracksCount(), 4); auto oneTrack = fourthAlbum.trackFromIndex(3); QCOMPARE(oneTrack.isValid(), true); QCOMPARE(oneTrack.rating(), 5); } { DatabaseInterface musicDb; auto allNewTracks = mNewTracks; allNewTracks.push_back({true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("album3"))}, 3}); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb2"), myTempDatabase.fileName()); auto newFiles = QList(); for (const auto &oneTrack : allNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(allNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto firstAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(firstAlbum.isValid(), true); QCOMPARE(firstAlbum.title(), QStringLiteral("album1")); auto firstAlbumInvalid = musicDb.albumFromTitle(QStringLiteral("album1Invalid")); QCOMPARE(firstAlbumInvalid.isValid(), false); auto fourthAlbum = musicDb.albumFromTitle(QStringLiteral("album3")); QCOMPARE(fourthAlbum.isValid(), true); QCOMPARE(fourthAlbum.title(), QStringLiteral("album3")); QCOMPARE(fourthAlbum.tracksCount(), 4); auto oneTrack = fourthAlbum.trackFromIndex(3); QCOMPARE(oneTrack.isValid(), true); QCOMPARE(oneTrack.title(), QStringLiteral("track6")); QCOMPARE(oneTrack.rating(), 3); } } void simpleAccessor() { DatabaseInterface musicDb; QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); musicDb.init(QStringLiteral("testDb")); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto invalidTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("invalidArtist1")); QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0)); auto trackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(trackId); auto firstTrackTitle = firstTrack.title(); auto firstTrackArtist = firstTrack.artist(); auto firstTrackAlbumArtist = firstTrack.albumArtist(); auto firstTrackAlbum = firstTrack.albumName(); auto firstTrackImage = firstTrack.albumCover(); auto firstTrackDuration = firstTrack.duration(); auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); auto firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrackTitle, QStringLiteral("track1")); QCOMPARE(firstTrackArtist, QStringLiteral("artist1")); QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstTrackAlbum, QStringLiteral("album1")); QCOMPARE(firstTrackImage.isValid(), true); QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1)); QCOMPARE(firstTrackMilliSecondsDuration, 1); QCOMPARE(firstTrackTrackNumber, 1); QCOMPARE(firstTrackDiscNumber, 1); QCOMPARE(firstTrackResource.isValid(), true); QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1"))); QCOMPARE(firstTrackRating, 1); auto secondAlbumTitle = allAlbums[1].title(); auto secondAlbumArtist = allAlbums[1].artist(); auto secondAlbumImage = allAlbums[1].albumArtURI(); auto secondAlbumTracksCount = allAlbums[1].tracksCount(); auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum(); QCOMPARE(secondAlbumTitle, QStringLiteral("album2")); QCOMPARE(secondAlbumArtist, QStringLiteral("artist1")); QCOMPARE(secondAlbumImage.isValid(), true); QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2"))); QCOMPARE(secondAlbumTracksCount, 6); QCOMPARE(secondAlbumIsSingleDiscAlbum, true); } void simpleAccessorAndVariousArtistAlbum() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDbVariousArtistAlbum")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto invalidTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("invalidArtist1")); QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0)); auto firstTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto firstTrackTitle = firstTrack.title(); auto firstTrackArtist = firstTrack.artist(); auto firstTrackAlbumArtist = firstTrack.albumArtist(); auto firstTrackAlbum = firstTrack.albumName(); auto firstTrackImage = firstTrack.albumCover(); auto firstTrackDuration = firstTrack.duration(); auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); auto firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrackTitle, QStringLiteral("track1")); QCOMPARE(firstTrackArtist, QStringLiteral("artist1")); QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstTrackAlbum, QStringLiteral("album1")); QCOMPARE(firstTrackImage.isValid(), true); QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1)); QCOMPARE(firstTrackMilliSecondsDuration, 1); QCOMPARE(firstTrackTrackNumber, 1); QCOMPARE(firstTrackDiscNumber, 1); QCOMPARE(firstTrackResource.isValid(), true); QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1"))); QCOMPARE(firstTrackRating, 1); auto secondTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), QStringLiteral("album1"), QStringLiteral("artist2")); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto secondTrackTitle = secondTrack.title(); auto secondTrackArtist = secondTrack.artist(); auto secondTrackAlbumArtist = secondTrack.albumArtist(); auto secondTrackAlbum = secondTrack.albumName(); auto seconfTrackImage = secondTrack.albumCover(); auto secondTrackDuration = secondTrack.duration(); auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); auto secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrackTitle, QStringLiteral("track2")); QCOMPARE(secondTrackArtist, QStringLiteral("artist2")); QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(secondTrackAlbum, QStringLiteral("album1")); QCOMPARE(seconfTrackImage.isValid(), true); QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2)); QCOMPARE(secondTrackMilliSecondsDuration, 2); QCOMPARE(secondTrackTrackNumber, 2); QCOMPARE(secondTrackDiscNumber, 2); QCOMPARE(secondTrackResource.isValid(), true); QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2"))); QCOMPARE(secondTrackRating, 2); auto thirdTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), QStringLiteral("album1"), QStringLiteral("artist3")); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto thirdTrackTitle = thirdTrack.title(); auto thirdTrackArtist = thirdTrack.artist(); auto thirdTrackAlbumArtist = thirdTrack.albumArtist(); auto thirdTrackAlbum = thirdTrack.albumName(); auto thirdTrackImage = thirdTrack.albumCover(); auto thirdTrackDuration = thirdTrack.duration(); auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); auto thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); QCOMPARE(thirdTrack.isValid(), true); QCOMPARE(thirdTrackTitle, QStringLiteral("track3")); QCOMPARE(thirdTrackArtist, QStringLiteral("artist3")); QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(thirdTrackAlbum, QStringLiteral("album1")); QCOMPARE(thirdTrackImage.isValid(), true); QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3)); QCOMPARE(thirdTrackMilliSecondsDuration, 3); QCOMPARE(thirdTrackTrackNumber, 3); QCOMPARE(thirdTrackDiscNumber, 3); QCOMPARE(thirdTrackResource.isValid(), true); QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3"))); QCOMPARE(thirdTrackRating, 3); auto fourthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), QStringLiteral("album1"), QStringLiteral("artist4")); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); auto fourthTrackTitle = fourthTrack.title(); auto fourthTrackArtist = fourthTrack.artist(); auto fourthTrackAlbumArtist = fourthTrack.albumArtist(); auto fourthTrackAlbum = fourthTrack.albumName(); auto fourthTrackImage = fourthTrack.albumCover(); auto fourthTrackDuration = fourthTrack.duration(); auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); auto fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); QCOMPARE(fourthTrack.isValid(), true); QCOMPARE(fourthTrackTitle, QStringLiteral("track4")); QCOMPARE(fourthTrackArtist, QStringLiteral("artist4")); QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(fourthTrackAlbum, QStringLiteral("album1")); QCOMPARE(fourthTrackImage.isValid(), true); QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4)); QCOMPARE(fourthTrackMilliSecondsDuration, 4); QCOMPARE(fourthTrackTrackNumber, 4); QCOMPARE(fourthTrackDiscNumber, 4); QCOMPARE(fourthTrackResource.isValid(), true); QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4"))); QCOMPARE(fourthTrackRating, 3); auto secondAlbumTitle = allAlbums[1].title(); auto secondAlbumArtist = allAlbums[1].artist(); auto secondAlbumImage = allAlbums[1].albumArtURI(); auto secondAlbumTracksCount = allAlbums[1].tracksCount(); auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum(); QCOMPARE(secondAlbumTitle, QStringLiteral("album2")); QCOMPARE(secondAlbumArtist, QStringLiteral("artist1")); QCOMPARE(secondAlbumImage.isValid(), true); QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2"))); QCOMPARE(secondAlbumTracksCount, 6); QCOMPARE(secondAlbumIsSingleDiscAlbum, true); } void fetchAllTracksFromSource() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDbVariousArtistAlbum")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newFiles2 = QList(); for (const auto &oneTrack : newTracks) { newFiles2.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest2")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 7); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 14); auto allTracks = musicDb.allTracksFromSource(QStringLiteral("autoTest")); auto allTracks2 = musicDb.allTracksFromSource(QStringLiteral("autoTest2")); QCOMPARE(allTracks.count(), 13); QCOMPARE(allTracks2.count(), 1); } void simpleAccessorAndVariousArtistAlbumWithFile() { QTemporaryFile myDatabaseFile; myDatabaseFile.open(); { DatabaseInterface musicDb; QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); musicDb.init(QStringLiteral("testDbVariousArtistAlbum1"), myDatabaseFile.fileName()); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto invalidTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("invalidArtist1")); QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0)); auto firstTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto firstTrackTitle = firstTrack.title(); auto firstTrackArtist = firstTrack.artist(); auto firstTrackAlbumArtist = firstTrack.albumArtist(); auto firstTrackAlbum = firstTrack.albumName(); auto firstTrackImage = firstTrack.albumCover(); auto firstTrackDuration = firstTrack.duration(); auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); auto firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrackTitle, QStringLiteral("track1")); QCOMPARE(firstTrackArtist, QStringLiteral("artist1")); QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstTrackAlbum, QStringLiteral("album1")); QCOMPARE(firstTrackImage.isValid(), true); QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1)); QCOMPARE(firstTrackMilliSecondsDuration, 1); QCOMPARE(firstTrackTrackNumber, 1); QCOMPARE(firstTrackDiscNumber, 1); QCOMPARE(firstTrackResource.isValid(), true); QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1"))); QCOMPARE(firstTrackRating, 1); auto secondTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), QStringLiteral("album1"), QStringLiteral("artist2")); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto secondTrackTitle = secondTrack.title(); auto secondTrackArtist = secondTrack.artist(); auto secondTrackAlbumArtist = secondTrack.albumArtist(); auto secondTrackAlbum = secondTrack.albumName(); auto seconfTrackImage = secondTrack.albumCover(); auto secondTrackDuration = secondTrack.duration(); auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); auto secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrackTitle, QStringLiteral("track2")); QCOMPARE(secondTrackArtist, QStringLiteral("artist2")); QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(secondTrackAlbum, QStringLiteral("album1")); QCOMPARE(seconfTrackImage.isValid(), true); QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2)); QCOMPARE(secondTrackMilliSecondsDuration, 2); QCOMPARE(secondTrackTrackNumber, 2); QCOMPARE(secondTrackDiscNumber, 2); QCOMPARE(secondTrackResource.isValid(), true); QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2"))); QCOMPARE(secondTrackRating, 2); auto thirdTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), QStringLiteral("album1"), QStringLiteral("artist3")); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto thirdTrackTitle = thirdTrack.title(); auto thirdTrackArtist = thirdTrack.artist(); auto thirdTrackAlbumArtist = thirdTrack.albumArtist(); auto thirdTrackAlbum = thirdTrack.albumName(); auto thirdTrackImage = thirdTrack.albumCover(); auto thirdTrackDuration = thirdTrack.duration(); auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); auto thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); QCOMPARE(thirdTrack.isValid(), true); QCOMPARE(thirdTrackTitle, QStringLiteral("track3")); QCOMPARE(thirdTrackArtist, QStringLiteral("artist3")); QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(thirdTrackAlbum, QStringLiteral("album1")); QCOMPARE(thirdTrackImage.isValid(), true); QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3)); QCOMPARE(thirdTrackMilliSecondsDuration, 3); QCOMPARE(thirdTrackTrackNumber, 3); QCOMPARE(thirdTrackDiscNumber, 3); QCOMPARE(thirdTrackResource.isValid(), true); QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3"))); QCOMPARE(thirdTrackRating, 3); auto fourthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), QStringLiteral("album1"), QStringLiteral("artist4")); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); auto fourthTrackTitle = fourthTrack.title(); auto fourthTrackArtist = fourthTrack.artist(); auto fourthTrackAlbumArtist = fourthTrack.albumArtist(); auto fourthTrackAlbum = fourthTrack.albumName(); auto fourthTrackImage = fourthTrack.albumCover(); auto fourthTrackDuration = fourthTrack.duration(); auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); auto fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); QCOMPARE(fourthTrack.isValid(), true); QCOMPARE(fourthTrackTitle, QStringLiteral("track4")); QCOMPARE(fourthTrackArtist, QStringLiteral("artist4")); QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(fourthTrackAlbum, QStringLiteral("album1")); QCOMPARE(fourthTrackImage.isValid(), true); QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4)); QCOMPARE(fourthTrackMilliSecondsDuration, 4); QCOMPARE(fourthTrackTrackNumber, 4); QCOMPARE(fourthTrackDiscNumber, 4); QCOMPARE(fourthTrackResource.isValid(), true); QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4"))); QCOMPARE(fourthTrackRating, 3); auto secondAlbumTitle = allAlbums[1].title(); auto secondAlbumArtist = allAlbums[1].artist(); auto secondAlbumImage = allAlbums[1].albumArtURI(); auto secondAlbumTracksCount = allAlbums[1].tracksCount(); auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum(); QCOMPARE(secondAlbumTitle, QStringLiteral("album2")); QCOMPARE(secondAlbumArtist, QStringLiteral("artist1")); QCOMPARE(secondAlbumImage.isValid(), true); QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2"))); QCOMPARE(secondAlbumTracksCount, 6); QCOMPARE(secondAlbumIsSingleDiscAlbum, true); } { DatabaseInterface musicDb; QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); musicDb.init(QStringLiteral("testDbVariousArtistAlbum2"), myDatabaseFile.fileName()); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto invalidTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("invalidArtist1")); QCOMPARE(invalidTrackId, decltype(invalidTrackId)(0)); auto firstTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto firstTrackTitle = firstTrack.title(); auto firstTrackArtist = firstTrack.artist(); auto firstTrackAlbumArtist = firstTrack.albumArtist(); auto firstTrackAlbum = firstTrack.albumName(); auto firstTrackImage = firstTrack.albumCover(); auto firstTrackDuration = firstTrack.duration(); auto firstTrackMilliSecondsDuration = firstTrack.duration().msecsSinceStartOfDay(); auto firstTrackTrackNumber = firstTrack.trackNumber(); auto firstTrackDiscNumber = firstTrack.discNumber(); auto firstTrackResource = firstTrack.resourceURI(); auto firstTrackRating = firstTrack.rating(); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrackTitle, QStringLiteral("track1")); QCOMPARE(firstTrackArtist, QStringLiteral("artist1")); QCOMPARE(firstTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstTrackAlbum, QStringLiteral("album1")); QCOMPARE(firstTrackImage.isValid(), true); QCOMPARE(firstTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(1)); QCOMPARE(firstTrackMilliSecondsDuration, 1); QCOMPARE(firstTrackTrackNumber, 1); QCOMPARE(firstTrackDiscNumber, 1); QCOMPARE(firstTrackResource.isValid(), true); QCOMPARE(firstTrackResource, QUrl::fromLocalFile(QStringLiteral("/$1"))); QCOMPARE(firstTrackRating, 1); auto secondTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), QStringLiteral("album1"), QStringLiteral("artist2")); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto secondTrackTitle = secondTrack.title(); auto secondTrackArtist = secondTrack.artist(); auto secondTrackAlbumArtist = secondTrack.albumArtist(); auto secondTrackAlbum = secondTrack.albumName(); auto seconfTrackImage = secondTrack.albumCover(); auto secondTrackDuration = secondTrack.duration(); auto secondTrackMilliSecondsDuration = secondTrack.duration().msecsSinceStartOfDay(); auto secondTrackTrackNumber = secondTrack.trackNumber(); auto secondTrackDiscNumber = secondTrack.discNumber(); auto secondTrackResource = secondTrack.resourceURI(); auto secondTrackRating = secondTrack.rating(); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrackTitle, QStringLiteral("track2")); QCOMPARE(secondTrackArtist, QStringLiteral("artist2")); QCOMPARE(secondTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(secondTrackAlbum, QStringLiteral("album1")); QCOMPARE(seconfTrackImage.isValid(), true); QCOMPARE(seconfTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(2)); QCOMPARE(secondTrackMilliSecondsDuration, 2); QCOMPARE(secondTrackTrackNumber, 2); QCOMPARE(secondTrackDiscNumber, 2); QCOMPARE(secondTrackResource.isValid(), true); QCOMPARE(secondTrackResource, QUrl::fromLocalFile(QStringLiteral("/$2"))); QCOMPARE(secondTrackRating, 2); auto thirdTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), QStringLiteral("album1"), QStringLiteral("artist3")); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto thirdTrackTitle = thirdTrack.title(); auto thirdTrackArtist = thirdTrack.artist(); auto thirdTrackAlbumArtist = thirdTrack.albumArtist(); auto thirdTrackAlbum = thirdTrack.albumName(); auto thirdTrackImage = thirdTrack.albumCover(); auto thirdTrackDuration = thirdTrack.duration(); auto thirdTrackMilliSecondsDuration = thirdTrack.duration().msecsSinceStartOfDay(); auto thirdTrackTrackNumber = thirdTrack.trackNumber(); auto thirdTrackDiscNumber = thirdTrack.discNumber(); auto thirdTrackResource = thirdTrack.resourceURI(); auto thirdTrackRating = thirdTrack.rating(); QCOMPARE(thirdTrack.isValid(), true); QCOMPARE(thirdTrackTitle, QStringLiteral("track3")); QCOMPARE(thirdTrackArtist, QStringLiteral("artist3")); QCOMPARE(thirdTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(thirdTrackAlbum, QStringLiteral("album1")); QCOMPARE(thirdTrackImage.isValid(), true); QCOMPARE(thirdTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(thirdTrackDuration, QTime::fromMSecsSinceStartOfDay(3)); QCOMPARE(thirdTrackMilliSecondsDuration, 3); QCOMPARE(thirdTrackTrackNumber, 3); QCOMPARE(thirdTrackDiscNumber, 3); QCOMPARE(thirdTrackResource.isValid(), true); QCOMPARE(thirdTrackResource, QUrl::fromLocalFile(QStringLiteral("/$3"))); QCOMPARE(thirdTrackRating, 3); auto fourthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), QStringLiteral("album1"), QStringLiteral("artist4")); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); auto fourthTrackTitle = fourthTrack.title(); auto fourthTrackArtist = fourthTrack.artist(); auto fourthTrackAlbumArtist = fourthTrack.albumArtist(); auto fourthTrackAlbum = fourthTrack.albumName(); auto fourthTrackImage = fourthTrack.albumCover(); auto fourthTrackDuration = fourthTrack.duration(); auto fourthTrackMilliSecondsDuration = fourthTrack.duration().msecsSinceStartOfDay(); auto fourthTrackTrackNumber = fourthTrack.trackNumber(); auto fourthTrackDiscNumber = fourthTrack.discNumber(); auto fourthTrackResource = fourthTrack.resourceURI(); auto fourthTrackRating = thirdTrack.rating(); QCOMPARE(fourthTrack.isValid(), true); QCOMPARE(fourthTrackTitle, QStringLiteral("track4")); QCOMPARE(fourthTrackArtist, QStringLiteral("artist4")); QCOMPARE(fourthTrackAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(fourthTrackAlbum, QStringLiteral("album1")); QCOMPARE(fourthTrackImage.isValid(), true); QCOMPARE(fourthTrackImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(fourthTrackDuration, QTime::fromMSecsSinceStartOfDay(4)); QCOMPARE(fourthTrackMilliSecondsDuration, 4); QCOMPARE(fourthTrackTrackNumber, 4); QCOMPARE(fourthTrackDiscNumber, 4); QCOMPARE(fourthTrackResource.isValid(), true); QCOMPARE(fourthTrackResource, QUrl::fromLocalFile(QStringLiteral("/$4"))); QCOMPARE(fourthTrackRating, 3); auto secondAlbumTitle = allAlbums[1].title(); auto secondAlbumArtist = allAlbums[1].artist(); auto secondAlbumImage = allAlbums[1].albumArtURI(); auto secondAlbumTracksCount = allAlbums[1].tracksCount(); auto secondAlbumIsSingleDiscAlbum = allAlbums[1].isSingleDiscAlbum(); QCOMPARE(secondAlbumTitle, QStringLiteral("album2")); QCOMPARE(secondAlbumArtist, QStringLiteral("artist1")); QCOMPARE(secondAlbumImage.isValid(), true); QCOMPARE(secondAlbumImage, QUrl::fromLocalFile(QStringLiteral("album2"))); QCOMPARE(secondAlbumTracksCount, 6); QCOMPARE(secondAlbumIsSingleDiscAlbum, true); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newFiles2 = QList(); for (const auto &oneTrack : newTracks) { newFiles2.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 7); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 14); } } void testTracksFromAuthor() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDbVariousArtistAlbum")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); auto allTracks = musicDb.tracksFromAuthor(QStringLiteral("artist1")); QCOMPARE(allTracks.size(), 6); QCOMPARE(allTracks[0].albumArtist(), QStringLiteral("Various Artists")); QCOMPARE(allTracks[1].albumArtist(), QStringLiteral("artist1")); QCOMPARE(allTracks[2].albumArtist(), QStringLiteral("artist1")); QCOMPARE(allTracks[3].albumArtist(), QStringLiteral("artist1")); QCOMPARE(allTracks[4].albumArtist(), QStringLiteral("artist1")); QCOMPARE(allTracks[5].albumArtist(), QStringLiteral("artist1")); } void removeOneTrack() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto trackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(trackId); musicDb.removeTracksList({firstTrack.resourceURI()}); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto allAlbumsV2 = musicDb.allAlbums(); const auto &firstAlbum = allAlbumsV2[0]; QCOMPARE(musicDb.allAlbums().isEmpty(), false); QCOMPARE(firstAlbum.isValid(), true); auto firstAlbumTitleV2 = firstAlbum.title(); auto firstAlbumArtistV2 = firstAlbum.artist(); auto firstAlbumImageV2 = firstAlbum.albumArtURI(); auto firstAlbumTracksCountV2 = firstAlbum.tracksCount(); auto firstAlbumIsSingleDiscAlbumV2 = firstAlbum.isSingleDiscAlbum(); QCOMPARE(firstAlbumTitleV2, QStringLiteral("album1")); QCOMPARE(firstAlbumArtistV2, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImageV2.isValid(), true); QCOMPARE(firstAlbumImageV2, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCountV2, 3); QCOMPARE(firstAlbumIsSingleDiscAlbumV2, false); auto removedTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); QCOMPARE(removedTrackId, qulonglong(0)); } void removeOneAlbum() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto firstTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); auto firstTrack = musicDb.trackFromDatabaseId(firstTrackId); auto secondTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track2"), QStringLiteral("album1"), QStringLiteral("artist2")); auto secondTrack = musicDb.trackFromDatabaseId(secondTrackId); auto thirdTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), QStringLiteral("album1"), QStringLiteral("artist3")); auto thirdTrack = musicDb.trackFromDatabaseId(thirdTrackId); auto fourthTrackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), QStringLiteral("album1"), QStringLiteral("artist4")); auto fourthTrack = musicDb.trackFromDatabaseId(fourthTrackId); musicDb.removeTracksList({firstTrack.resourceURI(), secondTrack.resourceURI(), thirdTrack.resourceURI(), fourthTrack.resourceURI()}); QCOMPARE(musicDb.allAlbums().count(), 2); QCOMPARE(musicDb.allArtists().count(), 4); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 2); QCOMPARE(musicDbAlbumRemovedSpy.count(), 1); QCOMPARE(musicDbTrackRemovedSpy.count(), 4); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto removedAlbum = musicDb.albumFromTitle(QStringLiteral("album1")); QCOMPARE(removedAlbum.isValid(), false); } void removeOneArtist() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto allAlbums = musicDb.allAlbums(); auto firstAlbumTitle = allAlbums[0].title(); auto firstAlbumArtist = allAlbums[0].artist(); auto firstAlbumImage = allAlbums[0].albumArtURI(); auto firstAlbumTracksCount = allAlbums[0].tracksCount(); auto firstAlbumIsSingleDiscAlbum = allAlbums[0].isSingleDiscAlbum(); QCOMPARE(firstAlbumTitle, QStringLiteral("album1")); QCOMPARE(firstAlbumArtist, QStringLiteral("Various Artists")); QCOMPARE(firstAlbumImage.isValid(), true); QCOMPARE(firstAlbumImage, QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(firstAlbumTracksCount, 4); QCOMPARE(firstAlbumIsSingleDiscAlbum, false); auto trackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track4"), QStringLiteral("album1"), QStringLiteral("artist4")); auto track = musicDb.trackFromDatabaseId(trackId); musicDb.removeTracksList({track.resourceURI()}); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 5); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 1); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 1); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); } void addOneTrack() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album3"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 14); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); } void addTwoTracksInAlbumWithoutCover() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist2"), QStringLiteral("album6"), QStringLiteral("artist2"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 4); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 4); QCOMPARE(musicDbTrackAddedSpy.count(), 14); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); const auto &firstTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track6"), QStringLiteral("album6"), QStringLiteral("artist2"))); QCOMPARE(firstTrack.isValid(), true); QCOMPARE(firstTrack.albumCover(), QUrl()); auto newTrack2 = MusicAudioTrack{true, QStringLiteral("$20"), QStringLiteral("0"), QStringLiteral("track7"), QStringLiteral("artist2"), QStringLiteral("album6"), QStringLiteral("artist2"), 7, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("album6"))}, 5}; auto newTracks2 = QList(); newTracks2.push_back(newTrack2); auto newCovers2 = mNewCovers; newCovers2[QStringLiteral("album6")] = QUrl::fromLocalFile(QStringLiteral("album6")); musicDb.insertTracksList(newTracks2, newCovers2, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 4); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 4); QCOMPARE(musicDbTrackAddedSpy.count(), 15); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 5); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); const auto &secondTrack = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track7"), QStringLiteral("album6"), QStringLiteral("artist2"))); QCOMPARE(secondTrack.isValid(), true); QCOMPARE(secondTrack.albumCover(), QUrl::fromLocalFile(QStringLiteral("album6"))); } void modifyOneTrack() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto modifiedTrack = MusicAudioTrack{true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 5, 3, QTime::fromMSecsSinceStartOfDay(3), {QUrl::fromLocalFile(QStringLiteral("/$3"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$3"))}, 5}; musicDb.modifyTracksList({modifiedTrack}, mNewCovers); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 2); auto trackId = musicDb.trackIdFromTitleAlbumArtist(QStringLiteral("track3"), QStringLiteral("album1"), QStringLiteral("artist3")); QCOMPARE(trackId != 0, true); auto track = musicDb.trackFromDatabaseId(trackId); QCOMPARE(track.isValid(), true); QCOMPARE(track.trackNumber(), 5); } void addOneAlbum() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album5"), QStringLiteral("artist2"), 1, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newCover = QUrl::fromLocalFile(QStringLiteral("file://image$19")); auto newCovers = mNewCovers; newCovers[QStringLiteral("album5")] = newCover; musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 4); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 4); QCOMPARE(musicDbTrackAddedSpy.count(), 14); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); const auto &newAlbum = musicDb.albumFromTitle(QStringLiteral("album5")); QCOMPARE(newAlbum.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("file://image$19"))); } void addOneArtist() { DatabaseInterface musicDb; musicDb.init(QStringLiteral("testDb")); QSignalSpy musicDbArtistAddedSpy(&musicDb, &DatabaseInterface::artistAdded); QSignalSpy musicDbAlbumAddedSpy(&musicDb, &DatabaseInterface::albumAdded); QSignalSpy musicDbTrackAddedSpy(&musicDb, &DatabaseInterface::trackAdded); QSignalSpy musicDbArtistRemovedSpy(&musicDb, &DatabaseInterface::artistRemoved); QSignalSpy musicDbAlbumRemovedSpy(&musicDb, &DatabaseInterface::albumRemoved); QSignalSpy musicDbTrackRemovedSpy(&musicDb, &DatabaseInterface::trackRemoved); QSignalSpy musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); QCOMPARE(musicDb.allAlbums().count(), 0); QCOMPARE(musicDb.allArtists().count(), 0); QCOMPARE(musicDbArtistAddedSpy.count(), 0); QCOMPARE(musicDbAlbumAddedSpy.count(), 0); QCOMPARE(musicDbTrackAddedSpy.count(), 0); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); QCOMPARE(musicDbTrackModifiedSpy.count(), 0); auto newFiles = QList(); const auto &constNewTracks = mNewTracks; for (const auto &oneTrack : constNewTracks) { newFiles.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 6); QCOMPARE(musicDbArtistAddedSpy.count(), 6); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 13); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 3); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); auto newTrack = MusicAudioTrack{true, QStringLiteral("$19"), QStringLiteral("0"), QStringLiteral("track6"), QStringLiteral("artist6"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 6, 1, QTime::fromMSecsSinceStartOfDay(19), {QUrl::fromLocalFile(QStringLiteral("/$19"))}, {QUrl::fromLocalFile(QStringLiteral("file://image$19"))}, 5}; auto newTracks = QList(); newTracks.push_back(newTrack); auto newFiles2 = QList(); for (const auto &oneTrack : newTracks) { newFiles2.push_back(oneTrack.resourceURI()); } musicDb.insertTracksList(newTracks, mNewCovers, QStringLiteral("autoTest")); musicDbTrackAddedSpy.wait(300); QCOMPARE(musicDb.allAlbums().count(), 3); QCOMPARE(musicDb.allArtists().count(), 7); QCOMPARE(musicDbArtistAddedSpy.count(), 7); QCOMPARE(musicDbAlbumAddedSpy.count(), 3); QCOMPARE(musicDbTrackAddedSpy.count(), 14); QCOMPARE(musicDbArtistRemovedSpy.count(), 0); QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); QCOMPARE(musicDbTrackRemovedSpy.count(), 0); QCOMPARE(musicDbArtistModifiedSpy.count(), 0); QCOMPARE(musicDbAlbumModifiedSpy.count(), 4); QCOMPARE(musicDbTrackModifiedSpy.count(), 1); } }; QTEST_MAIN(DatabaseInterfaceTests) #include "databaseinterfacetest.moc" diff --git a/src/musicalbum.cpp b/src/musicalbum.cpp index 85d131b7..cd27637a 100644 --- a/src/musicalbum.cpp +++ b/src/musicalbum.cpp @@ -1,346 +1,359 @@ /* * Copyright 2016-2017 Matthieu Gallien * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "musicalbum.h" #include #include #include #include #include #include class MusicAlbumPrivate { public: qulonglong mDatabaseId = 0; QString mId; QString mParentId; QString mTitle; QString mArtist; QUrl mAlbumArtURI; QUrl mResourceURI; QList mTracks; int mTracksCount = 0; bool mIsValid = false; bool mIsSingleDiscAlbum = true; }; MusicAlbum::MusicAlbum() : d(new MusicAlbumPrivate) { } MusicAlbum::MusicAlbum(MusicAlbum &&other) : d(other.d) { other.d = nullptr; } MusicAlbum::MusicAlbum(const MusicAlbum &other) : d(new MusicAlbumPrivate(*other.d)) { } MusicAlbum& MusicAlbum::operator=(MusicAlbum &&other) { if (&other != this) { delete d; d = other.d; other.d = nullptr; } return *this; } MusicAlbum& MusicAlbum::operator=(const MusicAlbum &other) { if (&other != this) { (*d) = (*other.d); } return *this; } MusicAlbum::~MusicAlbum() { delete d; } void MusicAlbum::setValid(bool value) { d->mIsValid = value; } bool MusicAlbum::isValid() const { return d->mIsValid; } void MusicAlbum::setDatabaseId(qulonglong value) { d->mDatabaseId = value; } qulonglong MusicAlbum::databaseId() const { return d->mDatabaseId; } void MusicAlbum::setId(const QString &value) { d->mId = value; } QString MusicAlbum::id() const { return d->mId; } void MusicAlbum::setParentId(const QString &value) { d->mParentId = value; } QString MusicAlbum::parentId() const { return d->mParentId; } void MusicAlbum::setTracksCount(int count) { d->mTracksCount = count; } int MusicAlbum::tracksCount() const { return d->mTracks.size(); } void MusicAlbum::setTitle(const QString &value) { d->mTitle = value; } QString MusicAlbum::title() const { return d->mTitle; } void MusicAlbum::setArtist(const QString &value) { d->mArtist = value; } QString MusicAlbum::artist() const { QString result; if (!d->mArtist.isEmpty()) { result = d->mArtist; } else { + QString possibleAlbumArtist; for (const auto &oneTrack : qAsConst(d->mTracks)) { if (oneTrack.isValidAlbumArtist()) { result = oneTrack.albumArtist(); break; } + if (possibleAlbumArtist.isEmpty()) { + possibleAlbumArtist = oneTrack.artist(); + } else { + if (possibleAlbumArtist != oneTrack.artist()) { + possibleAlbumArtist.clear(); + break; + } + } } if (result.isEmpty() && d->mTracks.size() > 1) { - result = QStringLiteral("Various Artists"); + if (possibleAlbumArtist.isEmpty()) { + result = QStringLiteral("Various Artists"); + } else { + result = possibleAlbumArtist; + } } else if (result.isEmpty() && d->mTracks.size() == 1) { result = d->mTracks.constFirst().albumArtist(); } } return result; } void MusicAlbum::setAlbumArtURI(const QUrl &value) { d->mAlbumArtURI = value; } QUrl MusicAlbum::albumArtURI() const { return d->mAlbumArtURI; } void MusicAlbum::setResourceURI(const QUrl &value) { d->mResourceURI = value; } QUrl MusicAlbum::resourceURI() const { return d->mResourceURI; } void MusicAlbum::setIsSingleDiscAlbum(bool value) { d->mIsSingleDiscAlbum = value; } bool MusicAlbum::isSingleDiscAlbum() const { return d->mIsSingleDiscAlbum; } void MusicAlbum::setTracks(const QList &allTracks) { d->mTracks = allTracks; } MusicAudioTrack MusicAlbum::trackFromIndex(int index) const { return d->mTracks[index]; } qulonglong MusicAlbum::trackIdFromIndex(int index) const { return d->mTracks[index].databaseId(); } int MusicAlbum::trackIndexFromId(qulonglong id) const { int result = -1; for (result = 0; result < d->mTracks.size(); ++result) { if (d->mTracks[result].databaseId() == id) { return result; } } result = -1; return result; } QStringList MusicAlbum::allArtists() const { auto result = QList(); result.reserve(d->mTracks.size()); const auto &allTracks = d->mTracks; for (const auto &oneTrack : allTracks) { result.push_back(oneTrack.artist()); } std::sort(result.begin(), result.end()); result.erase(std::unique(result.begin(), result.end()), result.end()); return result; } QStringList MusicAlbum::allTracksTitle() const { auto result = QList(); result.reserve(d->mTracks.size()); const auto &allTracks = d->mTracks; for (const auto &oneTrack : allTracks) { result.push_back(oneTrack.title()); } std::sort(result.begin(), result.end()); result.erase(std::unique(result.begin(), result.end()), result.end()); return result; } bool MusicAlbum::isEmpty() const { return d->mTracks.isEmpty(); } void MusicAlbum::removeTrackFromIndex(int index) { if (index < 0 || index >= tracksCount()) { return; } --d->mTracksCount; d->mTracks.removeAt(index); } void MusicAlbum::insertTrack(const MusicAudioTrack &newTrack, int index) { d->mTracks.insert(index, newTrack); ++d->mTracksCount; } void MusicAlbum::updateTrack(const MusicAudioTrack &modifiedTrack, int index) { d->mTracks[index] = modifiedTrack; } QDebug& operator<<(QDebug &stream, const MusicAlbum &data) { stream << data.title() << " artist: " << data.artist() << " tracks: " << data.tracksCount(); return stream; } bool operator==(const MusicAlbum &album1, const MusicAlbum &album2) { return album1.title() == album2.title() && ( (album1.isValidArtist() && album2.isValidArtist() && album1.artist() == album2.artist()) || !album1.isValidArtist() || !album2.isValidArtist()); } int MusicAlbum::highestTrackRating() const { int result = 0; const auto &allTracks = d->mTracks; for (const auto &oneTrack : allTracks) { result = std::max(result, oneTrack.rating()); } return result; } bool MusicAlbum::isValidArtist() const { return !d->mArtist.isEmpty(); } bool MusicAlbum::canUpdateArtist(const MusicAudioTrack ¤tTrack) const { bool result = false; if (currentTrack.isValidAlbumArtist() && currentTrack.albumArtist() != artist()) { result = true; } return result; }