diff --git a/autotests/mediaplaylistproxymodeltest.cpp b/autotests/mediaplaylistproxymodeltest.cpp index bb58aa1d..1e88860e 100644 --- a/autotests/mediaplaylistproxymodeltest.cpp +++ b/autotests/mediaplaylistproxymodeltest.cpp @@ -1,7163 +1,7167 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2020 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "mediaplaylistproxymodeltest.h" #include "mediaplaylisttestconfig.h" #include "datatypes.h" #include "mediaplaylist.h" #include "mediaplaylistproxymodel.h" #include "databaseinterface.h" #include "trackslistener.h" #include "config-upnp-qt.h" #include #include #include #include #include MediaPlayListProxyModelTest::MediaPlayListProxyModelTest(QObject *parent) : QObject(parent) { } void MediaPlayListProxyModelTest::initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("PlayListEntryType"); } void MediaPlayListProxyModelTest::simpleInitialCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); auto newTrackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID); - myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); } void MediaPlayListProxyModelTest::enqueueAlbumCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, - QStringLiteral("album2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, + QStringLiteral("album2"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); } void MediaPlayListProxyModelTest::enqueueArtistCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.rowCount(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); } void MediaPlayListProxyModelTest::enqueueMultipleAlbumsCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, {{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"))}}, - QStringLiteral("album3"), {}}}); + QStringLiteral("album3"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 11); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 12); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 13); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3); } void MediaPlayListProxyModelTest::enqueueTrackByUrl() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); auto trackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, trackData.resourceURI()}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, trackData.resourceURI()}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 1); } void MediaPlayListProxyModelTest::enqueueTracksByUrl() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); auto firstNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); auto firstTrackData = myDatabaseContent.trackDataFromDatabaseId(firstNewTrackID); auto secondNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); auto secondTrackData = myDatabaseContent.trackDataFromDatabaseId(secondNewTrackID); myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, firstTrackData.resourceURI()}, - {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, secondTrackData.resourceURI()}}); + {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, secondTrackData.resourceURI()}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); } void MediaPlayListProxyModelTest::enqueueReplaceAndPlay() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); - myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, firstTrackID},{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, firstTrackID},{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {}); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, - QStringLiteral("album1"), {}}, + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, + QStringLiteral("album1"), {}}}, ElisaUtils::ReplacePlayList, ElisaUtils::TriggerPlay); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4); } void MediaPlayListProxyModelTest::removeFirstTrackOfAlbum() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, - QStringLiteral("album2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, + QStringLiteral("album2"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); myPlayListProxyModel.removeRow(0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); } void MediaPlayListProxyModelTest::testSaveLoadPlayList() { MediaPlayList myPlayListSave; MediaPlayListProxyModel myPlayListProxyModelSave; myPlayListProxyModelSave.setPlayListModel(&myPlayListSave); QAbstractItemModelTester testModelSave(&myPlayListProxyModelSave); DatabaseInterface myDatabaseContent; TracksListener myListenerSave(&myDatabaseContent); MediaPlayList myPlayListRestore; MediaPlayListProxyModel myPlayListProxyModelRestore; myPlayListProxyModelRestore.setPlayListModel(&myPlayListRestore); QAbstractItemModelTester testModelRestore(&myPlayListProxyModelRestore); TracksListener myListenerRestore(&myDatabaseContent); QSignalSpy currentTrackChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListFinished); QSignalSpy playListLoadedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoaded); QSignalSpy playListLoadFailedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoadFailed); QSignalSpy dataChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::dataChanged); QSignalSpy currentTrackChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListFinished); QSignalSpy playListLoadedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoaded); QSignalSpy playListLoadFailedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoadFailed); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListenerSave, &TracksListener::trackHasChanged, &myPlayListSave, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerSave, &TracksListener::tracksListAdded, &myPlayListSave, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList, &myListenerSave, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newEntryInList, &myListenerSave, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newUrlInList, &myListenerSave, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerSave, &TracksListener::tracksAdded); connect(&myListenerRestore, &TracksListener::trackHasChanged, &myPlayListRestore, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerRestore, &TracksListener::tracksListAdded, &myPlayListRestore, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList, &myListenerRestore, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListRestore, &MediaPlayList::newEntryInList, &myListenerRestore, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayListRestore, &MediaPlayList::newUrlInList, &myListenerRestore, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerRestore, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 0); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 0); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); - myPlayListProxyModelSave.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModelSave.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModelSave.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModelSave.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QVERIFY(dataChangedSaveSpy.wait()); QCOMPARE(currentTrackChangedSaveSpy.count(), 1); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 0); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); QCOMPARE(myPlayListProxyModelSave.currentTrack(), QPersistentModelIndex(myPlayListProxyModelSave.index(0, 0))); QTemporaryFile playlistFile(QStringLiteral("./myPlaylistXXXXXX.m3u")); playlistFile.open(); QCOMPARE(myPlayListProxyModelSave.savePlayList(QUrl::fromLocalFile(playlistFile.fileName())), true); QCOMPARE(currentTrackChangedSaveSpy.count(), 1); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 0); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); myPlayListProxyModelRestore.loadPlayList(QUrl::fromLocalFile(playlistFile.fileName())); QCOMPARE(currentTrackChangedSaveSpy.count(), 1); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 1); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.wait(), true); QCOMPARE(currentTrackChangedSaveSpy.count(), 1); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(playListLoadedSaveSpy.count(), 0); QCOMPARE(playListLoadFailedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 1); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(playListLoadedRestoreSpy.count(), 1); QCOMPARE(playListLoadFailedRestoreSpy.count(), 0); QCOMPARE(myPlayListProxyModelRestore.currentTrack(), QPersistentModelIndex(myPlayListProxyModelRestore.index(0, 0))); } void MediaPlayListProxyModelTest::testSavePersistentState() { MediaPlayList myPlayListSave; QAbstractItemModelTester testModelSave(&myPlayListSave); MediaPlayListProxyModel myPlayListSaveProxyModel; myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave); QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListenerSave(&myDatabaseContent); MediaPlayList myPlayListRead; QAbstractItemModelTester testModelRead(&myPlayListRead); MediaPlayListProxyModel myPlayListReadProxyModel; myPlayListReadProxyModel.setPlayListModel(&myPlayListRead); QAbstractItemModelTester testProxyModelRead(&myPlayListReadProxyModel); TracksListener myListenerRead(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy rowsAboutToBeMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::dataChanged); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 0); QCOMPARE(persistentStateChangedSpySave.count(), 0); QCOMPARE(dataChangedSpySave.count(), 0); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListenerSave, &TracksListener::trackHasChanged, &myPlayListSave, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerSave, &TracksListener::tracksListAdded, &myPlayListSave, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList, &myListenerSave, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newEntryInList, &myListenerSave, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerSave, &TracksListener::tracksAdded); connect(&myListenerRead, &TracksListener::trackHasChanged, &myPlayListRead, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerRead, &TracksListener::tracksListAdded, &myPlayListRead, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListRead, &MediaPlayList::newTrackByNameInList, &myListenerRead, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListRead, &MediaPlayList::newEntryInList, &myListenerRead, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerRead, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 0); QCOMPARE(persistentStateChangedSpySave.count(), 0); QCOMPARE(dataChangedSpySave.count(), 0); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), 1, 1); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {}); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 1); QCOMPARE(persistentStateChangedSpySave.count(), 1); QCOMPARE(dataChangedSpySave.count(), 0); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpySave.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 1); QCOMPARE(persistentStateChangedSpySave.count(), 1); QCOMPARE(dataChangedSpySave.count(), 1); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {}); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 2); QCOMPARE(persistentStateChangedSpySave.count(), 2); QCOMPARE(dataChangedSpySave.count(), 1); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpySave.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 2); QCOMPARE(persistentStateChangedSpySave.count(), 2); QCOMPARE(dataChangedSpySave.count(), 2); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {}); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 3); QCOMPARE(persistentStateChangedSpySave.count(), 3); QCOMPARE(dataChangedSpySave.count(), 2); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpySave.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 3); QCOMPARE(persistentStateChangedSpySave.count(), 3); QCOMPARE(dataChangedSpySave.count(), 3); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 0); QCOMPARE(persistentStateChangedSpyRead.count(), 0); QCOMPARE(dataChangedSpyRead.count(), 0); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12"))); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true); myPlayListReadProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState()); QCOMPARE(dataChangedSpyRead.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3); QCOMPARE(rowsRemovedSpySave.count(), 0); QCOMPARE(rowsMovedSpySave.count(), 0); QCOMPARE(rowsInsertedSpySave.count(), 3); QCOMPARE(persistentStateChangedSpySave.count(), 3); QCOMPARE(dataChangedSpySave.count(), 3); QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 1); QCOMPARE(rowsRemovedSpyRead.count(), 0); QCOMPARE(rowsMovedSpyRead.count(), 0); QCOMPARE(rowsInsertedSpyRead.count(), 1); QCOMPARE(persistentStateChangedSpyRead.count(), 2); QCOMPARE(dataChangedSpyRead.count(), 3); QCOMPARE(myPlayListReadProxyModel.tracksCount(), 3); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3")); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12"))); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true); } void MediaPlayListProxyModelTest::testRestoreSettings() { MediaPlayList myPlayListModel; MediaPlayListProxyModel myPlayList; myPlayList.setPlayListModel(&myPlayListModel); QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayList, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayList, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayList, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayList, &MediaPlayListProxyModel::playListFinished); QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayListModel, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayListModel, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListModel, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListModel, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayListModel, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); - myPlayList.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayList.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayList.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayList.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QVERIFY(dataChangedSpy.wait()); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QVariantMap settings; settings[QStringLiteral("currentTrack")] = 2; settings[QStringLiteral("shufflePlayList")] = true; settings[QStringLiteral("repeatPlay")] = true; myPlayList.setPersistentState(settings); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); } void MediaPlayListProxyModelTest::testSaveAndRestoreSettings() { MediaPlayList myPlayListSave; QAbstractItemModelTester testModelSave(&myPlayListSave); MediaPlayListProxyModel myPlayListSaveProxyModel; myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave); QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListenerSave(&myDatabaseContent); MediaPlayList myPlayListRestore; QAbstractItemModelTester testModelRestore(&myPlayListRestore); MediaPlayListProxyModel myPlayListRestoreProxyModel; myPlayListRestoreProxyModel.setPlayListModel(&myPlayListRestore); QAbstractItemModelTester testProxyModelRestore(&myPlayListRestoreProxyModel); TracksListener myListenerRestore(&myDatabaseContent); QSignalSpy currentTrackChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::playListFinished); QSignalSpy dataChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy currentTrackChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListenerSave, &TracksListener::trackHasChanged, &myPlayListSave, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerSave, &TracksListener::tracksListAdded, &myPlayListSave, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList, &myListenerSave, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListSave, &MediaPlayList::newEntryInList, &myListenerSave, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerSave, &TracksListener::tracksAdded); connect(&myListenerRestore, &TracksListener::trackHasChanged, &myPlayListRestore, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListenerRestore, &TracksListener::tracksListAdded, &myPlayListRestore, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList, &myListenerRestore, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayListRestore, &MediaPlayList::newEntryInList, &myListenerRestore, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListenerRestore, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 0); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); myPlayListSaveProxyModel.setRepeatPlay(true); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); myPlayListSaveProxyModel.setShufflePlayList(true); QCOMPARE(currentTrackChangedSaveSpy.count(), 0); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListSaveProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QVERIFY(dataChangedSaveSpy.wait()); QCOMPARE(currentTrackChangedSaveSpy.count(), 1); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(myPlayListSaveProxyModel.currentTrack(), QPersistentModelIndex(myPlayListSaveProxyModel.index(0, 0))); myPlayListSaveProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSaveSpy.count(), 2); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); myPlayListSaveProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSaveSpy.count(), 3); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 0); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 0); QCOMPARE(playListFinishedRestoreSpy.count(), 0); myPlayListRestoreProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState()); QCOMPARE(currentTrackChangedSaveSpy.count(), 3); QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1); QCOMPARE(repeatPlayChangedSaveSpy.count(), 1); QCOMPARE(playListFinishedSaveSpy.count(), 0); QCOMPARE(currentTrackChangedRestoreSpy.count(), 1); QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 1); QCOMPARE(repeatPlayChangedRestoreSpy.count(), 1); QCOMPARE(playListFinishedRestoreSpy.count(), 0); QCOMPARE(myPlayListRestoreProxyModel.repeatPlay(), true); QCOMPARE(myPlayListRestoreProxyModel.shufflePlayList(), true); } void MediaPlayListProxyModelTest::shufflePlayList() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.setRepeatPlay(true); myPlayListProxyModel.setShufflePlayList(true); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.shufflePlayList(), true); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); } void MediaPlayListProxyModelTest::testShuffleMode() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.setRepeatPlay(true); myPlayListProxyModel.setShufflePlayList(true); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.shufflePlayList(), true); QCOMPARE(myPlayListProxyModel.repeatPlay(), true); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.removeRow(1); } void MediaPlayListProxyModelTest::randomAndContinuePlayList() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.setShufflePlayList(true); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.shufflePlayList(), true); myPlayListProxyModel.setRepeatPlay(true); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.repeatPlay(), true); myPlayListProxyModel.switchTo(3); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); } void MediaPlayListProxyModelTest::continuePlayList() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.setRepeatPlay(true); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.repeatPlay(), true); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::previousAndNextTracksTest() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy previousTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::previousTrackChanged); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy nextTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::nextTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(previousTrackChangedSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(nextTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, - QStringLiteral("track4"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, + QStringLiteral("track4"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(previousTrackChangedSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(nextTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex()); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(previousTrackChangedSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(nextTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.switchTo(4); QCOMPARE(previousTrackChangedSpy.count(), 2); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(nextTrackChangedSpy.count(), 3); QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex()); myPlayListProxyModel.setRepeatPlay(true); QCOMPARE(previousTrackChangedSpy.count(), 2); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(nextTrackChangedSpy.count(), 4); QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(previousTrackChangedSpy.count(), 3); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(nextTrackChangedSpy.count(), 5); QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.setShufflePlayList(true); QVERIFY(myPlayListProxyModel.previousTrack() != QPersistentModelIndex()); QVERIFY(myPlayListProxyModel.currentTrack() != QPersistentModelIndex()); QVERIFY(myPlayListProxyModel.nextTrack() != QPersistentModelIndex()); } void MediaPlayListProxyModelTest::remainingTracksTest() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy remainingTracksChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::remainingTracksChanged); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(remainingTracksChangedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, - QStringLiteral("track4"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, + QStringLiteral("track4"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(remainingTracksChangedSpy.count(), 6); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); QCOMPARE(myPlayListProxyModel.remainingTracks(), 4); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(remainingTracksChangedSpy.count(), 7); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); QCOMPARE(myPlayListProxyModel.remainingTracks(), 3); myPlayListProxyModel.setShufflePlayList(true); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 1); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(remainingTracksChangedSpy.count(), 8); myPlayListProxyModel.setShufflePlayList(false); myPlayListProxyModel.setRepeatPlay(true); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 2); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(remainingTracksChangedSpy.count(), 10); } void MediaPlayListProxyModelTest::clearPlayListCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, - QStringLiteral("album2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, + QStringLiteral("album2"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(tracksCountChangedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.clearPlayList(); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(tracksCountChangedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(myPlayListProxyModel.rowCount(), 0); QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false); } void MediaPlayListProxyModelTest::undoClearPlayListCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, - QStringLiteral("album2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, + QStringLiteral("album2"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(tracksCountChangedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.clearPlayList(); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(tracksCountChangedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(myPlayListProxyModel.rowCount(), 0); QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false); myPlayListProxyModel.undoClearPlayList(); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 3); QCOMPARE(tracksCountChangedSpy.count(), 5); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 6); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(displayUndoNotificationSpy.count(), 1); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QVERIFY(dataChangedSpy.wait()); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::undoReplacePlayListCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(tracksCountChangedSpy.count(), 0); QCOMPARE(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(currentTrackChangedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, - QStringLiteral("album2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, + QStringLiteral("album2"), {}}}, {}, {}); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(tracksCountChangedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Album}, - {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, - QStringLiteral("album1"), {}}, + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, + {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, + QStringLiteral("album1"), {}}}, ElisaUtils::ReplacePlayList, ElisaUtils::TriggerPlay); QVERIFY(rowsAboutToBeInsertedSpy.wait()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 3); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 7); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4); myPlayListProxyModel.undoClearPlayList(); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5); QCOMPARE(rowsRemovedSpy.count(), 4); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 5); QCOMPARE(tracksCountChangedSpy.count(), 9); QCOMPARE(persistentStateChangedSpy.count(), 10); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 6); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(currentTrackChangedSpy.count(), 7); QCOMPARE(displayUndoNotificationSpy.count(), 1); QCOMPARE(myPlayListProxyModel.rowCount(), 6); QVERIFY(dataChangedSpy.wait()); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousAndContinueCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged); QSignalSpy repeatPlayChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatPlayChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.setRepeatPlay(true); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, - QStringLiteral("track2"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, + QStringLiteral("track2"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 5); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 6); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 7); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 8); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 9); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 10); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 11); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 12); QCOMPARE(shufflePlayListChangedSpy.count(), 0); QCOMPARE(repeatPlayChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0))); } void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleNotBeginCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 1)}}, - QStringLiteral("track4"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 1)}}, + QStringLiteral("track4"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.removeRow(1); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); } void MediaPlayListProxyModelTest::testBringUpAndPlayCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); } void MediaPlayListProxyModelTest::testBringUpAndSkipNextCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); } void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipPreviousTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testRemoveSelection() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}}, + ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(),1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myPlayListProxyModel.removeSelection({2, 4, 5}); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 4); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); } void MediaPlayListProxyModelTest::testReplaceAndPlayArtist() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist3"), {}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist3"), {}}}, + ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist4"), {}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist4"), {}}}, + ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 3); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 7); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.tracksCount(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); } void MediaPlayListProxyModelTest::testReplaceAndPlayTrackId() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3); QCOMPARE(firstTrackId != 0, true); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"), QStringLiteral("album1"), 4, 4); QCOMPARE(secondTrackId != 0, true); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.tracksCount(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4"))); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false); } void MediaPlayListProxyModelTest::testTrackBeenRemoved() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}, + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}}, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); auto removedTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); QCOMPARE(removedTrackId != 0, true); auto removedTrack = myDatabaseContent.trackDataFromDatabaseId(removedTrackId); QVERIFY(!removedTrack.isEmpty()); myPlayList.trackRemoved(removedTrack[DataTypes::DatabaseIdRole].toULongLong()); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 2); QCOMPARE(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.tracksCount(), 6); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); } void MediaPlayListProxyModelTest::finishPlayList() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(playListFinishedSpy.count(), 1); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::removeBeforeCurrentTrack() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, - QStringLiteral("track5"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, + QStringLiteral("track5"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0))); myPlayListProxyModel.removeRow(1); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(playListFinishedSpy.count(), 0); } void MediaPlayListProxyModelTest::switchToTrackTest() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, - QStringLiteral("track3"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, - QStringLiteral("track4"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, + QStringLiteral("track3"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, + QStringLiteral("track4"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.switchTo(4); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0))); } void MediaPlayListProxyModelTest::singleTrack() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 1); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testBringUpAndRemoveCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.removeRow(0); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 1); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex()); } void MediaPlayListProxyModelTest::testBringUpAndRemoveLastCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, - QStringLiteral("track2"), {}}); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, - QStringLiteral("track3"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, + QStringLiteral("track2"), {}}}, {}, {}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, + QStringLiteral("track3"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0))); myPlayListProxyModel.skipNextTrack(); QCOMPARE(currentTrackChangedSpy.count(), 3); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0))); myPlayListProxyModel.removeRow(2); QCOMPARE(currentTrackChangedSpy.count(), 4); QCOMPARE(playListFinishedSpy.count(), 1); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, - QStringLiteral("track2"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, + QStringLiteral("track2"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.removeRow(0); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testBringUpAndDownCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.removeRow(0); QCOMPARE(currentTrackChangedSpy.count(), 2); QCOMPARE(playListFinishedSpy.count(), 1); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex()); } void MediaPlayListProxyModelTest::testBringUpCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, - QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, + QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testBringUpCaseFromNewAlbum() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged); QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(currentTrackChangedSpy.count(), 0); QCOMPARE(playListFinishedSpy.count(), 0); auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); QVERIFY(newTrackID != 0); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, newTrackID}}, QStringLiteral("track1"), {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, newTrackID}}, QStringLiteral("track1"), {}}}, {}, {}); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); } void MediaPlayListProxyModelTest::testSetData() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), 1, 1); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); - myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::IsPlayingRole), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true); QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::SecondaryTextRole), false); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(4, 0), true, MediaPlayList::ColumnsRoles::TitleRole), false); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayListProxyModel.setData({}, true, MediaPlayList::ColumnsRoles::TitleRole), false); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); } void MediaPlayListProxyModelTest::testHasHeader() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.removeRow(2); 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(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderWithRemove() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.removeRow(2); 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(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.removeRow(0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 2); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderMoveFirst() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(0, 3); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderMoveAnother() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(3, 0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderAlbumWithSameTitle() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album3"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"), QStringLiteral("album3"), 9, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fithTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, fithTrackId}}, {}, {}}}, {}, {}); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 5); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 5); QCOMPARE(dataChangedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 5); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 5); auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"), QStringLiteral("album3"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, sixthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, sixthTrackId}}, {}, {}}}, {}, {}); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 6); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 5); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 6); QCOMPARE(dataChangedSpy.wait(), true); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 6); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 6); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 6); } void MediaPlayListProxyModelTest::testHasHeaderMoveFirstLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(0, 3); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderMoveAnotherLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(3, 0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::testHasHeaderYetAnotherMoveLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(0, 2); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 5); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayListProxyModel.moveRow(2, 0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 2); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 2); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(persistentStateChangedSpy.count(), 6); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListProxyModelTest::enqueueFiles() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral("/$1"))}, - {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}}); + {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}}, {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 2); QCOMPARE(dataChangedSpy.wait(300), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2); } void MediaPlayListProxyModelTest::enqueueSampleFiles() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}, - {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}); + {{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}, + {}, {}); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayListProxyModel.rowCount(), 2); while (dataChangedSpy.count() < 2) { QCOMPARE(dataChangedSpy.wait(), true); } 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000); #else QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("")); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1); QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0); #endif } void MediaPlayListProxyModelTest::enqueueEmpty() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {}); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); - myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {}); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); } void MediaPlayListProxyModelTest::testMoveAndShuffle() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); MediaPlayListProxyModel myPlayListProxyModel; myPlayListProxyModel.setPlayListModel(&myPlayList); QAbstractItemModelTester testProxyModel(&myPlayListProxyModel); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted); QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged); QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged); QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList); QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged, Qt::QueuedConnection); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList, Qt::QueuedConnection); connect(&myPlayList, &MediaPlayList::newUrlInList, &myListener, &TracksListener::newUrlInList, Qt::QueuedConnection); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(persistentStateChangedSpy.count(), 0); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 1); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 2); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); - myPlayListProxyModel.enqueue({{{DataTypes::ElementTypeRole, ElisaUtils::Track}, - {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}); + myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, + {DataTypes::DatabaseIdRole, 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(dataChangedSpy.wait(), true); 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(persistentStateChangedSpy.count(), 3); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); myPlayListProxyModel.setShufflePlayList(true); 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(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); myPlayListProxyModel.moveRow(2, 0); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(rowsAboutToBeMovedSpy.count(), 1); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3); QCOMPARE(rowsRemovedSpy.count(), 0); QCOMPARE(rowsMovedSpy.count(), 1); QCOMPARE(rowsInsertedSpy.count(), 3); QCOMPARE(persistentStateChangedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); } QTEST_GUILESS_MAIN(MediaPlayListProxyModelTest) #include "moc_mediaplaylistproxymodeltest.cpp" diff --git a/src/mediaplaylist.cpp b/src/mediaplaylist.cpp index ea1df941..1932727f 100644 --- a/src/mediaplaylist.cpp +++ b/src/mediaplaylist.cpp @@ -1,655 +1,657 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "mediaplaylist.h" #include "playListLogging.h" #include "datatypes.h" #include #include #include #include #include #include #include #include #include #include class MediaPlayListPrivate { public: QList mData; QList mTrackData; }; MediaPlayList::MediaPlayList(QObject *parent) : QAbstractListModel(parent), d(new MediaPlayListPrivate) { } MediaPlayList::~MediaPlayList() = default; int MediaPlayList::rowCount(const QModelIndex &parent) const { if (parent.isValid()) { return 0; } return d->mData.size(); } QHash MediaPlayList::roleNames() const { auto roles = QAbstractItemModel::roleNames(); roles[static_cast(ColumnsRoles::IsValidRole)] = "isValid"; roles[static_cast(ColumnsRoles::DatabaseIdRole)] = "databaseId"; roles[static_cast(ColumnsRoles::TitleRole)] = "title"; roles[static_cast(ColumnsRoles::StringDurationRole)] = "duration"; roles[static_cast(ColumnsRoles::ArtistRole)] = "artist"; roles[static_cast(ColumnsRoles::AlbumArtistRole)] = "albumArtist"; roles[static_cast(ColumnsRoles::AlbumRole)] = "album"; roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; roles[static_cast(ColumnsRoles::GenreRole)] = "genre"; roles[static_cast(ColumnsRoles::LyricistRole)] = "lyricist"; roles[static_cast(ColumnsRoles::ComposerRole)] = "composer"; roles[static_cast(ColumnsRoles::CommentRole)] = "comment"; roles[static_cast(ColumnsRoles::YearRole)] = "year"; roles[static_cast(ColumnsRoles::ChannelsRole)] = "channels"; roles[static_cast(ColumnsRoles::BitRateRole)] = "bitRate"; roles[static_cast(ColumnsRoles::SampleRateRole)] = "sampleRate"; roles[static_cast(ColumnsRoles::CountRole)] = "count"; roles[static_cast(ColumnsRoles::IsPlayingRole)] = "isPlaying"; roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; roles[static_cast(ColumnsRoles::ShadowForImageRole)] = "shadowForImage"; roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; roles[static_cast(ColumnsRoles::FullDataRole)] = "trackData"; roles[static_cast(ColumnsRoles::AlbumIdRole)] = "albumId"; roles[static_cast(ColumnsRoles::AlbumSectionRole)] = "albumSection"; roles[static_cast(ColumnsRoles::ElementTypeRole)] = "entryType"; return roles; } QVariant MediaPlayList::data(const QModelIndex &index, int role) const { auto result = QVariant(); if (!index.isValid()) { return result; } if (d->mData[index.row()].mIsValid) { switch(role) { case ColumnsRoles::IsValidRole: result = d->mData[index.row()].mIsValid; break; case ColumnsRoles::IsPlayingRole: result = d->mData[index.row()].mIsPlaying; break; case ColumnsRoles::ElementTypeRole: result = QVariant::fromValue(d->mData[index.row()].mEntryType); break; case ColumnsRoles::StringDurationRole: { QTime trackDuration = d->mTrackData[index.row()][TrackDataType::key_type::DurationRole].toTime(); if (trackDuration.hour() == 0) { result = trackDuration.toString(QStringLiteral("mm:ss")); } else { result = trackDuration.toString(); } break; } case ColumnsRoles::AlbumSectionRole: result = QJsonDocument{QJsonArray{d->mTrackData[index.row()][TrackDataType::key_type::AlbumRole].toString(), d->mTrackData[index.row()][TrackDataType::key_type::AlbumArtistRole].toString(), d->mTrackData[index.row()][TrackDataType::key_type::ImageUrlRole].toUrl().toString()}}.toJson(); break; case ColumnsRoles::TitleRole: { const auto &trackData = d->mTrackData[index.row()]; auto titleData = trackData[TrackDataType::key_type::TitleRole]; if (titleData.toString().isEmpty()) { result = trackData[TrackDataType::key_type::ResourceRole].toUrl().fileName(); } else { result = titleData; } break; } default: const auto &trackData = d->mTrackData[index.row()]; auto roleEnum = static_cast(role); auto itData = trackData.find(roleEnum); if (itData != trackData.end()) { result = itData.value(); } else { result = {}; } } } else { switch(role) { case ColumnsRoles::IsValidRole: result = d->mData[index.row()].mIsValid; break; case ColumnsRoles::TitleRole: result = d->mData[index.row()].mTitle; break; case ColumnsRoles::IsPlayingRole: result = d->mData[index.row()].mIsPlaying; break; case ColumnsRoles::ArtistRole: result = d->mData[index.row()].mArtist; break; case ColumnsRoles::AlbumArtistRole: result = d->mData[index.row()].mArtist; break; case ColumnsRoles::AlbumRole: result = d->mData[index.row()].mAlbum; break; case ColumnsRoles::TrackNumberRole: result = -1; break; case ColumnsRoles::IsSingleDiscAlbumRole: result = false; break; case Qt::DisplayRole: result = d->mData[index.row()].mTitle; break; case ColumnsRoles::ImageUrlRole: result = QUrl(QStringLiteral("image://icon/error")); break; case ColumnsRoles::ShadowForImageRole: result = false; break; case ColumnsRoles::AlbumSectionRole: result = QJsonDocument{QJsonArray{d->mData[index.row()].mAlbum.toString(), d->mData[index.row()].mArtist.toString(), QUrl(QStringLiteral("image://icon/error")).toString()}}.toJson(); break; default: result = {}; } } return result; } bool MediaPlayList::setData(const QModelIndex &index, const QVariant &value, int role) { bool modelModified = false; if (!index.isValid()) { return modelModified; } if (index.row() < 0 || index.row() >= d->mData.size()) { return modelModified; } if (role < ColumnsRoles::IsValidRole || role > ColumnsRoles::IsPlayingRole) { return modelModified; } auto convertedRole = static_cast(role); switch(convertedRole) { case ColumnsRoles::IsPlayingRole: { modelModified = true; auto newState = static_cast(value.toInt()); d->mData[index.row()].mIsPlaying = newState; Q_EMIT dataChanged(index, index, {role}); break; } case ColumnsRoles::TitleRole: { modelModified = true; d->mData[index.row()].mTitle = value; d->mTrackData[index.row()][static_cast(role)] = value; Q_EMIT dataChanged(index, index, {role}); break; } case ColumnsRoles::ArtistRole: { modelModified = true; d->mData[index.row()].mArtist = value; d->mTrackData[index.row()][static_cast(role)] = value; Q_EMIT dataChanged(index, index, {role}); break; } default: modelModified = false; } return modelModified; } bool MediaPlayList::removeRows(int row, int count, const QModelIndex &parent) { beginRemoveRows(parent, row, row + count - 1); for (int i = row, cpt = 0; cpt < count; ++i, ++cpt) { d->mData.removeAt(i); d->mTrackData.removeAt(i); } endRemoveRows(); return true; } bool MediaPlayList::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) { if (sourceParent != destinationParent) { return false; } if (!beginMoveRows(sourceParent, sourceRow, sourceRow + count - 1, destinationParent, destinationChild)) { return false; } for (auto cptItem = 0; cptItem < count; ++cptItem) { if (sourceRow < destinationChild) { d->mData.move(sourceRow, destinationChild - 1); d->mTrackData.move(sourceRow, destinationChild - 1); } else { d->mData.move(sourceRow, destinationChild); d->mTrackData.move(sourceRow, destinationChild); } } endMoveRows(); return true; } void MediaPlayList::enqueueRestoredEntries(const QVariantList &newEntries) { if (newEntries.isEmpty()) { return; } beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size() + newEntries.size() - 1); for (auto &oneData : newEntries) { auto trackData = oneData.toStringList(); if (trackData.size() != 7) { continue; } auto restoredId = trackData[0].toULongLong(); auto restoredTitle = trackData[1]; auto restoredArtist = trackData[2]; auto restoredAlbum = trackData[3]; auto restoredTrackNumber = trackData[4]; auto restoredDiscNumber = trackData[5]; auto mEntryType = static_cast(trackData[6].toInt()); auto newEntry = MediaPlayListEntry({restoredId, restoredTitle, restoredArtist, restoredAlbum, restoredTrackNumber, restoredDiscNumber, mEntryType}); d->mData.push_back(newEntry); d->mTrackData.push_back({}); if (!newEntry.mIsValid) { if (newEntry.mEntryType == ElisaUtils::Radio) { Q_EMIT newEntryInList(newEntry.mId, {}, ElisaUtils::Radio); } else if (newEntry.mTrackUrl.isValid()) { auto entryURL = newEntry.mTrackUrl.toUrl(); if (entryURL.isLocalFile()) { auto entryString = entryURL.toLocalFile(); QFileInfo newTrackFile(entryString); if (newTrackFile.exists()) { d->mData.last().mIsValid = true; } Q_EMIT newEntryInList(0, entryString, ElisaUtils::FileName); } } else { Q_EMIT newTrackByNameInList(newEntry.mTitle, newEntry.mArtist, newEntry.mAlbum, newEntry.mTrackNumber, newEntry.mDiscNumber); } } else { Q_EMIT newEntryInList(newEntry.mId, {}, ElisaUtils::Track); } } endInsertRows(); } void MediaPlayList::enqueueFilesList(const DataTypes::EntryDataList &newEntries) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueFilesList"; beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size() + newEntries.size() - 1); for (const auto &oneTrackUrl : newEntries) { const auto &trackUrl = std::get<2>(oneTrackUrl); auto newEntry = MediaPlayListEntry(trackUrl); newEntry.mEntryType = ElisaUtils::FileName; d->mData.push_back(newEntry); if (trackUrl.isValid()) { if (trackUrl.isLocalFile()) { d->mTrackData.push_back({{DataTypes::ColumnsRoles::ResourceRole, trackUrl}}); auto entryString = trackUrl.toLocalFile(); QFileInfo newTrackFile(entryString); if (newTrackFile.exists()) { d->mData.last().mIsValid = true; } } else { d->mTrackData.push_back({{DataTypes::ColumnsRoles::ResourceRole, trackUrl}, {DataTypes::ColumnsRoles::TitleRole, trackUrl.fileName()}}); d->mData.last().mIsValid = true; } Q_EMIT newUrlInList(trackUrl, newEntry.mEntryType); } else { d->mTrackData.push_back({}); } } endInsertRows(); } void MediaPlayList::enqueueOneEntry(const DataTypes::EntryData &entryData) { if (!std::get<0>(entryData).isEmpty() || !std::get<1>(entryData).isEmpty() || !std::get<2>(entryData).isEmpty()) { beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size()); if (!std::get<0>(entryData).databaseId() && std::get<2>(entryData).isValid()) { auto newEntry = MediaPlayListEntry{std::get<2>(entryData)}; newEntry.mEntryType = ElisaUtils::FileName; d->mData.push_back(std::move(newEntry)); d->mTrackData.push_back({}); } else { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueOneEntry" << std::get<0>(entryData) << std::get<1>(entryData) << std::get<0>(entryData).elementType(); d->mData.push_back(MediaPlayListEntry{std::get<0>(entryData).databaseId(), std::get<1>(entryData), std::get<0>(entryData).elementType()}); const auto &data = std::get<0>(entryData); switch (data.elementType()) { case ElisaUtils::Track: case ElisaUtils::Radio: d->mTrackData.push_back(static_cast(data)); break; default: d->mTrackData.push_back({}); } } if (std::get<2>(entryData).isValid()) { Q_EMIT newUrlInList(std::get<2>(entryData), std::get<0>(entryData).elementType()); } else { Q_EMIT newEntryInList(std::get<0>(entryData).databaseId(), std::get<1>(entryData), std::get<0>(entryData).elementType()); } endInsertRows(); } } void MediaPlayList::enqueueMultipleEntries(const DataTypes::EntryDataList &entriesData) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueMultipleEntries" << entriesData.size(); beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size() + entriesData.size() - 1); for (const auto &entryData : entriesData) { if (!std::get<0>(entryData).databaseId() && std::get<2>(entryData).isValid()) { - d->mData.push_back(MediaPlayListEntry{std::get<2>(entryData)}); + auto newEntry = MediaPlayListEntry{std::get<2>(entryData)}; + newEntry.mEntryType = ElisaUtils::FileName; + d->mData.push_back(std::move(newEntry)); d->mTrackData.push_back({}); } else { d->mData.push_back(MediaPlayListEntry{std::get<0>(entryData).databaseId(), std::get<1>(entryData), std::get<0>(entryData).elementType()}); const auto &data = std::get<0>(entryData); switch (data.elementType()) { case ElisaUtils::Track: case ElisaUtils::Radio: d->mTrackData.push_back(static_cast(data)); break; default: d->mTrackData.push_back({}); } } if (std::get<2>(entryData).isValid()) { Q_EMIT newUrlInList(std::get<2>(entryData), std::get<0>(entryData).elementType()); } else { Q_EMIT newEntryInList(std::get<0>(entryData).databaseId(), std::get<1>(entryData), std::get<0>(entryData).elementType()); } } endInsertRows(); } void MediaPlayList::clearPlayList() { if (d->mData.isEmpty()) { return; } beginRemoveRows({}, 0, d->mData.count() - 1); d->mData.clear(); d->mTrackData.clear(); endRemoveRows(); } QVariantList MediaPlayList::getEntriesForRestore() const { QVariantList result; for (int trackIndex = 0; trackIndex < d->mData.size(); ++trackIndex) { QStringList oneData; const auto &oneEntry = d->mData[trackIndex]; if (oneEntry.mIsValid) { const auto &oneTrack = d->mTrackData[trackIndex]; oneData.push_back(QString::number(oneTrack.databaseId())); oneData.push_back(oneTrack.title()); oneData.push_back(oneTrack.artist()); if (oneTrack.hasAlbum()) { oneData.push_back(oneTrack.album()); } else { oneData.push_back({}); } if (oneTrack.hasTrackNumber()) { oneData.push_back(QString::number(oneTrack.trackNumber())); } else { oneData.push_back({}); } if (oneTrack.hasDiscNumber()) { oneData.push_back(QString::number(oneTrack.discNumber())); } else { oneData.push_back({}); } oneData.push_back(QString::number(oneEntry.mEntryType)); result.push_back(QVariant(oneData)); } } return result; } void MediaPlayList::tracksListAdded(qulonglong newDatabaseId, const QString &entryTitle, ElisaUtils::PlayListEntryType databaseIdType, const ListTrackDataType &tracks) { if (tracks.isEmpty()) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::tracksListAdded" << " empty tracks list"; return; } for (int playListIndex = 0; playListIndex < d->mData.size(); ++playListIndex) { auto &oneEntry = d->mData[playListIndex]; if (oneEntry.mEntryType != databaseIdType) { continue; } if (oneEntry.mTitle != entryTitle) { continue; } if (newDatabaseId != 0 && oneEntry.mId != newDatabaseId) { continue; } beginRemoveRows(QModelIndex(),playListIndex,playListIndex); d->mData.removeAt(playListIndex); d->mTrackData.removeAt(playListIndex); endRemoveRows(); beginInsertRows(QModelIndex(), playListIndex, playListIndex - 1 + tracks.size()); for (int trackIndex = 0; trackIndex < tracks.size(); ++trackIndex) { auto newEntry = MediaPlayListEntry{tracks[trackIndex]}; newEntry.mEntryType = ElisaUtils::Track; d->mData.insert(playListIndex + trackIndex, newEntry); d->mTrackData.insert(playListIndex + trackIndex, tracks[trackIndex]); } endInsertRows(); } } void MediaPlayList::trackChanged(const TrackDataType &track) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::trackChanged" << track[DataTypes::TitleRole]; for (int i = 0; i < d->mData.size(); ++i) { auto &oneEntry = d->mData[i]; if (oneEntry.mEntryType != ElisaUtils::Artist && oneEntry.mIsValid) { if (oneEntry.mTrackUrl.toUrl().isValid() && track.resourceURI() != oneEntry.mTrackUrl.toUrl()) { continue; } if (!oneEntry.mTrackUrl.toUrl().isValid() && (oneEntry.mId == 0 || track.databaseId() != oneEntry.mId)) { continue; } const auto &trackData = d->mTrackData[i]; if (!trackData.empty()) { bool sameData = true; for (auto oneKeyIterator = track.constKeyValueBegin(); oneKeyIterator != track.constKeyValueEnd(); ++oneKeyIterator) { if (trackData[(*oneKeyIterator).first] != (*oneKeyIterator).second) { sameData = false; break; } } if (sameData) { continue; } } d->mTrackData[i] = track; Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); continue; } else if (oneEntry.mEntryType == ElisaUtils::Radio ) { if (track.databaseId() != oneEntry.mId) { continue; } d->mTrackData[i] = track; oneEntry.mId = track.databaseId(); oneEntry.mIsValid = true; Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); break; } else if (oneEntry.mEntryType != ElisaUtils::Artist && !oneEntry.mIsValid && !oneEntry.mTrackUrl.isValid()) { if (track.find(TrackDataType::key_type::TitleRole) != track.end() && track.title() != oneEntry.mTitle) { continue; } if (track.find(TrackDataType::key_type::AlbumRole) != track.end() && track.album() != oneEntry.mAlbum) { continue; } if (track.find(TrackDataType::key_type::TrackNumberRole) != track.end() && track.trackNumber() != oneEntry.mTrackNumber) { continue; } if (track.find(TrackDataType::key_type::DiscNumberRole) != track.end() && track.discNumber() != oneEntry.mDiscNumber) { continue; } d->mTrackData[i] = track; oneEntry.mId = track.databaseId(); oneEntry.mIsValid = true; Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); break; } else if (oneEntry.mEntryType != ElisaUtils::Artist && !oneEntry.mIsValid && oneEntry.mTrackUrl.isValid()) { if (track.resourceURI() != oneEntry.mTrackUrl) { continue; } d->mTrackData[i] = track; oneEntry.mId = track.databaseId(); oneEntry.mIsValid = true; Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); break; } } } void MediaPlayList::trackRemoved(qulonglong trackId) { for (int i = 0; i < d->mData.size(); ++i) { auto &oneEntry = d->mData[i]; if (oneEntry.mIsValid) { if (oneEntry.mId == trackId) { oneEntry.mIsValid = false; oneEntry.mTitle = d->mTrackData[i].title(); oneEntry.mArtist = d->mTrackData[i].artist(); oneEntry.mAlbum = d->mTrackData[i].album(); oneEntry.mTrackNumber = d->mTrackData[i].trackNumber(); oneEntry.mDiscNumber = d->mTrackData[i].discNumber(); Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); } } } } void MediaPlayList::trackInError(const QUrl &sourceInError, QMediaPlayer::Error playerError) { Q_UNUSED(playerError) for (int i = 0; i < d->mData.size(); ++i) { auto &oneTrack = d->mData[i]; if (oneTrack.mIsValid) { const auto &oneTrackData = d->mTrackData.at(i); if (oneTrackData.resourceURI() == sourceInError) { oneTrack.mIsValid = false; Q_EMIT dataChanged(index(i, 0), index(i, 0), {ColumnsRoles::IsValidRole}); } } } } QDebug operator<<(const QDebug &stream, const MediaPlayListEntry &data) { stream << data.mTitle << data.mAlbum << data.mArtist << data.mTrackUrl << data.mTrackNumber << data.mDiscNumber << data.mId << data.mIsValid; return stream; } #include "moc_mediaplaylist.cpp" diff --git a/src/mediaplaylistproxymodel.cpp b/src/mediaplaylistproxymodel.cpp index 3b8b51ae..198e04a4 100644 --- a/src/mediaplaylistproxymodel.cpp +++ b/src/mediaplaylistproxymodel.cpp @@ -1,831 +1,808 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-FileCopyrightText: 2019 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "mediaplaylistproxymodel.h" #include "mediaplaylist.h" #include "playListLogging.h" #include #include #include #include #include #include #include #include #include class MediaPlayListProxyModelPrivate { public: MediaPlayList* mPlayListModel; QPersistentModelIndex mPreviousTrack; QPersistentModelIndex mCurrentTrack; QPersistentModelIndex mNextTrack; QMediaPlaylist mLoadPlaylist; QList mRandomMapping; QVariantMap mPersistentSettingsForUndo; QRandomGenerator mRandomGenerator; QMimeDatabase mMimeDb; ElisaUtils::PlayListEnqueueTriggerPlay mTriggerPlay = ElisaUtils::DoNotTriggerPlay; int mCurrentPlayListPosition = -1; bool mRepeatPlay = false; bool mShufflePlayList = false; }; MediaPlayListProxyModel::MediaPlayListProxyModel(QObject *parent) : QAbstractProxyModel (parent), d(std::make_unique()) { connect(&d->mLoadPlaylist, &QMediaPlaylist::loaded, this, &MediaPlayListProxyModel::loadPlayListLoaded); connect(&d->mLoadPlaylist, &QMediaPlaylist::loadFailed, this, &MediaPlayListProxyModel::loadPlayListLoadFailed); d->mRandomGenerator.seed(static_cast(QTime::currentTime().msec())); } MediaPlayListProxyModel::~MediaPlayListProxyModel() =default; QModelIndex MediaPlayListProxyModel::index(int row, int column, const QModelIndex &parent) const { if (row < 0 || column < 0 || row > rowCount() - 1) { return QModelIndex(); } return createIndex(row, column); Q_UNUSED(parent); } QModelIndex MediaPlayListProxyModel::mapFromSource(const QModelIndex &sourceIndex) const { if (!sourceIndex.isValid()) { return QModelIndex(); } return d->mPlayListModel->index(mapRowFromSource(sourceIndex.row()), sourceIndex.column()); } QItemSelection MediaPlayListProxyModel::mapSelectionFromSource(const QItemSelection &sourceSelection) const { QItemSelection proxySelection; for (const QItemSelectionRange &range : sourceSelection) { QModelIndex proxyTopLeft = mapFromSource(range.topLeft()); QModelIndex proxyBottomRight = mapFromSource(range.bottomRight()); proxySelection.append(QItemSelectionRange(proxyTopLeft, proxyBottomRight)); } return proxySelection; } QItemSelection MediaPlayListProxyModel::mapSelectionToSource(const QItemSelection &proxySelection) const { QItemSelection sourceSelection; for (const QItemSelectionRange &range : proxySelection) { QModelIndex sourceTopLeft = mapToSource(range.topLeft()); QModelIndex sourceBottomRight = mapToSource(range.bottomRight()); sourceSelection.append(QItemSelectionRange(sourceTopLeft, sourceBottomRight)); } return sourceSelection; } QModelIndex MediaPlayListProxyModel::mapToSource(const QModelIndex &proxyIndex) const { if (!proxyIndex.isValid()) { return QModelIndex(); } return d->mPlayListModel->index(mapRowToSource(proxyIndex.row()), proxyIndex.column()); } int MediaPlayListProxyModel::mapRowToSource(const int proxyRow) const { if (d->mShufflePlayList) { return d->mRandomMapping.at(proxyRow); } else { return proxyRow; } } int MediaPlayListProxyModel::mapRowFromSource(const int sourceRow) const { if (d->mShufflePlayList) { return d->mRandomMapping.indexOf(sourceRow); } else { return sourceRow; } } int MediaPlayListProxyModel::rowCount(const QModelIndex &parent) const { if (d->mShufflePlayList) { if (parent.isValid()) { return 0; } return d->mRandomMapping.count(); } else { return d->mPlayListModel->rowCount(parent); } } int MediaPlayListProxyModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } QModelIndex MediaPlayListProxyModel::parent(const QModelIndex &child) const { Q_UNUSED(child); return QModelIndex(); } bool MediaPlayListProxyModel::hasChildren(const QModelIndex &parent) const { return (!parent.isValid()) ? false : (rowCount() > 0); } void MediaPlayListProxyModel::setPlayListModel(MediaPlayList *playListModel) { if (d->mPlayListModel) { disconnect(playListModel, &QAbstractItemModel::rowsAboutToBeInserted, this, &MediaPlayListProxyModel::sourceRowsAboutToBeInserted); disconnect(playListModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &MediaPlayListProxyModel::sourceRowsAboutToBeRemoved); disconnect(playListModel, &QAbstractItemModel::rowsAboutToBeMoved, this, &MediaPlayListProxyModel::sourceRowsAboutToBeMoved); disconnect(playListModel, &QAbstractItemModel::rowsInserted, this, &MediaPlayListProxyModel::sourceRowsInserted); disconnect(playListModel, &QAbstractItemModel::rowsRemoved, this, &MediaPlayListProxyModel::sourceRowsRemoved); disconnect(playListModel, &QAbstractItemModel::rowsMoved, this, &MediaPlayListProxyModel::sourceRowsMoved); disconnect(playListModel, &QAbstractItemModel::dataChanged, this, &MediaPlayListProxyModel::sourceDataChanged); disconnect(playListModel, &QAbstractItemModel::headerDataChanged, this, &MediaPlayListProxyModel::sourceHeaderDataChanged); disconnect(playListModel, &QAbstractItemModel::layoutAboutToBeChanged, this, &MediaPlayListProxyModel::sourceLayoutAboutToBeChanged); disconnect(playListModel, &QAbstractItemModel::layoutChanged, this, &MediaPlayListProxyModel::sourceLayoutChanged); disconnect(playListModel, &QAbstractItemModel::modelAboutToBeReset, this, &MediaPlayListProxyModel::sourceModelAboutToBeReset); disconnect(playListModel, &QAbstractItemModel::modelReset, this, &MediaPlayListProxyModel::sourceModelReset); } d->mPlayListModel = playListModel; setSourceModel(playListModel); if (d->mPlayListModel) { connect(playListModel, &QAbstractItemModel::rowsAboutToBeInserted, this, &MediaPlayListProxyModel::sourceRowsAboutToBeInserted); connect(playListModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &MediaPlayListProxyModel::sourceRowsAboutToBeRemoved); connect(playListModel, &QAbstractItemModel::rowsAboutToBeMoved, this, &MediaPlayListProxyModel::sourceRowsAboutToBeMoved); connect(playListModel, &QAbstractItemModel::rowsInserted, this, &MediaPlayListProxyModel::sourceRowsInserted); connect(playListModel, &QAbstractItemModel::rowsRemoved, this, &MediaPlayListProxyModel::sourceRowsRemoved); connect(playListModel, &QAbstractItemModel::rowsMoved, this, &MediaPlayListProxyModel::sourceRowsMoved); connect(playListModel, &QAbstractItemModel::dataChanged, this, &MediaPlayListProxyModel::sourceDataChanged); connect(playListModel, &QAbstractItemModel::headerDataChanged, this, &MediaPlayListProxyModel::sourceHeaderDataChanged); connect(playListModel, &QAbstractItemModel::layoutAboutToBeChanged, this, &MediaPlayListProxyModel::sourceLayoutAboutToBeChanged); connect(playListModel, &QAbstractItemModel::layoutChanged, this, &MediaPlayListProxyModel::sourceLayoutChanged); connect(playListModel, &QAbstractItemModel::modelAboutToBeReset, this, &MediaPlayListProxyModel::sourceModelAboutToBeReset); connect(playListModel, &QAbstractItemModel::modelReset, this, &MediaPlayListProxyModel::sourceModelReset); } } void MediaPlayListProxyModel::setSourceModel(QAbstractItemModel *sourceModel) { QAbstractProxyModel::setSourceModel(sourceModel); } QPersistentModelIndex MediaPlayListProxyModel::previousTrack() const { return d->mPreviousTrack; } QPersistentModelIndex MediaPlayListProxyModel::currentTrack() const { return d->mCurrentTrack; } QPersistentModelIndex MediaPlayListProxyModel::nextTrack() const { return d->mNextTrack; } void MediaPlayListProxyModel::setRepeatPlay(const bool value) { if (d->mRepeatPlay != value) { d->mRepeatPlay = value; Q_EMIT repeatPlayChanged(); Q_EMIT remainingTracksChanged(); Q_EMIT persistentStateChanged(); determineAndNotifyPreviousAndNextTracks(); } } bool MediaPlayListProxyModel::repeatPlay() const { return d->mRepeatPlay; } void MediaPlayListProxyModel::setShufflePlayList(const bool value) { if (d->mShufflePlayList != value) { Q_EMIT layoutAboutToBeChanged(QList(), QAbstractItemModel::VerticalSortHint); auto playListSize = d->mPlayListModel->rowCount(); if (playListSize != 0) { if (value) { d->mRandomMapping.clear(); d->mRandomMapping.reserve(playListSize); QModelIndexList to; to.reserve(playListSize); for (int i = 0; i < playListSize; ++i) { to.append(index(i,0)); d->mRandomMapping.append(i); } QModelIndexList from; from.reserve(playListSize); // Fisher-Yates algorithm for (int i = 0; i < playListSize - 1; ++i) { const int swapIndex = d->mRandomGenerator.bounded(i, playListSize); std::swap(d->mRandomMapping[i], d->mRandomMapping[swapIndex]); from.append(index(d->mRandomMapping.at(i), 0)); } from.append(index(d->mRandomMapping.at(playListSize - 1), 0)); changePersistentIndexList(from, to); } else { QModelIndexList from; from.reserve(playListSize); QModelIndexList to; to.reserve(playListSize); for (int i = 0; i < playListSize; ++i) { to.append(index(d->mRandomMapping.at(i), 0)); from.append(index(i, 0)); } changePersistentIndexList(from, to); d->mRandomMapping.clear(); } d->mCurrentPlayListPosition = d->mCurrentTrack.row(); d->mShufflePlayList = value; Q_EMIT layoutChanged(QList(), QAbstractItemModel::VerticalSortHint); determineAndNotifyPreviousAndNextTracks(); } else { d->mShufflePlayList = value; } Q_EMIT shufflePlayListChanged(); Q_EMIT remainingTracksChanged(); Q_EMIT persistentStateChanged(); } } bool MediaPlayListProxyModel::shufflePlayList() const { return d->mShufflePlayList; } void MediaPlayListProxyModel::sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end) { /* * When in random mode, rows are only inserted after * the source model is done inserting new items since * new items can be added at arbitrarily positions, * which requires a split of beginInsertRows */ if (!d->mShufflePlayList) { beginInsertRows(parent, start, end); } } void MediaPlayListProxyModel::sourceRowsInserted(const QModelIndex &parent, int start, int end) { if (d->mShufflePlayList) { const auto newItemsCount = end - start + 1; d->mRandomMapping.reserve(rowCount() + newItemsCount); if (rowCount() == 0 || newItemsCount == 1) { beginInsertRows(parent, start, end); for (int i = 0; i < newItemsCount; ++i) { //QRandomGenerator.bounded(int) is exclusive, thus + 1 const auto random = d->mRandomGenerator.bounded(d->mRandomMapping.count()+1); d->mRandomMapping.insert(random, start + i); } endInsertRows(); } else { for (int i = 0; i < newItemsCount; ++i) { //QRandomGenerator.bounded(int) is exclusive, thus + 1 const auto random = d->mRandomGenerator.bounded(d->mRandomMapping.count()+1); beginInsertRows(parent, random, random); d->mRandomMapping.insert(random, start + i); endInsertRows(); } } } else { endInsertRows(); } determineTracks(); Q_EMIT tracksCountChanged(); Q_EMIT remainingTracksChanged(); Q_EMIT persistentStateChanged(); } void MediaPlayListProxyModel::sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { if (d->mShufflePlayList) { if (end - start + 1 == rowCount()) { beginRemoveRows(parent, start, end); d->mRandomMapping.clear(); endRemoveRows(); } int row = 0; auto it = d->mRandomMapping.begin(); while (it != d->mRandomMapping.end()) { if (*it >= start && *it <= end){ beginRemoveRows(parent, row, row); it = d->mRandomMapping.erase(it); endRemoveRows(); } else { if (*it > end) { *it = *it - end + start - 1; } it++; row++; } } } else { beginRemoveRows(parent, start, end); } } void MediaPlayListProxyModel::sourceRowsRemoved(const QModelIndex &parent, int start, int end) { Q_UNUSED(parent); Q_UNUSED(start); Q_UNUSED(end); if (!d->mShufflePlayList) { endRemoveRows(); } if (!d->mCurrentTrack.isValid()) { d->mCurrentTrack = index(d->mCurrentPlayListPosition, 0); if (d->mCurrentTrack.isValid()) { notifyCurrentTrackChanged(); } if (!d->mCurrentTrack.isValid()) { Q_EMIT playListFinished(); determineTracks(); if (!d->mCurrentTrack.isValid()) { notifyCurrentTrackChanged(); } } } if (!d->mNextTrack.isValid() || !d->mPreviousTrack.isValid()) { determineAndNotifyPreviousAndNextTracks(); } Q_EMIT tracksCountChanged(); Q_EMIT remainingTracksChanged(); Q_EMIT persistentStateChanged(); } void MediaPlayListProxyModel::sourceRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destParent, int destRow) { Q_ASSERT(!d->mShufflePlayList); beginMoveRows(parent, start, end, destParent, destRow); } void MediaPlayListProxyModel::sourceRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destParent, int destRow) { Q_ASSERT(!d->mShufflePlayList); Q_UNUSED(parent); Q_UNUSED(start); Q_UNUSED(end); Q_UNUSED(destParent); Q_UNUSED(destRow); endMoveRows(); Q_EMIT remainingTracksChanged(); Q_EMIT persistentStateChanged(); } void MediaPlayListProxyModel::sourceModelAboutToBeReset() { beginResetModel(); } void MediaPlayListProxyModel::sourceModelReset() { endResetModel(); } void MediaPlayListProxyModel::sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { auto startSourceRow = topLeft.row(); auto endSourceRow = bottomRight.row(); for (int i = startSourceRow; i <= endSourceRow; i++) { Q_EMIT dataChanged(index(mapRowFromSource(i), 0), index(mapRowFromSource(i), 0), roles); if (i == d->mCurrentTrack.row()) { Q_EMIT currentTrackDataChanged(); } else if (i == d->mNextTrack.row()) { Q_EMIT nextTrackDataChanged(); } else if (i == d->mPreviousTrack.row()) { Q_EMIT previousTrackDataChanged(); } determineTracks(); } } void MediaPlayListProxyModel::sourceLayoutAboutToBeChanged() { Q_EMIT layoutAboutToBeChanged(); } void MediaPlayListProxyModel::sourceLayoutChanged() { Q_EMIT layoutChanged(); } void MediaPlayListProxyModel::sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last) { Q_EMIT headerDataChanged(orientation, first, last); } int MediaPlayListProxyModel::remainingTracks() const { if (!d->mCurrentTrack.isValid() || d->mRepeatPlay) { return -1; } else { return rowCount() - d->mCurrentTrack.row() - 1; } } int MediaPlayListProxyModel::tracksCount() const { return rowCount(); } int MediaPlayListProxyModel::currentTrackRow() const { return d->mCurrentTrack.row(); } -void MediaPlayListProxyModel::enqueue(const DataTypes::EntryData &newEntry) -{ - enqueue(newEntry, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::DoNotTriggerPlay); -} - -void MediaPlayListProxyModel::enqueue(const DataTypes::EntryDataList &newEntries) -{ - enqueue(newEntries, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::DoNotTriggerPlay); -} - void MediaPlayListProxyModel::enqueue(qulonglong newEntryDatabaseId, const QString &newEntryTitle, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { - enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, newEntryDatabaseId}}, newEntryTitle, {}}, enqueueMode, triggerPlay); + enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, newEntryDatabaseId}}, newEntryTitle, {}}}, + enqueueMode, triggerPlay); } void MediaPlayListProxyModel::enqueue(const QUrl &entryUrl, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { - enqueue(DataTypes::EntryData{{}, {}, entryUrl}, enqueueMode, triggerPlay); -} - -void MediaPlayListProxyModel::enqueue(const DataTypes::EntryData &newEntry, - ElisaUtils::PlayListEnqueueMode enqueueMode, - ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) -{ - d->mTriggerPlay = triggerPlay; - - if (enqueueMode == ElisaUtils::ReplacePlayList) { - if (rowCount() == 0) { - Q_EMIT hideUndoNotification(); - } else { - clearPlayList(); - } - } - - d->mPlayListModel->enqueueOneEntry(newEntry); + enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, entryUrl}}, enqueueMode, triggerPlay); } void MediaPlayListProxyModel::enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { if (newEntries.isEmpty()) { return; } d->mTriggerPlay = triggerPlay; if (enqueueMode == ElisaUtils::ReplacePlayList) { if (rowCount() == 0) { Q_EMIT hideUndoNotification(); } else { clearPlayList(); } } d->mPlayListModel->enqueueMultipleEntries(newEntries); } void MediaPlayListProxyModel::trackInError(const QUrl &sourceInError, QMediaPlayer::Error playerError) { d->mPlayListModel->trackInError(sourceInError, playerError); } void MediaPlayListProxyModel::skipNextTrack() { if (!d->mCurrentTrack.isValid()) { return; } if (d->mCurrentTrack.row() >= rowCount() - 1) { d->mCurrentTrack = index(0, 0); if (!d->mRepeatPlay) { Q_EMIT playListFinished(); } } else { d->mCurrentTrack = index(d->mCurrentTrack.row() + 1, 0); } notifyCurrentTrackChanged(); } void MediaPlayListProxyModel::skipPreviousTrack() { if (!d->mCurrentTrack.isValid()) { return; } if (d->mCurrentTrack.row() == 0) { if (d->mRepeatPlay) { d->mCurrentTrack = index(rowCount() - 1, 0); } else { return; } } else { d->mCurrentTrack = index(d->mCurrentTrack.row() - 1, 0); } notifyCurrentTrackChanged(); } void MediaPlayListProxyModel::switchTo(int row) { if (!d->mCurrentTrack.isValid()) { return; } d->mCurrentTrack = index(row, 0); notifyCurrentTrackChanged(); } void MediaPlayListProxyModel::removeSelection(QList selection) { std::sort(selection.begin(), selection.end()); std::reverse(selection.begin(), selection.end()); for (auto oneItem : selection) { removeRow(oneItem); } } void MediaPlayListProxyModel::removeRow(int row) { d->mPlayListModel->removeRows(mapRowToSource(row), 1); } void MediaPlayListProxyModel::moveRow(int from, int to) { if (d->mShufflePlayList) { beginMoveRows({}, from, from, {}, from < to ? to + 1 : to); d->mRandomMapping.move(from, to); endMoveRows(); } else { d->mPlayListModel->moveRows({}, from, 1, {}, from < to ? to + 1 : to); } } void MediaPlayListProxyModel::notifyCurrentTrackChanged() { if (d->mCurrentTrack.isValid()) { d->mCurrentPlayListPosition = d->mCurrentTrack.row(); } else { d->mCurrentPlayListPosition = -1; } determineAndNotifyPreviousAndNextTracks(); Q_EMIT currentTrackChanged(d->mCurrentTrack); Q_EMIT currentTrackRowChanged(); Q_EMIT remainingTracksChanged(); } void MediaPlayListProxyModel::determineAndNotifyPreviousAndNextTracks() { if (!d->mCurrentTrack.isValid()) { d->mPreviousTrack = QPersistentModelIndex(); d->mNextTrack = QPersistentModelIndex(); } auto mOldPreviousTrack = d->mPreviousTrack; auto mOldNextTrack = d->mNextTrack; if (d->mRepeatPlay) { // forward to end or begin when repeating if (d->mCurrentTrack.row() == 0) { d->mPreviousTrack = index(rowCount() - 1, 0); } else { d->mPreviousTrack = index(d->mCurrentTrack.row() - 1, 0); } if (d->mCurrentTrack.row() == rowCount() - 1) { d->mNextTrack = index(0, 0); } else { d->mNextTrack = index(d->mCurrentTrack.row() + 1, 0); } } else { // return nothing if no tracks available if (d->mCurrentTrack.row() == 0) { d->mPreviousTrack = QPersistentModelIndex(); } else { d->mPreviousTrack = index(d->mCurrentTrack.row() - 1, 0); } if (d->mCurrentTrack.row() == rowCount() - 1) { d->mNextTrack = QPersistentModelIndex(); } else { d->mNextTrack = index(d->mCurrentTrack.row() + 1, 0); } } if (d->mPreviousTrack != mOldPreviousTrack) { Q_EMIT previousTrackChanged(d->mPreviousTrack); } if (d->mNextTrack != mOldNextTrack) { Q_EMIT nextTrackChanged(d->mNextTrack); } } void MediaPlayListProxyModel::clearPlayList() { if (rowCount() == 0) { return; } d->mPersistentSettingsForUndo = persistentState(); d->mCurrentPlayListPosition = -1; d->mCurrentTrack = QPersistentModelIndex{}; d->mPlayListModel->clearPlayList(); Q_EMIT clearPlayListPlayer(); Q_EMIT displayUndoNotification(); } void MediaPlayListProxyModel::undoClearPlayList() { d->mPlayListModel->clearPlayList(); setPersistentState(d->mPersistentSettingsForUndo); Q_EMIT hideUndoNotification(); Q_EMIT undoClearPlayListPlayer(); } void MediaPlayListProxyModel::determineTracks() { if (!d->mCurrentTrack.isValid()) { for (int row = 0; row < rowCount(); ++row) { auto candidateTrack = index(row, 0); const auto type = candidateTrack.data(MediaPlayList::ElementTypeRole).value(); if (candidateTrack.isValid() && candidateTrack.data(MediaPlayList::IsValidRole).toBool() && (type == ElisaUtils::Track || type == ElisaUtils::Radio || type == ElisaUtils::FileName)) { d->mCurrentTrack = candidateTrack; notifyCurrentTrackChanged(); if (d->mTriggerPlay == ElisaUtils::TriggerPlay) { d->mTriggerPlay = ElisaUtils::DoNotTriggerPlay; Q_EMIT ensurePlay(); } break; } } } if (!d->mNextTrack.isValid() || !d->mPreviousTrack.isValid()) { determineAndNotifyPreviousAndNextTracks(); } } bool MediaPlayListProxyModel::savePlayList(const QUrl &fileName) { QMediaPlaylist savePlaylist; for (int i = 0; i < rowCount(); ++i) { if (data(index(i,0), MediaPlayList::IsValidRole).toBool()) { data(index(i,0), MediaPlayList::ResourceRole).toUrl(); savePlaylist.addMedia(data(index(i,0), MediaPlayList::ResourceRole).toUrl()); } } return savePlaylist.save(fileName, "m3u"); } void MediaPlayListProxyModel::loadPlayList(const QUrl &fileName) { d->mLoadPlaylist.clear(); d->mLoadPlaylist.load(fileName, "m3u"); } void MediaPlayListProxyModel::loadPlayListLoaded() { clearPlayList(); + + auto newTracks = DataTypes::EntryDataList{}; for (int i = 0; i < d->mLoadPlaylist.mediaCount(); ++i) { #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, d->mLoadPlaylist.media(i).canonicalUrl()}); + newTracks.push_back({{{{DataTypes::ElementTypeRole, ElisaUtils::FileName}}}, {}, d->mLoadPlaylist.media(i).canonicalUrl()}); #else - qDebug() << "MediaPlayListProxyModel::loadPlayListLoaded()" << d->mLoadPlaylist.media(i).request().url(); - enqueue(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, d->mLoadPlaylist.media(i).request().url()}); + newTracks.push_back({{{{DataTypes::ElementTypeRole, ElisaUtils::FileName}}}, {}, d->mLoadPlaylist.media(i).request().url()}); #endif } + enqueue(newTracks, ElisaUtils::ReplacePlayList, ElisaUtils::DoNotTriggerPlay); + Q_EMIT persistentStateChanged(); d->mLoadPlaylist.clear(); Q_EMIT playListLoaded(); } void MediaPlayListProxyModel::loadPlayListLoadFailed() { d->mLoadPlaylist.clear(); Q_EMIT playListLoadFailed(); } QVariantMap MediaPlayListProxyModel::persistentState() const { QVariantMap currentState; currentState[QStringLiteral("playList")] = d->mPlayListModel->getEntriesForRestore(); currentState[QStringLiteral("currentTrack")] = d->mCurrentPlayListPosition; currentState[QStringLiteral("shufflePlayList")] = d->mShufflePlayList; currentState[QStringLiteral("repeatPlay")] = d->mRepeatPlay; return currentState; } void MediaPlayListProxyModel::setPersistentState(const QVariantMap &persistentStateValue) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayListProxyModel::setPersistentState" << persistentStateValue; auto playListIt = persistentStateValue.find(QStringLiteral("playList")); if (playListIt != persistentStateValue.end()) { d->mPlayListModel->enqueueRestoredEntries(playListIt.value().toList()); } auto playerCurrentTrack = persistentStateValue.find(QStringLiteral("currentTrack")); if (playerCurrentTrack != persistentStateValue.end()) { auto newIndex = index(playerCurrentTrack->toInt(), 0); if (newIndex.isValid() && (newIndex != d->mCurrentTrack)) { d->mCurrentTrack = newIndex; notifyCurrentTrackChanged(); } } auto shufflePlayListStoredValue = persistentStateValue.find(QStringLiteral("shufflePlayList")); if (shufflePlayListStoredValue != persistentStateValue.end()) { setShufflePlayList(shufflePlayListStoredValue->toBool()); } auto repeatPlayStoredValue = persistentStateValue.find(QStringLiteral("repeatPlay")); if (repeatPlayStoredValue != persistentStateValue.end()) { setRepeatPlay(repeatPlayStoredValue->toBool()); } Q_EMIT persistentStateChanged(); } void MediaPlayListProxyModel::enqueueDirectory(const QUrl &fileName, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay, int depth) { if (!fileName.isLocalFile()) return; // clear playlist if required if (enqueueMode == ElisaUtils::ReplacePlayList) { if (rowCount() == 0) { Q_EMIT hideUndoNotification(); } else { clearPlayList(); } } // get contents of directory QDir dirInfo = QDir(fileName.toLocalFile()); auto files = dirInfo.entryInfoList(QDir::NoDotAndDotDot | QDir::Readable | QDir::Files | QDir::Dirs, QDir::Name); auto newFiles = DataTypes::EntryDataList(); for (auto file : files) { auto fileUrl = QUrl::fromLocalFile(file.filePath()); if (file.isFile() && d->mMimeDb.mimeTypeForUrl(fileUrl).name().startsWith(QLatin1String("audio/"))) { newFiles.append({DataTypes::EntryData{{},{},fileUrl}}); } else if (file.isDir() && depth > 1) { // recurse through directory enqueueDirectory(fileUrl, databaseIdType, ElisaUtils::AppendPlayList, triggerPlay, depth-1); } } if (newFiles.size() != 0) enqueue(newFiles, ElisaUtils::AppendPlayList, triggerPlay); } #include "moc_mediaplaylistproxymodel.cpp" diff --git a/src/mediaplaylistproxymodel.h b/src/mediaplaylistproxymodel.h index 31c5bb2f..2739bea7 100644 --- a/src/mediaplaylistproxymodel.h +++ b/src/mediaplaylistproxymodel.h @@ -1,257 +1,249 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-FileCopyrightText: 2019 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef MEDIAPLAYLISTPROXYMODEL_H #define MEDIAPLAYLISTPROXYMODEL_H #include "elisaLib_export.h" #include "elisautils.h" #include "datatypes.h" #include #include #include class MediaPlayList; class MediaPlayListProxyModelPrivate; class ELISALIB_EXPORT MediaPlayListProxyModel : public QAbstractProxyModel { Q_OBJECT Q_PROPERTY(QVariantMap persistentState READ persistentState WRITE setPersistentState NOTIFY persistentStateChanged) Q_PROPERTY(QPersistentModelIndex previousTrack READ previousTrack NOTIFY previousTrackChanged) Q_PROPERTY(QPersistentModelIndex currentTrack READ currentTrack NOTIFY currentTrackChanged) Q_PROPERTY(QPersistentModelIndex nextTrack READ nextTrack NOTIFY nextTrackChanged) Q_PROPERTY(bool repeatPlay READ repeatPlay WRITE setRepeatPlay NOTIFY repeatPlayChanged) Q_PROPERTY(bool shufflePlayList READ shufflePlayList WRITE setShufflePlayList NOTIFY shufflePlayListChanged) Q_PROPERTY(int remainingTracks READ remainingTracks NOTIFY remainingTracksChanged) Q_PROPERTY(int currentTrackRow READ currentTrackRow NOTIFY currentTrackRowChanged) Q_PROPERTY(int tracksCount READ tracksCount NOTIFY tracksCountChanged) public: explicit MediaPlayListProxyModel(QObject *parent = nullptr); ~MediaPlayListProxyModel() override; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; QItemSelection mapSelectionFromSource(const QItemSelection &sourceSelection) const override; QItemSelection mapSelectionToSource(const QItemSelection &proxySelection) const override; QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; int mapRowFromSource(const int sourceRow) const; int mapRowToSource(const int proxyRow) const; int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent) const override; QModelIndex parent(const QModelIndex &child) const override; bool hasChildren(const QModelIndex &parent) const override; void setPlayListModel(MediaPlayList* playListModel); QPersistentModelIndex previousTrack() const; QPersistentModelIndex currentTrack() const; QPersistentModelIndex nextTrack() const; bool repeatPlay() const; bool shufflePlayList() const; int remainingTracks() const; int currentTrackRow() const; int tracksCount() const; QVariantMap persistentState() const; public Q_SLOTS: - void enqueue(const DataTypes::EntryData &newEntry); - - void enqueue(const DataTypes::EntryDataList &newEntries); - - void enqueue(qulonglong newEntryDatabaseId, const QString &newEntryTitle, - ElisaUtils::PlayListEnqueueMode enqueueMode, - ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); - void enqueue(const QUrl &entryUrl, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); - void enqueue(const DataTypes::EntryData &newEntry, + void enqueue(qulonglong newEntryDatabaseId, const QString &newEntryTitle, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void setRepeatPlay(bool value); void setShufflePlayList(bool value); void trackInError(const QUrl &sourceInError, QMediaPlayer::Error playerError); void skipNextTrack(); void skipPreviousTrack(); void switchTo(int row); void removeSelection(QList selection); void removeRow(int row); void moveRow(int from, int to); void clearPlayList(); void undoClearPlayList(); bool savePlayList(const QUrl &fileName); void loadPlayList(const QUrl &fileName); void setPersistentState(const QVariantMap &persistentState); void enqueueDirectory(const QUrl &fileName, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay, int depth); Q_SIGNALS: void previousTrackChanged(const QPersistentModelIndex &previousTrack); void currentTrackChanged(const QPersistentModelIndex ¤tTrack); void nextTrackChanged(const QPersistentModelIndex &nextTrack); void previousTrackDataChanged(); void currentTrackDataChanged(); void nextTrackDataChanged(); void repeatPlayChanged(); void shufflePlayListChanged(); void remainingTracksChanged(); void ensurePlay(); void currentTrackRowChanged(); void tracksCountChanged(); void playListFinished(); void playListLoaded(); void playListLoadFailed(); void persistentStateChanged(); void clearPlayListPlayer(); void undoClearPlayListPlayer(); void displayUndoNotification(); void hideUndoNotification(); private Q_SLOTS: void sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end); void sourceRowsInserted(const QModelIndex &parent, int start, int end); void sourceRowsAboutToBeRemoved(const QModelIndex &parent, int start, int end); void sourceRowsRemoved(const QModelIndex &parent, int start, int end); void sourceRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destParent, int destRow); void sourceRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destParent, int destRow); void sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles); void sourceHeaderDataChanged(Qt::Orientation orientation, int first, int last); void sourceLayoutAboutToBeChanged(); void sourceLayoutChanged(); void sourceModelAboutToBeReset(); void sourceModelReset(); private Q_SLOTS: void loadPlayListLoaded(); void loadPlayListLoadFailed(); private: void setSourceModel(QAbstractItemModel *sourceModel) override; void determineTracks(); void notifyCurrentTrackChanged(); void determineAndNotifyPreviousAndNextTracks(); std::unique_ptr d; }; #endif // MEDIAPLAYLISTPROXYMODEL_H