Git commit e2e9f6116be0da007410b0241ac21a47e3f456f6 by Matthieu Gallien. Committed on 31/10/2016 at 21:55. Pushed by mgallien into branch 'master'. fix management of header when removing a track between two from the same al= bum M +202 -15 autotests/mediaplaylisttest.cpp M +2 -0 autotests/mediaplaylisttest.h M +2 -2 src/mediaplaylist.cpp http://commits.kde.org/elisa/e2e9f6116be0da007410b0241ac21a47e3f456f6 diff --git a/autotests/mediaplaylisttest.cpp b/autotests/mediaplaylisttest.= cpp index 6e6be5d..7827d02 100644 --- a/autotests/mediaplaylisttest.cpp +++ b/autotests/mediaplaylisttest.cpp @@ -398,7 +398,7 @@ void MediaPlayListTest::removeFirstTrackOfAlbum() QCOMPARE(trackHasBeenAddedSpy.count(), 6); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 7); - QCOMPARE(dataChangedSpy.count(), 1); + QCOMPARE(dataChangedSpy.count(), 0); = QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); @@ -587,7 +587,7 @@ void MediaPlayListTest::testHasHeader() QCOMPARE(trackHasBeenAddedSpy.count(), 4); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 5); - QCOMPARE(dataChangedSpy.count(), 1); + QCOMPARE(dataChangedSpy.count(), 0); = QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); @@ -702,9 +702,9 @@ void MediaPlayListTest::testHasHeaderWithRestore() QCOMPARE(trackHasBeenAddedSpy.count(), 1); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 1); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 1); = - QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); = myPlayList.enqueue({QStringLiteral("track1"), QStringLiteral("album1")= , QStringLiteral("artist1")}); = @@ -717,10 +717,10 @@ void MediaPlayListTest::testHasHeaderWithRestore() QCOMPARE(trackHasBeenAddedSpy.count(), 2); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 2); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 2); = - QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); - QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); = myPlayList.enqueue({QStringLiteral("track2"), QStringLiteral("album2")= , QStringLiteral("artist1")}); = @@ -733,11 +733,11 @@ void MediaPlayListTest::testHasHeaderWithRestore() QCOMPARE(trackHasBeenAddedSpy.count(), 3); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 3); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 3); = - QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); - QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); - QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); = myPlayList.enqueue({QStringLiteral("track3"), QStringLiteral("album2")= , QStringLiteral("artist1")}); = @@ -750,11 +750,11 @@ void MediaPlayListTest::testHasHeaderWithRestore() QCOMPARE(trackHasBeenAddedSpy.count(), 4); QCOMPARE(databaseInterfaceChangedSpy.count(), 1); QCOMPARE(persistentStateChangedSpy.count(), 4); - QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 4); = - QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); - QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); - QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); = myDatabaseContent.insertTracksList(newTracks, newCovers); @@ -776,6 +776,193 @@ void MediaPlayListTest::testHasHeaderWithRestore() QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); } = +void MediaPlayListTest::testHasHeaderWithRemove() +{ + MediaPlayList myPlayList; + DatabaseInterface myDatabaseContent; + DatabaseInterface myDatabaseView; + + QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAbou= tToBeMoved); + QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAb= outToBeRemoved); + QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsA= boutToBeInserted); + QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); + QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); + QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); + QSignalSpy trackHasBeenAddedSpy(&myPlayList, &MediaPlayList::trackHasB= eenAdded); + QSignalSpy databaseInterfaceChangedSpy(&myPlayList, &MediaPlayList::da= tabaseInterfaceChanged); + QSignalSpy persistentStateChangedSpy(&myPlayList, &MediaPlayList::pers= istentStateChanged); + QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 0); + QCOMPARE(trackHasBeenAddedSpy.count(), 0); + QCOMPARE(databaseInterfaceChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + myDatabaseContent.init(QStringLiteral("testDbDirectContent")); + myDatabaseContent.initDatabase(); + myDatabaseContent.initRequest(); + + myDatabaseView.init(QStringLiteral("testDbDirectView")); + myDatabaseView.initDatabase(); + myDatabaseView.initRequest(); + + connect(&myDatabaseContent, &DatabaseInterface::databaseChanged, + &myDatabaseView, &DatabaseInterface::databaseHasChanged); + + myPlayList.setDatabaseInterface(&myDatabaseView); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 0); + QCOMPARE(trackHasBeenAddedSpy.count(), 0); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(myPlayList.databaseInterface(), &myDatabaseView); + + auto newTracks =3D QHash>(); + auto newCovers =3D QHash(); + + newTracks[QStringLiteral("album1")] =3D { + {true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("= track1"), + QStringLiteral("artist1"), QStringLiteral("album1"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$1"))}}, + {true, QStringLiteral("$2"), QStringLiteral("0"), QStringLiteral("= track2"), + QStringLiteral("artist1"), QStringLiteral("album1"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$2"))}}, + {true, QStringLiteral("$3"), QStringLiteral("0"), QStringLiteral("= track3"), + QStringLiteral("artist1"), QStringLiteral("album1"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$3"))}}, + {true, QStringLiteral("$4"), QStringLiteral("0"), QStringLiteral("= track4"), + QStringLiteral("artist1"), QStringLiteral("album1"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$4"))}}, + }; + + newTracks[QStringLiteral("album2")] =3D { + {true, QStringLiteral("$5"), QStringLiteral("0"), QStringLiteral("= track1"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$5"))}}, + {true, QStringLiteral("$6"), QStringLiteral("0"), QStringLiteral("= track2"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$6"))}}, + {true, QStringLiteral("$7"), QStringLiteral("0"), QStringLiteral("= track3"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$7"))}}, + {true, QStringLiteral("$8"), QStringLiteral("0"), QStringLiteral("= track4"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$8"))}}, + {true, QStringLiteral("$9"), QStringLiteral("0"), QStringLiteral("= track5"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$9"))}}, + {true, QStringLiteral("$10"), QStringLiteral("0"), QStringLiteral(= "track6"), + QStringLiteral("artist1"), QStringLiteral("album2"), 1, {}, {Q= Url::fromLocalFile(QStringLiteral("$10"))}} + }; + + newCovers[QStringLiteral("album1")] =3D QUrl::fromLocalFile(QStringLit= eral("album1")); + newCovers[QStringLiteral("album2")] =3D QUrl::fromLocalFile(QStringLit= eral("album2")); + + myDatabaseContent.insertTracksList(newTracks, newCovers); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 0); + QCOMPARE(trackHasBeenAddedSpy.count(), 0); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + + auto firstTrackId =3D myDatabaseView.trackIdFromTitleAlbumArtist(QStri= ngLiteral("track1"), QStringLiteral("album2"), QStringLiteral("artist1")); + myPlayList.enqueue(firstTrackId); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 1); + QCOMPARE(trackHasBeenAddedSpy.count(), 1); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 1); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + + auto secondTrackId =3D myDatabaseView.trackIdFromTitleAlbumArtist(QStr= ingLiteral("track2"), QStringLiteral("album2"), QStringLiteral("artist1")); + myPlayList.enqueue(secondTrackId); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 2); + QCOMPARE(trackHasBeenAddedSpy.count(), 2); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 2); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + + auto thirdTrackId =3D myDatabaseView.trackIdFromTitleAlbumArtist(QStri= ngLiteral("track1"), QStringLiteral("album1"), QStringLiteral("artist1")); + myPlayList.enqueue(thirdTrackId); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 3); + QCOMPARE(trackHasBeenAddedSpy.count(), 3); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 3); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + + auto fourthTrackId =3D myDatabaseView.trackIdFromTitleAlbumArtist(QStr= ingLiteral("track3"), QStringLiteral("album2"), QStringLiteral("artist1")); + myPlayList.enqueue(fourthTrackId); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 4); + QCOMPARE(trackHasBeenAddedSpy.count(), 4); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 4); + QCOMPARE(dataChangedSpy.count(), 0); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + + myPlayList.removeRows(2, 1); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); + QCOMPARE(rowsRemovedSpy.count(), 1); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 4); + QCOMPARE(trackHasBeenAddedSpy.count(), 4); + QCOMPARE(databaseInterfaceChangedSpy.count(), 1); + QCOMPARE(persistentStateChangedSpy.count(), 5); + QCOMPARE(dataChangedSpy.count(), 1); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), true); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::Column= sRoles::HasAlbumHeader).toBool(), false); +} + = QTEST_MAIN(MediaPlayListTest) = diff --git a/autotests/mediaplaylisttest.h b/autotests/mediaplaylisttest.h index 33a009f..8db94db 100644 --- a/autotests/mediaplaylisttest.h +++ b/autotests/mediaplaylisttest.h @@ -47,6 +47,8 @@ private Q_SLOTS: = void testHasHeaderWithRestore(); = + void testHasHeaderWithRemove(); + }; = #endif // MEDIAPLAYLISTTEST_H diff --git a/src/mediaplaylist.cpp b/src/mediaplaylist.cpp index 937955a..6bdbcff 100644 --- a/src/mediaplaylist.cpp +++ b/src/mediaplaylist.cpp @@ -222,8 +222,8 @@ bool MediaPlayList::removeRows(int row, int count, cons= t QModelIndex &parent) = bool willChangeData =3D false; = - if (rowCount() > row + count) { - auto currentAlbum =3D d->mMusicDatabase->trackDataFromDatabaseId(d= ->mData[row + count - 1].mId, DatabaseInterface::TrackData::Album).toString= (); + if (rowCount() > row + count && row > 0) { + auto currentAlbum =3D d->mMusicDatabase->trackDataFromDatabaseId(d= ->mData[row - 1].mId, DatabaseInterface::TrackData::Album).toString(); auto nextAlbum =3D d->mMusicDatabase->trackDataFromDatabaseId(d->m= Data[row + count].mId, DatabaseInterface::TrackData::Album).toString(); = if (currentAlbum =3D=3D nextAlbum) {