diff --git a/autotests/elisaapplicationtest.cpp b/autotests/elisaapplicationtest.cpp index d4125a09..2be69aec 100644 --- a/autotests/elisaapplicationtest.cpp +++ b/autotests/elisaapplicationtest.cpp @@ -1,91 +1,91 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "elisaapplication.h" #include "config-upnp-qt.h" #include #include #include #include #include #include class ElisaApplicationTests: public QObject { Q_OBJECT public: ElisaApplicationTests(QObject *parent = nullptr) : QObject(parent) { } private: private Q_SLOTS: void initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QList"); - qRegisterMetaType("ElisaUtils::EntryDataList"); + qRegisterMetaType("DataTypes::EntryDataList"); qRegisterMetaType("ElisaUtils::PlayListEntryType"); qRegisterMetaType("ElisaUtils::PlayListEnqueueMode"); qRegisterMetaType("ElisaUtils::PlayListEnqueueTriggerPlay"); } void setArgumentsTest() { ElisaApplication myApp; QSignalSpy argumentsChangedSpy(&myApp, &ElisaApplication::argumentsChanged); QSignalSpy enqueueSpy(&myApp, &ElisaApplication::enqueue); auto myTestFile = QFileInfo(QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music/test.ogg")); auto myDirectory = QDir::current(); auto relativePath = myDirectory.relativeFilePath(myTestFile.canonicalFilePath()); myApp.setArguments({{{}, {}, QUrl::fromLocalFile(relativePath)}}); QCOMPARE(argumentsChangedSpy.count(), 1); QCOMPARE(enqueueSpy.count(), 1); QCOMPARE(myApp.arguments().count(), 1); QCOMPARE(std::get<2>(myApp.arguments().at(0)), QUrl::fromLocalFile(myTestFile.canonicalFilePath())); } void activateRequestedTest() { ElisaApplication myApp; QSignalSpy argumentsChangedSpy(&myApp, &ElisaApplication::argumentsChanged); QSignalSpy enqueueSpy(&myApp, &ElisaApplication::enqueue); auto myTestFile = QFileInfo(QStringLiteral(LOCAL_FILE_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/music/test.ogg")); auto myDirectory = QDir::current(); auto relativePath = myDirectory.relativeFilePath(myTestFile.canonicalFilePath()); myApp.activateRequested({QString(), relativePath}, QDir::currentPath()); QCOMPARE(argumentsChangedSpy.count(), 0); QCOMPARE(enqueueSpy.count(), 1); QCOMPARE(enqueueSpy.at(0).count(), 4); - QCOMPARE(std::get<2>(enqueueSpy.at(0).at(0).value().at(0)), QUrl::fromLocalFile(myTestFile.canonicalFilePath())); + QCOMPARE(std::get<2>(enqueueSpy.at(0).at(0).value().at(0)), QUrl::fromLocalFile(myTestFile.canonicalFilePath())); } }; QTEST_MAIN(ElisaApplicationTests) #include "elisaapplicationtest.moc" diff --git a/autotests/mediaplaylistproxymodeltest.cpp b/autotests/mediaplaylistproxymodeltest.cpp index 8d8552e0..b5e79aec 100644 --- a/autotests/mediaplaylistproxymodeltest.cpp +++ b/autotests/mediaplaylistproxymodeltest.cpp @@ -1,7115 +1,7116 @@ /* 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}}, {}, {}}, 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); 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({{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, {{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"))}}, QStringLiteral("album3"), {}}}, ElisaUtils::Album); 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({{}, {}, trackData.resourceURI()}, 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(), 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({{{}, {}, firstTrackData.resourceURI()}, {{}, {}, secondTrackData.resourceURI()}}, 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(), 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}}, {}, {}}, 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}}, {}, {}}, 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, QStringLiteral("album1"), {}}, ElisaUtils::Album, 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModelSave.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModelSave.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModelSave.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, secondTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayList.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayList.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayList.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListSaveProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListSaveProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListSaveProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, QStringLiteral("track4"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, QStringLiteral("track4"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); 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::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}}, QStringLiteral("album1"), {}}, ElisaUtils::Album, 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 1)}}, QStringLiteral("track4"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); 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(ElisaUtils::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist, 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(ElisaUtils::EntryData{{}, QStringLiteral("artist3"), {}}, ElisaUtils::Artist, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{}, QStringLiteral("artist3"), {}}, ElisaUtils::Artist, 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(ElisaUtils::EntryData{{}, QStringLiteral("artist4"), {}}, ElisaUtils::Artist, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{}, QStringLiteral("artist4"), {}}, ElisaUtils::Artist, 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(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, ElisaUtils::Track, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, ElisaUtils::Track, 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(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, ElisaUtils::Track, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, ElisaUtils::Track, 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(ElisaUtils::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist, ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist, 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}}, QStringLiteral("track5"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}}, QStringLiteral("track4"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}}, QStringLiteral("track3"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); QCOMPARE(currentTrackChangedSpy.count(), 1); QCOMPARE(playListFinishedSpy.count(), 0); QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0))); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}}, QStringLiteral("track2"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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::DatabaseIdRole, newTrackID}}, QStringLiteral("track1"), {}}, ElisaUtils::Track); 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(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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::ColumnsRoles::IsPlayingRole).toBool(), false); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayListProxyModel.enqueue(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayListProxyModel.enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fithTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, sixthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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({{{}, {}, QUrl::fromLocalFile(QStringLiteral("/$1"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}}, ElisaUtils::FileName); 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({{{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}, ElisaUtils::FileName); 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(ElisaUtils::EntryDataList{}, ElisaUtils::Track); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::Track); 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(ElisaUtils::EntryDataList{}, ElisaUtils::FileName); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::FileName); 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(ElisaUtils::EntryDataList{}, ElisaUtils::Track, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::Track, 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(ElisaUtils::EntryDataList{}, ElisaUtils::Album, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::Album, 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(ElisaUtils::EntryDataList{}, + myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::Artist, 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::DatabaseIdRole, firstTrackId}}, {}, {}}, 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); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayListProxyModel.enqueue({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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/autotests/mediaplaylisttest.cpp b/autotests/mediaplaylisttest.cpp index ea102760..486b99b5 100644 --- a/autotests/mediaplaylisttest.cpp +++ b/autotests/mediaplaylisttest.cpp @@ -1,3284 +1,3284 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "mediaplaylisttest.h" #include "mediaplaylisttestconfig.h" #include "mediaplaylist.h" #include "databaseinterface.h" #include "trackslistener.h" #include "config-upnp-qt.h" #include #include #include #include #include MediaPlayListTest::MediaPlayListTest(QObject *parent) : QObject(parent) { } void MediaPlayListTest::initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("PlayListEntryType"); } void MediaPlayListTest::simpleInitialCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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(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); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); } void MediaPlayListTest::enqueueAlbumCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); QVERIFY(rowsAboutToBeRemovedSpy.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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); } void MediaPlayListTest::enqueueArtistCase() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); myPlayList.enqueueOneEntry({{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2); } void MediaPlayListTest::enqueueTrackByUrl() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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(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); myPlayList.enqueueFilesList({{{}, {}, trackData.resourceURI()}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 1); } void MediaPlayListTest::enqueueTracksByUrl() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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(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); myPlayList.enqueueFilesList({{{}, {}, firstTrackData.resourceURI()}, {{}, {}, secondTrackData.resourceURI()}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); } void MediaPlayListTest::enqueueFiles() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral("/$1"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}}, ElisaUtils::FileName); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayList.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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2); } void MediaPlayListTest::enqueueSampleFiles() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 0); myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}, ElisaUtils::FileName); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); QCOMPARE(myPlayList.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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(newUrlInListSpy.count(), 2); #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000); #else QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0); #endif } void MediaPlayListTest::enqueueEmpty() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{}, ElisaUtils::Track); 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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{}, ElisaUtils::FileName); + myPlayList.enqueueOneEntry(DataTypes::EntryData{}, ElisaUtils::FileName); 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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{}, ElisaUtils::Track); 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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{}, ElisaUtils::Album); + myPlayList.enqueueOneEntry(DataTypes::EntryData{}, ElisaUtils::Album); 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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{}, ElisaUtils::Artist); + myPlayList.enqueueOneEntry(DataTypes::EntryData{}, ElisaUtils::Artist); 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); } void MediaPlayListTest::removeFirstTrackOfAlbum() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}}, QStringLiteral("album2"), {}}, ElisaUtils::Album); QVERIFY(rowsAboutToBeRemovedSpy.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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); myPlayList.removeRows(0, 1); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); } void MediaPlayListTest::testTrackBeenRemoved() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); 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(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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); } void MediaPlayListTest::testSetData() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), 1, 1); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.setData(myPlayList.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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true); QCOMPARE(myPlayList.setData(myPlayList.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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayList.setData(myPlayList.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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); QCOMPARE(myPlayList.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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); } void MediaPlayListTest::testHasHeader() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.removeRows(2, 1); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::testHasHeaderWithRemove() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.removeRows(2, 1); QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4); QCOMPARE(rowsRemovedSpy.count(), 1); QCOMPARE(rowsMovedSpy.count(), 0); QCOMPARE(rowsInsertedSpy.count(), 4); QCOMPARE(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.removeRows(0, 1); 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::testHasHeaderWithRestore() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore")); 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); myPlayList.enqueueRestoredEntries( QVariantList({QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("1"), QStringLiteral("1"),{}}), QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("1"), QStringLiteral("1"),{}}), QStringList({{},QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("2"), QStringLiteral("1"),{}}), QStringList({{},QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("3"), QStringLiteral("1"),{}}) })); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 4); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); while (dataChangedSpy.count() < 4) { 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 4); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7); } void MediaPlayListTest::testHasHeaderMoveFirst() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 0, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::testHasHeaderMoveAnother() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 3, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::restoreMultipleIdenticalTracks() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore")); 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); myPlayList.enqueueRestoredEntries( QVariantList({QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}), QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}), QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}), QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}) })); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 4); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 4); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3); } void MediaPlayListTest::restoreTrackWithoutAlbum() { QTemporaryFile databaseFile; databaseFile.open(); qDebug() << "restoreTrackWithoutAlbum" << databaseFile.fileName(); MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 0); myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), databaseFile.fileName()); 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); auto newTrack = DataTypes::TrackDataType{}; newTrack[DataTypes::IdRole] = QStringLiteral("$29"); newTrack[DataTypes::ParentIdRole] = QStringLiteral("0"); newTrack[DataTypes::TitleRole] = QStringLiteral("track19"); newTrack[DataTypes::ArtistRole] = QStringLiteral("artist2"); newTrack[DataTypes::DurationRole] = QTime::fromMSecsSinceStartOfDay(29); newTrack[DataTypes::ResourceRole] = QUrl::fromLocalFile(QStringLiteral("/$29")); newTrack[DataTypes::FileModificationTime] = QDateTime::fromMSecsSinceEpoch(29); newTrack[DataTypes::ImageUrlRole] = QUrl::fromLocalFile(QStringLiteral("withoutAlbum")); newTrack[DataTypes::RatingRole] = 9; newTrack[DataTypes::IsSingleDiscAlbumRole] = true; newTrack[DataTypes::GenreRole] = QStringLiteral("genre1"); newTrack[DataTypes::ComposerRole] = QStringLiteral("composer1"); newTrack[DataTypes::LyricistRole] = QStringLiteral("lyricist1"); newTrack[DataTypes::HasEmbeddedCover] = false; myDatabaseContent.insertTracksList({newTrack}, 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); myPlayList.enqueueRestoredEntries(QVariantList({QStringList({QStringLiteral("0"), QStringLiteral("track19"), QStringLiteral("artist2"), {}, {}, {}, QString::number(ElisaUtils::PlayListEntryType::Unknown)})})); 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(dataChangedSpy.count(), 0); QCOMPARE(newTrackByNameInListSpy.count(), 1); QCOMPARE(newEntryInListSpy.count(), 0); 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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 1); QCOMPARE(newEntryInListSpy.count(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track19")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QString()); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 29); } void MediaPlayListTest::testHasHeaderAlbumWithSameTitle() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"), QStringLiteral("album3"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"), QStringLiteral("album3"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album3"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"), QStringLiteral("album3"), 9, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fithTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 5); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 5); auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"), QStringLiteral("album3"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, sixthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 6); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 6); } void MediaPlayListTest::testHasHeaderMoveFirstLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 0, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::crashOnEnqueue() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); CrashEnqueuePlayList myCrash(&myPlayList); connect(&myPlayList, &MediaPlayList::rowsInserted, &myCrash, &CrashEnqueuePlayList::crashMediaPlayList); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); } void MediaPlayListTest::testHasHeaderMoveAnotherLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 3, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } void MediaPlayListTest::testHasHeaderYetAnotherMoveLikeQml() { MediaPlayList myPlayList; QAbstractItemModelTester testModel(&myPlayList); DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); QSignalSpy dataChangedSpy(&myPlayList, &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(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); auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 1); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 1); auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}, 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(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(dataChangedSpy.count(), 2); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 2); auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 3); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 3); auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}, ElisaUtils::Track); 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(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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 0, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); myPlayList.moveRows({}, 2, 1, {}, 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(dataChangedSpy.count(), 4); QCOMPARE(newTrackByNameInListSpy.count(), 0); QCOMPARE(newEntryInListSpy.count(), 4); } CrashEnqueuePlayList::CrashEnqueuePlayList(MediaPlayList *list, QObject *parent) : QObject(parent), mList(list) { } void CrashEnqueuePlayList::crashMediaPlayList() { mList->data(mList->index(0, 0), MediaPlayList::ResourceRole); } QTEST_GUILESS_MAIN(MediaPlayListTest) #include "moc_mediaplaylisttest.cpp" diff --git a/autotests/trackslistenertest.cpp b/autotests/trackslistenertest.cpp index cc3211f1..c8d1f16d 100644 --- a/autotests/trackslistenertest.cpp +++ b/autotests/trackslistenertest.cpp @@ -1,469 +1,469 @@ /* SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "databasetestdata.h" #include "trackslistener.h" #include "mediaplaylist.h" #include "databaseinterface.h" #include "datatypes.h" #include "config-upnp-qt.h" #include #include #include #include #include #include #include #include class TracksListenerTests: public QObject, public DatabaseTestData { Q_OBJECT public: TracksListenerTests(QObject *parent = nullptr) : QObject(parent) { } private Q_SLOTS: void initTestCase() { qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QList"); qRegisterMetaType("ListTrackDataType"); qRegisterMetaType("ListAlbumDataType"); qRegisterMetaType("ListArtistDataType"); qRegisterMetaType("ListGenreDataType"); qRegisterMetaType("TrackDataType"); qRegisterMetaType("AlbumDataType"); qRegisterMetaType("ArtistDataType"); qRegisterMetaType("GenreDataType"); qRegisterMetaType("PlayListEntryType"); } void testTrackRemoval() { MediaPlayList myPlayList; DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy trackHasChangedSpy(&myListener, &TracksListener::trackHasChanged); QSignalSpy trackHasBeenRemovedSpy(&myListener, &TracksListener::trackHasBeenRemoved); QSignalSpy tracksListAddedSpy(&myListener, &TracksListener::tracksListAdded); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myDatabaseContent, &DatabaseInterface::trackRemoved, &myListener, &TracksListener::trackRemoved); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); connect(&myDatabaseContent, &DatabaseInterface::trackModified, &myListener, &TracksListener::trackModified); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged); connect(&myListener, &TracksListener::trackHasBeenRemoved, &myPlayList, &MediaPlayList::trackRemoved); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{}, QStringLiteral("artist1"), {}}, ElisaUtils::Artist); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myDatabaseContent.removeTracksList({QUrl::fromLocalFile(QStringLiteral("/$1"))}); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 1); QCOMPARE(tracksListAddedSpy.count(), 1); QCOMPARE(myPlayList.rowCount(), 6); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3); QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4); QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2")); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5); QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); } void testInsertTrackIdAndRemoval() { MediaPlayList myPlayList; DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy trackHasChangedSpy(&myListener, &TracksListener::trackHasChanged); QSignalSpy trackHasBeenRemovedSpy(&myListener, &TracksListener::trackHasBeenRemoved); QSignalSpy tracksListAddedSpy(&myListener, &TracksListener::tracksListAdded); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myDatabaseContent, &DatabaseInterface::trackRemoved, &myListener, &TracksListener::trackRemoved); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); connect(&myDatabaseContent, &DatabaseInterface::trackModified, &myListener, &TracksListener::trackModified); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged); connect(&myListener, &TracksListener::trackHasBeenRemoved, &myPlayList, &MediaPlayList::trackRemoved); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); auto trackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1); QCOMPARE(trackId != 0, true); - myPlayList.enqueueOneEntry(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, trackId}}, {}, {}}, ElisaUtils::Track); + myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, trackId}}, {}, {}}, ElisaUtils::Track); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myDatabaseContent.removeTracksList({QUrl::fromLocalFile(QStringLiteral("/$1"))}); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 1); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); } void testInsertTrackByNameAndRemoval() { MediaPlayList myPlayList; DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy trackHasChangedSpy(&myListener, &TracksListener::trackHasChanged); QSignalSpy trackHasBeenRemovedSpy(&myListener, &TracksListener::trackHasBeenRemoved); QSignalSpy tracksListAddedSpy(&myListener, &TracksListener::tracksListAdded); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myDatabaseContent, &DatabaseInterface::trackRemoved, &myListener, &TracksListener::trackRemoved); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); connect(&myDatabaseContent, &DatabaseInterface::trackModified, &myListener, &TracksListener::trackModified); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged); connect(&myListener, &TracksListener::trackHasBeenRemoved, &myPlayList, &MediaPlayList::trackRemoved); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, - QStringLiteral("track1"), {}}, - ElisaUtils::Track); + QStringLiteral("track1"), {}}, + ElisaUtils::Track); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myDatabaseContent.removeTracksList({QUrl::fromLocalFile(QStringLiteral("/$1"))}); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 1); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); } void testInsertTrackByNameBeforeDatabaseAndRemoval() { MediaPlayList myPlayList; DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy trackHasChangedSpy(&myListener, &TracksListener::trackHasChanged); QSignalSpy trackHasBeenRemovedSpy(&myListener, &TracksListener::trackHasBeenRemoved); QSignalSpy tracksListAddedSpy(&myListener, &TracksListener::tracksListAdded); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myDatabaseContent, &DatabaseInterface::trackRemoved, &myListener, &TracksListener::trackRemoved); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); connect(&myDatabaseContent, &DatabaseInterface::trackModified, &myListener, &TracksListener::trackModified); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged); connect(&myListener, &TracksListener::trackHasBeenRemoved, &myPlayList, &MediaPlayList::trackRemoved); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myPlayList.enqueueRestoredEntries(QVariantList({QStringList({{}, QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("1"), QStringLiteral("1"), {}})})); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myDatabaseContent.removeTracksList({QUrl::fromLocalFile(QStringLiteral("/$1"))}); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 1); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); } void testInsertTrackByNameModifyAndRemoval() { MediaPlayList myPlayList; DatabaseInterface myDatabaseContent; TracksListener myListener(&myDatabaseContent); QSignalSpy trackHasChangedSpy(&myListener, &TracksListener::trackHasChanged); QSignalSpy trackHasBeenRemovedSpy(&myListener, &TracksListener::trackHasBeenRemoved); QSignalSpy tracksListAddedSpy(&myListener, &TracksListener::tracksListAdded); myDatabaseContent.init(QStringLiteral("testDbDirectContent")); connect(&myDatabaseContent, &DatabaseInterface::trackRemoved, &myListener, &TracksListener::trackRemoved); connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, &myListener, &TracksListener::tracksAdded); connect(&myDatabaseContent, &DatabaseInterface::trackModified, &myListener, &TracksListener::trackModified); connect(&myListener, &TracksListener::trackHasChanged, &myPlayList, &MediaPlayList::trackChanged); connect(&myListener, &TracksListener::trackHasBeenRemoved, &myPlayList, &MediaPlayList::trackRemoved); connect(&myListener, &TracksListener::tracksListAdded, &myPlayList, &MediaPlayList::tracksListAdded); connect(&myPlayList, &MediaPlayList::newEntryInList, &myListener, &TracksListener::newEntryInList); connect(&myPlayList, &MediaPlayList::newTrackByNameInList, &myListener, &TracksListener::trackByNameInList); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myDatabaseContent.insertTracksList(mNewTracks, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 0); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}}, - QStringLiteral("track1"), {}}, - ElisaUtils::Track); + QStringLiteral("track1"), {}}, + ElisaUtils::Track); QCOMPARE(trackHasChangedSpy.count(), 1); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1); myDatabaseContent.insertTracksList({ {true, QStringLiteral("$1"), QStringLiteral("0"), QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("Various Artists"), 2, 3, QTime::fromMSecsSinceStartOfDay(1000), {QUrl::fromLocalFile(QStringLiteral("/$1"))}, QDateTime::fromMSecsSinceEpoch(1), {QUrl::fromLocalFile(QStringLiteral("file://image$1"))}, 1, false, {}, {}, QStringLiteral("lyricist1"), false} }, mNewCovers); QCOMPARE(trackHasChangedSpy.count(), 2); QCOMPARE(trackHasBeenRemovedSpy.count(), 0); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3); myDatabaseContent.removeTracksList({QUrl::fromLocalFile(QStringLiteral("/$1"))}); QCOMPARE(trackHasChangedSpy.count(), 2); QCOMPARE(trackHasBeenRemovedSpy.count(), 1); QCOMPARE(tracksListAddedSpy.count(), 0); QCOMPARE(myPlayList.rowCount(), 1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1")); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1); QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0); } }; QTEST_GUILESS_MAIN(TracksListenerTests) #include "trackslistenertest.moc" diff --git a/src/datatypes.h b/src/datatypes.h index afdb6614..56bd158e 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -1,371 +1,377 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2019 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef DATATYPES_H #define DATATYPES_H #include "elisaLib_export.h" #include #include #include #include #include #include #include class ELISALIB_EXPORT DataTypes : public QObject { Q_OBJECT public: enum ColumnsRoles { TitleRole = Qt::UserRole + 1, SecondaryTextRole, ImageUrlRole, ShadowForImageRole, ChildModelRole, DurationRole, StringDurationRole, ArtistRole, AllArtistsRole, HighestTrackRating, AlbumRole, AlbumArtistRole, IsValidAlbumArtistRole, TrackNumberRole, DiscNumberRole, RatingRole, GenreRole, LyricistRole, ComposerRole, CommentRole, YearRole, ChannelsRole, BitRateRole, SampleRateRole, ResourceRole, IdRole, ParentIdRole, DatabaseIdRole, IsSingleDiscAlbumRole, ContainerDataRole, IsPartialDataRole, AlbumIdRole, HasEmbeddedCover, FileModificationTime, FirstPlayDate, LastPlayDate, PlayCounter, PlayFrequency, ElementTypeRole, LyricsRole, FullDataRole, }; Q_ENUM(ColumnsRoles) private: using DataType = QMap; public: class TrackDataType : public DataType { public: using DataType::DataType; TrackDataType(bool aValid, QString aId, QString aParentId, QString aTitle, QString aArtist, QString aAlbumName, QString aAlbumArtist, int aTrackNumber, int aDiscNumber, QTime aDuration, QUrl aResourceURI, const QDateTime &fileModificationTime, QUrl aAlbumCover, int rating, bool aIsSingleDiscAlbum, QString aGenre, QString aComposer, QString aLyricist, bool aHasEmbeddedCover) : DataType({{key_type::TitleRole, std::move(aTitle)}, {key_type::AlbumRole, std::move(aAlbumName)}, {key_type::ArtistRole, std::move(aArtist)}, {key_type::AlbumArtistRole, std::move(aAlbumArtist)}, {key_type::IdRole, std::move(aId)}, {key_type::ParentIdRole, std::move(aParentId)}, {key_type::TrackNumberRole, aTrackNumber}, {key_type::DiscNumberRole, aDiscNumber}, {key_type::DurationRole, aDuration}, {key_type::ResourceRole, std::move(aResourceURI)}, {key_type::FileModificationTime, fileModificationTime}, {key_type::ImageUrlRole, std::move(aAlbumCover)}, {key_type::RatingRole, rating}, {key_type::IsSingleDiscAlbumRole, aIsSingleDiscAlbum}, {key_type::GenreRole, std::move(aGenre)}, {key_type::ComposerRole, std::move(aComposer)}, {key_type::LyricistRole, std::move(aLyricist)}, {key_type::HasEmbeddedCover, aHasEmbeddedCover},}) { Q_UNUSED(aValid) } bool isValid() const { return !isEmpty() && duration().isValid(); } qulonglong databaseId() const { return operator[](key_type::DatabaseIdRole).toULongLong(); } QString title() const { return operator[](key_type::TitleRole).toString(); } QString artist() const { return operator[](key_type::ArtistRole).toString(); } qulonglong albumId() const { return operator[](key_type::AlbumIdRole).toULongLong(); } bool hasAlbum() const { return find(key_type::AlbumRole) != end(); } QString album() const { return operator[](key_type::AlbumRole).toString(); } QString albumArtist() const { return operator[](key_type::AlbumArtistRole).toString(); } bool hasAlbumArtist() const { return find(key_type::AlbumArtistRole) != end(); } bool hasTrackNumber() const { return find(key_type::TrackNumberRole) != end(); } int trackNumber() const { return operator[](key_type::TrackNumberRole).toInt(); } bool hasDiscNumber() const { return find(key_type::DiscNumberRole) != end(); } int discNumber() const { return operator[](key_type::DiscNumberRole).toInt(); } QTime duration() const { return operator[](key_type::DurationRole).toTime(); } QUrl resourceURI() const { return operator[](key_type::ResourceRole).toUrl(); } QUrl albumCover() const { return operator[](key_type::ImageUrlRole).toUrl(); } bool isSingleDiscAlbum() const { return operator[](key_type::IsSingleDiscAlbumRole).toBool(); } int rating() const { return operator[](key_type::RatingRole).toInt(); } QString genre() const { return operator[](key_type::GenreRole).toString(); } QString composer() const { return operator[](key_type::ComposerRole).toString(); } QString lyricist() const { return operator[](key_type::LyricistRole).toString(); } QString lyrics() const { return operator[](key_type::LyricsRole).toString(); } QString comment() const { return operator[](key_type::CommentRole).toString(); } int year() const { return operator[](key_type::YearRole).toInt(); } int channels() const { return operator[](key_type::ChannelsRole).toInt(); } bool hasChannels() const { return find(key_type::ChannelsRole) != end(); } int bitRate() const { return operator[](key_type::BitRateRole).toInt(); } bool hasBitRate() const { return find(key_type::BitRateRole) != end(); } int sampleRate() const { return operator[](key_type::SampleRateRole).toInt(); } bool hasSampleRate() const { return find(key_type::SampleRateRole) != end(); } bool hasEmbeddedCover() const { return operator[](key_type::HasEmbeddedCover).toBool(); } QDateTime fileModificationTime() const { return operator[](key_type::FileModificationTime).toDateTime(); } }; using ListTrackDataType = QList; using ListRadioDataType = QList; class AlbumDataType : public DataType { public: using DataType::DataType; qulonglong databaseId() const { return operator[](key_type::DatabaseIdRole).toULongLong(); } QString title() const { return operator[](key_type::TitleRole).toString(); } QString artist() const { return operator[](key_type::ArtistRole).toString(); } bool isValidArtist() const { const auto &artistData = operator[](key_type::ArtistRole); return artistData.isValid() && !artistData.toString().isEmpty(); } QStringList genres() const { return operator[](key_type::GenreRole).toStringList(); } QUrl albumArtURI() const { return operator[](key_type::ImageUrlRole).toUrl(); } bool isSingleDiscAlbum() const { return operator[](key_type::IsSingleDiscAlbumRole).toBool(); } bool isValid() const { return !isEmpty(); } }; using ListAlbumDataType = QList; class ArtistDataType : public DataType { public: using DataType::DataType; QString name() const { return operator[](key_type::TitleRole).toString(); } qulonglong databaseId() const { return operator[](key_type::DatabaseIdRole).toULongLong(); } }; using ListArtistDataType = QList; class GenreDataType : public DataType { public: using DataType::DataType; qulonglong databaseId() const { return operator[](key_type::DatabaseIdRole).toULongLong(); } QString title() const { return operator[](key_type::TitleRole).toString(); } }; using ListGenreDataType = QList; + using EntryData = std::tuple; + using EntryDataList = QList; + }; Q_DECLARE_METATYPE(DataTypes::TrackDataType) Q_DECLARE_METATYPE(DataTypes::AlbumDataType) Q_DECLARE_METATYPE(DataTypes::ArtistDataType) Q_DECLARE_METATYPE(DataTypes::GenreDataType) Q_DECLARE_METATYPE(DataTypes::ListTrackDataType) Q_DECLARE_METATYPE(DataTypes::ListAlbumDataType) Q_DECLARE_METATYPE(DataTypes::ListArtistDataType) Q_DECLARE_METATYPE(DataTypes::ListGenreDataType) +Q_DECLARE_METATYPE(DataTypes::EntryData) +Q_DECLARE_METATYPE(DataTypes::EntryDataList) + #endif // DATATYPES_H diff --git a/src/elisaapplication.cpp b/src/elisaapplication.cpp index e32f5a74..ebca914f 100644 --- a/src/elisaapplication.cpp +++ b/src/elisaapplication.cpp @@ -1,549 +1,549 @@ /* SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien SPDX-FileCopyrightText: 2012 (c) Aleix Pol Gonzalez SPDX-License-Identifier: LGPL-3.0-or-later */ #include "elisaapplication.h" #include "musiclistenersmanager.h" #include "mediaplaylist.h" #include "mediaplaylistproxymodel.h" #include "audiowrapper.h" #include "manageaudioplayer.h" #include "managemediaplayercontrol.h" #include "manageheaderbar.h" #include "databaseinterface.h" #include "elisa_settings.h" #include #if defined KF5ConfigWidgets_FOUND && KF5ConfigWidgets_FOUND #include #endif #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class ElisaApplicationPrivate { public: explicit ElisaApplicationPrivate(QObject *parent) #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND : mCollection(parent) #endif { Q_UNUSED(parent) auto configurationFileName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); configurationFileName += QStringLiteral("/elisarc"); Elisa::ElisaConfiguration::instance(configurationFileName); Elisa::ElisaConfiguration::self()->load(); Elisa::ElisaConfiguration::self()->save(); mConfigFileWatcher.addPath(configurationFileName); } #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND KActionCollection mCollection; #endif - ElisaUtils::EntryDataList mArguments; + DataTypes::EntryDataList mArguments; std::unique_ptr mMusicManager; std::unique_ptr mMediaPlayList; std::unique_ptr mMediaPlayListProxyModel; std::unique_ptr mAudioWrapper; std::unique_ptr mAudioControl; std::unique_ptr mPlayerControl; std::unique_ptr mManageHeaderBar; QQmlApplicationEngine *mEngine = nullptr; QFileSystemWatcher mConfigFileWatcher; }; ElisaApplication::ElisaApplication(QObject *parent) : QObject(parent), d(std::make_unique(this)) { connect(Elisa::ElisaConfiguration::self(), &Elisa::ElisaConfiguration::configChanged, this, &ElisaApplication::configChanged); connect(&d->mConfigFileWatcher, &QFileSystemWatcher::fileChanged, this, &ElisaApplication::configChanged); connect(static_cast(QCoreApplication::instance()), &QGuiApplication::commitDataRequest, this, &ElisaApplication::commitDataRequest); } ElisaApplication::~ElisaApplication() = default; void ElisaApplication::setupActions(const QString &actionName) { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND if (actionName == QLatin1String("file_quit")) { auto quitAction = KStandardAction::quit(QCoreApplication::instance(), &QCoreApplication::quit, &d->mCollection); d->mCollection.addAction(actionName, quitAction); } if (actionName == QLatin1String("help_contents") && KAuthorized::authorizeAction(actionName)) { auto handBookAction = KStandardAction::helpContents(this, &ElisaApplication::appHelpActivated, &d->mCollection); d->mCollection.addAction(handBookAction->objectName(), handBookAction); } if (actionName == QLatin1String("help_report_bug") && KAuthorized::authorizeAction(actionName) && !KAboutData::applicationData().bugAddress().isEmpty()) { auto reportBugAction = KStandardAction::reportBug(this, &ElisaApplication::reportBug, &d->mCollection); d->mCollection.addAction(reportBugAction->objectName(), reportBugAction); } if (actionName == QLatin1String("help_about_app") && KAuthorized::authorizeAction(actionName)) { auto aboutAppAction = KStandardAction::aboutApp(this, &ElisaApplication::aboutApplication, this); d->mCollection.addAction(aboutAppAction->objectName(), aboutAppAction); } if (actionName == QLatin1String("options_configure") && KAuthorized::authorizeAction(actionName)) { auto preferencesAction = KStandardAction::preferences(this, &ElisaApplication::configureElisa, this); d->mCollection.addAction(preferencesAction->objectName(), preferencesAction); } if (actionName == QLatin1String("options_configure_keybinding") && KAuthorized::authorizeAction(actionName)) { auto keyBindingsAction = KStandardAction::keyBindings(this, &ElisaApplication::configureShortcuts, this); d->mCollection.addAction(keyBindingsAction->objectName(), keyBindingsAction); } if (actionName == QLatin1String("go_back") && KAuthorized::authorizeAction(actionName)) { auto goBackAction = KStandardAction::back(this, &ElisaApplication::goBack, this); d->mCollection.addAction(goBackAction->objectName(), goBackAction); } if (actionName == QLatin1String("toggle_playlist") && KAuthorized::authorizeAction(actionName)) { auto togglePlaylistAction = d->mCollection.addAction(actionName, this, &ElisaApplication::togglePlaylist); togglePlaylistAction->setShortcut(QKeySequence(Qt::Key_F9)); togglePlaylistAction->setText(QStringLiteral("Toggle Playlist")); } if (actionName == QLatin1String("Seek") && KAuthorized::authorizeAction(actionName)) { auto seekAction = d->mCollection.addAction(actionName, this, &ElisaApplication::seek); d->mCollection.setDefaultShortcut(seekAction, QKeySequence(Qt::SHIFT + Qt::Key_Right)); } if (actionName == QLatin1String("Scrub") && KAuthorized::authorizeAction(actionName)) { auto scrubAction = d->mCollection.addAction(actionName, this, &ElisaApplication::scrub); d->mCollection.setDefaultShortcut(scrubAction, QKeySequence(Qt::SHIFT + Qt::Key_Left)); } if (actionName == QLatin1String("Play-Pause") && KAuthorized::authorizeAction(actionName)) { auto playPauseAction = d->mCollection.addAction(actionName, this, &ElisaApplication::playPause); d->mCollection.setDefaultShortcut(playPauseAction, QKeySequence(Qt::Key_Space)); } if (actionName == QLatin1String("edit_find") && KAuthorized::authorizeAction(actionName)) { auto findAction = KStandardAction::find(this, &ElisaApplication::find, this); d->mCollection.addAction(findAction->objectName(), findAction); } d->mCollection.readSettings(); #endif } -void ElisaApplication::setArguments(const ElisaUtils::EntryDataList &newArguments) +void ElisaApplication::setArguments(const DataTypes::EntryDataList &newArguments) { if (d->mArguments == newArguments) { return; } d->mArguments = checkFileListAndMakeAbsolute(newArguments, QDir::currentPath()); Q_EMIT argumentsChanged(); if (!d->mArguments.isEmpty()) { Q_EMIT enqueue(d->mArguments, ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } void ElisaApplication::activateActionRequested(const QString &actionName, const QVariant ¶meter) { Q_UNUSED(actionName) Q_UNUSED(parameter) } void ElisaApplication::activateRequested(const QStringList &arguments, const QString &workingDirectory) { if (arguments.size() > 1) { - auto realArguments = ElisaUtils::EntryDataList{}; + auto realArguments = DataTypes::EntryDataList{}; bool isFirst = true; for (const auto &oneArgument : arguments) { if (isFirst) { isFirst = false; continue; } - realArguments.push_back(ElisaUtils::EntryData{{}, {}, QUrl(oneArgument)}); + realArguments.push_back(DataTypes::EntryData{{}, {}, QUrl(oneArgument)}); } Q_EMIT enqueue(checkFileListAndMakeAbsolute(realArguments, workingDirectory), ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } void ElisaApplication::openRequested(const QList &uris) { Q_UNUSED(uris) } void ElisaApplication::appHelpActivated() { QDesktopServices::openUrl(QUrl(QStringLiteral("help:/"))); } void ElisaApplication::aboutApplication() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND static QPointer dialog; if (!dialog) { dialog = new KAboutApplicationDialog(KAboutData::applicationData(), nullptr); dialog->setAttribute(Qt::WA_DeleteOnClose); } dialog->show(); #endif } void ElisaApplication::reportBug() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND static QPointer dialog; if (!dialog) { dialog = new KBugReport(KAboutData::applicationData(), nullptr); dialog->setAttribute(Qt::WA_DeleteOnClose); } dialog->show(); #endif } void ElisaApplication::configureShortcuts() { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, nullptr); dlg.setModal(true); dlg.addCollection(&d->mCollection); dlg.configure(); #endif } void ElisaApplication::configureElisa() { if (!d->mEngine) { return; } d->mEngine->load(QUrl(QStringLiteral("qrc:/qml/ElisaConfigurationDialog.qml"))); } void ElisaApplication::goBack() {} void ElisaApplication::find() {} void ElisaApplication::togglePlaylist() {} void ElisaApplication::seek() {} void ElisaApplication::scrub() {} void ElisaApplication::playPause() {} void ElisaApplication::configChanged() { auto currentConfiguration = Elisa::ElisaConfiguration::self(); d->mConfigFileWatcher.addPath(currentConfiguration->config()->name()); currentConfiguration->load(); currentConfiguration->read(); Q_EMIT showProgressOnTaskBarChanged(); Q_EMIT showSystemTrayIconChanged(); } -ElisaUtils::EntryDataList ElisaApplication::checkFileListAndMakeAbsolute(const ElisaUtils::EntryDataList &filesList, +DataTypes::EntryDataList ElisaApplication::checkFileListAndMakeAbsolute(const DataTypes::EntryDataList &filesList, const QString &workingDirectory) const { - auto filesToOpen = ElisaUtils::EntryDataList{}; + auto filesToOpen = DataTypes::EntryDataList{}; for (const auto &oneFile : filesList) { if (std::get<2>(oneFile).scheme().isEmpty() || std::get<2>(oneFile).isLocalFile()) { auto newFile = QFileInfo(std::get<2>(oneFile).toLocalFile()); if (std::get<2>(oneFile).scheme().isEmpty()) { newFile = QFileInfo(std::get<2>(oneFile).toString()); } if (newFile.isRelative()) { if (std::get<2>(oneFile).scheme().isEmpty()) { newFile.setFile(workingDirectory, std::get<2>(oneFile).toString()); } else { newFile.setFile(workingDirectory, std::get<2>(oneFile).toLocalFile()); } } if (newFile.exists()) { - filesToOpen.push_back(ElisaUtils::EntryData{{}, {}, QUrl::fromLocalFile(newFile.canonicalFilePath())}); + filesToOpen.push_back(DataTypes::EntryData{{}, {}, QUrl::fromLocalFile(newFile.canonicalFilePath())}); } } else { - filesToOpen.push_back(ElisaUtils::EntryData{{}, {}, std::get<2>(oneFile)}); + filesToOpen.push_back(DataTypes::EntryData{{}, {}, std::get<2>(oneFile)}); } } return filesToOpen; } void ElisaApplication::initialize() { initializeModels(); initializePlayer(); Q_EMIT initializationDone(); } void ElisaApplication::setQmlEngine(QQmlApplicationEngine *engine) { d->mEngine = engine; } void ElisaApplication::initializeModels() { d->mMusicManager = std::make_unique(); Q_EMIT musicManagerChanged(); d->mMediaPlayList = std::make_unique(); d->mMusicManager->subscribeForTracks(d->mMediaPlayList.get()); Q_EMIT mediaPlayListChanged(); d->mMediaPlayListProxyModel = std::make_unique(); d->mMediaPlayListProxyModel->setPlayListModel(d->mMediaPlayList.get()); Q_EMIT mediaPlayListProxyModelChanged(); d->mMusicManager->setElisaApplication(this); QObject::connect(this, &ElisaApplication::enqueue, - d->mMediaPlayListProxyModel.get(), static_cast(&MediaPlayListProxyModel::enqueue)); + d->mMediaPlayListProxyModel.get(), static_cast(&MediaPlayListProxyModel::enqueue)); } void ElisaApplication::initializePlayer() { d->mAudioWrapper = std::make_unique(); Q_EMIT audioPlayerChanged(); d->mAudioControl = std::make_unique(); Q_EMIT audioControlChanged(); d->mPlayerControl = std::make_unique(); Q_EMIT playerControlChanged(); d->mManageHeaderBar = std::make_unique(); Q_EMIT manageHeaderBarChanged(); d->mAudioControl->setAlbumNameRole(MediaPlayList::AlbumRole); d->mAudioControl->setArtistNameRole(MediaPlayList::ArtistRole); d->mAudioControl->setTitleRole(MediaPlayList::TitleRole); d->mAudioControl->setUrlRole(MediaPlayList::ResourceRole); d->mAudioControl->setIsPlayingRole(MediaPlayList::IsPlayingRole); d->mAudioControl->setPlayListModel(d->mMediaPlayListProxyModel.get()); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPlay, d->mAudioWrapper.get(), &AudioWrapper::play); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerPause, d->mAudioWrapper.get(), &AudioWrapper::pause); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerStop, d->mAudioWrapper.get(), &AudioWrapper::stop); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::seek, d->mAudioWrapper.get(), &AudioWrapper::seek); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::saveUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::saveUndoPosition); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::restoreUndoPositionInAudioWrapper, d->mAudioWrapper.get(), &AudioWrapper::restoreUndoPosition); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::skipNextTrack, d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::skipNextTrack); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::trackInError); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::sourceInError, d->mMusicManager.get(), &MusicListenersManager::playBackError); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::playerSourceChanged, d->mAudioWrapper.get(), &AudioWrapper::setSource); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::startedPlayingTrack, d->mMusicManager->viewDatabase(), &DatabaseInterface::trackHasStartedPlaying); QObject::connect(d->mAudioControl.get(), &ManageAudioPlayer::updateData, d->mMediaPlayList.get(), &MediaPlayList::setData); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::ensurePlay, d->mAudioControl.get(), &ManageAudioPlayer::ensurePlay); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::playListFinished, d->mAudioControl.get(), &ManageAudioPlayer::playListFinished); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentTrack); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::clearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::saveForUndoClearPlaylist); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::undoClearPlayListPlayer, d->mAudioControl.get(), &ManageAudioPlayer::restoreForUndoClearPlaylist); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playbackStateChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPlaybackState); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::statusChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerStatus); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::errorChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerError); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::durationChanged, d->mAudioControl.get(), &ManageAudioPlayer::setAudioDuration); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::seekableChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerIsSeekable); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::positionChanged, d->mAudioControl.get(), &ManageAudioPlayer::setPlayerPosition); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::currentPlayingForRadiosChanged, d->mAudioControl.get(), &ManageAudioPlayer::setCurrentPlayingForRadios); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setCurrentTrack); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::previousTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setPreviousTrack); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::nextTrackChanged, d->mPlayerControl.get(), &ManageMediaPlayerControl::setNextTrack); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::playing, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPlaying); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::paused, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); QObject::connect(d->mAudioWrapper.get(), &AudioWrapper::stopped, d->mPlayerControl.get(), &ManageMediaPlayerControl::playerPausedOrStopped); d->mManageHeaderBar->setTitleRole(MediaPlayList::TitleRole); d->mManageHeaderBar->setAlbumRole(MediaPlayList::AlbumRole); d->mManageHeaderBar->setAlbumArtistRole(MediaPlayList::AlbumArtistRole); d->mManageHeaderBar->setArtistRole(MediaPlayList::ArtistRole); d->mManageHeaderBar->setFileNameRole(MediaPlayList::ResourceRole); d->mManageHeaderBar->setImageRole(MediaPlayList::ImageUrlRole); d->mManageHeaderBar->setDatabaseIdRole(MediaPlayList::DatabaseIdRole); d->mManageHeaderBar->setTrackTypeRole(MediaPlayList::ElementTypeRole); d->mManageHeaderBar->setAlbumIdRole(MediaPlayList::AlbumIdRole); d->mManageHeaderBar->setIsValidRole(MediaPlayList::IsValidRole); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackChanged, d->mManageHeaderBar.get(), &ManageHeaderBar::setCurrentTrack); QObject::connect(d->mMediaPlayListProxyModel.get(), &MediaPlayListProxyModel::currentTrackDataChanged, d->mManageHeaderBar.get(), &ManageHeaderBar::updateCurrentTrackData); if (!d->mArguments.isEmpty()) { Q_EMIT enqueue(d->mArguments, ElisaUtils::FileName, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay); } } QAction * ElisaApplication::action(const QString& name) { #if defined KF5XmlGui_FOUND && KF5XmlGui_FOUND auto resultAction = d->mCollection.action(name); if (!resultAction) { setupActions(name); resultAction = d->mCollection.action(name); } return resultAction; #else Q_UNUSED(name); return new QAction(); #endif } QString ElisaApplication::iconName(const QIcon& icon) { return icon.name(); } void ElisaApplication::installKeyEventFilter(QObject *object) { if(!object) { return; } object->installEventFilter(this); } bool ElisaApplication::eventFilter(QObject *object, QEvent *event) { Q_UNUSED(object); QKeyEvent *keyEvent = static_cast(event); auto playPauseAction = d->mCollection.action(tr("Play-Pause")); if (keyEvent->key() == Qt::Key_Space && playPauseAction->shortcut()[0] == Qt::Key_Space) { return true; } return false; } -const ElisaUtils::EntryDataList &ElisaApplication::arguments() const +const DataTypes::EntryDataList &ElisaApplication::arguments() const { return d->mArguments; } MusicListenersManager *ElisaApplication::musicManager() const { return d->mMusicManager.get(); } MediaPlayList *ElisaApplication::mediaPlayList() const { return d->mMediaPlayList.get(); } MediaPlayListProxyModel *ElisaApplication::mediaPlayListProxyModel() const { return d->mMediaPlayListProxyModel.get(); } AudioWrapper *ElisaApplication::audioPlayer() const { return d->mAudioWrapper.get(); } ManageAudioPlayer *ElisaApplication::audioControl() const { return d->mAudioControl.get(); } ManageMediaPlayerControl *ElisaApplication::playerControl() const { return d->mPlayerControl.get(); } ManageHeaderBar *ElisaApplication::manageHeaderBar() const { return d->mManageHeaderBar.get(); } bool ElisaApplication::showProgressOnTaskBar() const { auto currentConfiguration = Elisa::ElisaConfiguration::self(); return currentConfiguration->showProgressOnTaskBar(); } bool ElisaApplication::showSystemTrayIcon() const { auto currentConfiguration = Elisa::ElisaConfiguration::self(); return currentConfiguration->showSystemTrayIcon(); } #include "moc_elisaapplication.cpp" diff --git a/src/elisaapplication.h b/src/elisaapplication.h index b8cdc397..4d82ded5 100644 --- a/src/elisaapplication.h +++ b/src/elisaapplication.h @@ -1,203 +1,203 @@ /* SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef ELISAAPPLICATION_H #define ELISAAPPLICATION_H #include "elisaLib_export.h" #include "config-upnp-qt.h" #include "elisautils.h" #include #include #include class QIcon; class QAction; class MusicListenersManager; class MediaPlayList; class MediaPlayListProxyModel; class AudioWrapper; class ManageAudioPlayer; class ManageMediaPlayerControl; class ManageHeaderBar; class QQmlApplicationEngine; class ElisaApplicationPrivate; class QSessionManager; class ELISALIB_EXPORT ElisaApplication : public QObject { Q_OBJECT - Q_PROPERTY(ElisaUtils::EntryDataList arguments + Q_PROPERTY(DataTypes::EntryDataList arguments READ arguments WRITE setArguments NOTIFY argumentsChanged) Q_PROPERTY(MusicListenersManager *musicManager READ musicManager NOTIFY musicManagerChanged) Q_PROPERTY(MediaPlayList *mediaPlayList READ mediaPlayList NOTIFY mediaPlayListChanged) Q_PROPERTY(MediaPlayListProxyModel *mediaPlayListProxyModel READ mediaPlayListProxyModel NOTIFY mediaPlayListProxyModelChanged) Q_PROPERTY(AudioWrapper *audioPlayer READ audioPlayer NOTIFY audioPlayerChanged) Q_PROPERTY(ManageAudioPlayer *audioControl READ audioControl NOTIFY audioControlChanged) Q_PROPERTY(ManageMediaPlayerControl *playerControl READ playerControl NOTIFY playerControlChanged) Q_PROPERTY(ManageHeaderBar *manageHeaderBar READ manageHeaderBar NOTIFY manageHeaderBarChanged) Q_PROPERTY(bool showProgressOnTaskBar READ showProgressOnTaskBar NOTIFY showProgressOnTaskBarChanged) Q_PROPERTY(bool showSystemTrayIcon READ showSystemTrayIcon NOTIFY showSystemTrayIconChanged) public: explicit ElisaApplication(QObject *parent = nullptr); ~ElisaApplication() override; Q_INVOKABLE QAction* action(const QString& name); Q_INVOKABLE QString iconName(const QIcon& icon); Q_INVOKABLE void installKeyEventFilter(QObject *object); bool eventFilter(QObject *object, QEvent *event) override; - const ElisaUtils::EntryDataList &arguments() const; + const DataTypes::EntryDataList &arguments() const; MusicListenersManager *musicManager() const; MediaPlayList *mediaPlayList() const; MediaPlayListProxyModel *mediaPlayListProxyModel() const; AudioWrapper *audioPlayer() const; ManageAudioPlayer *audioControl() const; ManageMediaPlayerControl *playerControl() const; ManageHeaderBar *manageHeaderBar() const; bool showProgressOnTaskBar() const; bool showSystemTrayIcon() const; Q_SIGNALS: void argumentsChanged(); void musicManagerChanged(); void mediaPlayListChanged(); void mediaPlayListProxyModelChanged(); void audioPlayerChanged(); void audioControlChanged(); void playerControlChanged(); void manageHeaderBarChanged(); - void enqueue(const ElisaUtils::EntryDataList &newEntries, + void enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void initializationDone(); void showProgressOnTaskBarChanged(); void showSystemTrayIconChanged(); void commitDataRequest(QSessionManager &manager); public Q_SLOTS: void appHelpActivated(); void aboutApplication(); void reportBug(); void configureShortcuts(); void configureElisa(); - void setArguments(const ElisaUtils::EntryDataList &newArguments); + void setArguments(const DataTypes::EntryDataList &newArguments); void activateActionRequested(const QString &actionName, const QVariant ¶meter); void activateRequested(const QStringList &arguments, const QString &workingDirectory); void openRequested(const QList< QUrl > &uris); void initialize(); public: void setQmlEngine(QQmlApplicationEngine *engine); private Q_SLOTS: void goBack(); void find(); void togglePlaylist(); void seek(); void scrub(); void playPause(); void configChanged(); private: void initializeModels(); void initializePlayer(); void setupActions(const QString &actionName); - ElisaUtils::EntryDataList checkFileListAndMakeAbsolute(const ElisaUtils::EntryDataList &filesList, + DataTypes::EntryDataList checkFileListAndMakeAbsolute(const DataTypes::EntryDataList &filesList, const QString &workingDirectory) const; std::unique_ptr d; }; #endif // ELISAAPPLICATION_H diff --git a/src/elisaqmlplugin.cpp b/src/elisaqmlplugin.cpp index e19f4aad..fba6b41f 100644 --- a/src/elisaqmlplugin.cpp +++ b/src/elisaqmlplugin.cpp @@ -1,176 +1,176 @@ /* SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "elisaqmlplugin.h" #if defined UPNPQT_FOUND && UPNPQT_FOUND #include "upnp/upnpcontrolconnectionmanager.h" #include "upnp/upnpcontrolmediaserver.h" #include "upnp/upnpcontrolcontentdirectory.h" #include "upnp/upnpcontentdirectorymodel.h" #include "upnpdevicedescription.h" #include "upnp/didlparser.h" #include "upnp/upnpdiscoverallmusic.h" #include "upnpssdpengine.h" #include "upnpabstractservice.h" #include "upnpcontrolabstractdevice.h" #include "upnpcontrolabstractservice.h" #include "upnpbasictypes.h" #endif #include "elisautils.h" #include "elisaapplication.h" #include "progressindicator.h" #include "mediaplaylist.h" #include "mediaplaylistproxymodel.h" #include "managemediaplayercontrol.h" #include "manageheaderbar.h" #include "manageaudioplayer.h" #include "musiclistenersmanager.h" #include "trackslistener.h" #include "viewmanager.h" #include "viewslistdata.h" #include "databaseinterface.h" #include "datatypes.h" #include "models/datamodel.h" #include "models/trackmetadatamodel.h" #include "models/trackcontextmetadatamodel.h" #include "models/editabletrackmetadatamodel.h" #include "models/viewsmodel.h" #include "models/gridviewproxymodel.h" #include "models/alltracksproxymodel.h" #include "localFileConfiguration/elisaconfigurationdialog.h" #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND #include "embeddedcoverageimageprovider.h" #endif #if defined KF5KIO_FOUND && KF5KIO_FOUND #include "models/filebrowsermodel.h" #include "models/filebrowserproxymodel.h" #endif #include "audiowrapper.h" #if defined Qt5DBus_FOUND && Qt5DBus_FOUND #include "mpris2/mpris2.h" #include "mpris2/mediaplayer2player.h" #endif #include #include #include #include ElisaQmlTestPlugin::ElisaQmlTestPlugin(QObject *aParent) : QQmlExtensionPlugin(aParent) { } void ElisaQmlTestPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { QQmlExtensionPlugin::initializeEngine(engine, uri); #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND engine->addImageProvider(QStringLiteral("cover"), new EmbeddedCoverageImageProvider); #endif } void ElisaQmlTestPlugin::registerTypes(const char *uri) { #if defined UPNPQT_FOUND && UPNPQT_FOUND qmlRegisterType(uri, 1, 0, "UpnpSsdpEngine"); qmlRegisterType(uri, 1, 0, "UpnpDiscoverAllMusic"); qmlRegisterType(uri, 1, 0, "UpnpAbstractDevice"); qmlRegisterType(uri, 1, 0, "UpnpAbstractService"); qmlRegisterType(uri, 1, 0, "UpnpControlAbstractDevice"); qmlRegisterType(uri, 1, 0, "UpnpControlAbstractService"); qmlRegisterType(uri, 1, 0, "UpnpControlConnectionManager"); qmlRegisterType(uri, 1, 0, "UpnpControlMediaServer"); qmlRegisterType(uri, 1, 0, "UpnpContentDirectoryModel"); qmlRegisterType(uri, 1, 0, "DidlParser"); qmlRegisterType(uri, 1, 0, "UpnpControlContentDirectory"); qmlRegisterType(uri, 1, 0, "UpnpDeviceDescription"); qRegisterMetaType(); qRegisterMetaType >(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); #endif qmlRegisterType(uri, 1, 0, "MediaPlayList"); qmlRegisterType(uri, 1, 0, "MediaPlayListProxyModel"); qmlRegisterType(uri, 1, 0, "ManageMediaPlayerControl"); qmlRegisterType(uri, 1, 0, "ManageHeaderBar"); qmlRegisterType(uri, 1, 0, "ManageAudioPlayer"); qmlRegisterType(uri, 1, 0, "ProgressIndicator"); qmlRegisterType(uri, 1, 0, "MusicListenersManager"); qmlRegisterType(uri, 1, 0, "ViewManager"); qmlRegisterType(uri, 1, 0, "ViewsListData"); qmlRegisterType(uri, 1, 0, "DataModel"); qmlRegisterType(uri, 1, 0, "TrackMetadataModel"); qmlRegisterType(uri, 1, 0, "TrackContextMetaDataModel"); qmlRegisterType(uri, 1, 0, "EditableTrackMetadataModel"); qmlRegisterType(uri, 1, 0, "ViewsModel"); qmlRegisterType(uri, 1, 0, "GridViewProxyModel"); qmlRegisterType(uri, 1, 0, "AllTracksProxyModel"); #if defined KF5KIO_FOUND && KF5KIO_FOUND qmlRegisterType(uri, 1, 0, "FileBrowserModel"); qmlRegisterType(uri, 1, 0, "FileBrowserProxyModel"); #endif qmlRegisterType(uri, 1, 0, "AudioWrapper"); qmlRegisterUncreatableType(uri, 1, 0, "DatabaseInterface", QStringLiteral("Only created in c++")); #if defined Qt5DBus_FOUND && Qt5DBus_FOUND qmlRegisterType(uri, 1, 0, "Mpris2"); qRegisterMetaType(); #endif qRegisterMetaType(); qRegisterMetaType>("QHash"); qRegisterMetaType>("QHash"); qRegisterMetaType>("QVector"); qRegisterMetaType>("QHash"); qRegisterMetaType("DataTypes::ListTrackDataType"); qRegisterMetaType("DataTypes::ListRadioDataType"); qRegisterMetaType("DataTypes::ListAlbumDataType"); qRegisterMetaType("DataTypes::ListArtistDataType"); qRegisterMetaType("DataTypes::ListGenreDataType"); qRegisterMetaType("ModelDataLoader::ListTrackDataType"); qRegisterMetaType("ModelDataLoader::ListRadioDataType"); qRegisterMetaType("ModelDataLoader::ListAlbumDataType"); qRegisterMetaType("ModelDataLoader::ListArtistDataType"); qRegisterMetaType("ModelDataLoader::ListGenreDataType"); qRegisterMetaType("ModelDataLoader::AlbumDataType"); qRegisterMetaType("TracksListener::ListTrackDataType"); qRegisterMetaType>(); qRegisterMetaType(); qRegisterMetaType>("QMap"); qRegisterMetaType("ElisaUtils::PlayListEnqueueMode"); qRegisterMetaType("ElisaUtils::PlayListEnqueueTriggerPlay"); qRegisterMetaType("ElisaUtils::PlayListEntryType"); - qRegisterMetaType("ElisaUtils::EntryData"); - qRegisterMetaType("ElisaUtils::EntryDataList"); + qRegisterMetaType("DataTypes::EntryData"); + qRegisterMetaType("DataTypes::EntryDataList"); qRegisterMetaType("ElisaUtils::FilterType"); qRegisterMetaType("DataTypes::TrackDataType"); qRegisterMetaType("DataTypes::AlbumDataType"); qRegisterMetaType("DataTypes::ArtistDataType"); qRegisterMetaType("DataTypes::GenreDataType"); qRegisterMetaType("DataTypes::ColumnsRoles"); qRegisterMetaType("ModelDataLoader::TrackDataType"); qRegisterMetaType("TracksListener::TrackDataType"); qRegisterMetaType("ViewManager::SortOrder"); qmlRegisterUncreatableType(uri, 1, 0, "ElisaConfigurationDialog", QStringLiteral("only one and done in c++")); qmlRegisterUncreatableType(uri, 1, 0, "ElisaApplication", QStringLiteral("only one and done in c++")); qmlRegisterUncreatableMetaObject(ElisaUtils::staticMetaObject, uri, 1, 0, "ElisaUtils", QStringLiteral("Namespace ElisaUtils")); } diff --git a/src/elisautils.h b/src/elisautils.h index 47e1a3d2..9466615f 100644 --- a/src/elisautils.h +++ b/src/elisautils.h @@ -1,72 +1,66 @@ /* SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef ELISAUTILS_H #define ELISAUTILS_H #include "elisaLib_export.h" #include "datatypes.h" #include #include #include #include namespace ElisaUtils { Q_NAMESPACE enum PlayListEnqueueMode { AppendPlayList, ReplacePlayList, }; Q_ENUM_NS(PlayListEnqueueMode) enum PlayListEnqueueTriggerPlay { DoNotTriggerPlay, TriggerPlay, }; Q_ENUM_NS(PlayListEnqueueTriggerPlay) -using EntryData = std::tuple; -using EntryDataList = QList; - enum PlayListEntryType { Album, Artist, Genre, Lyricist, Composer, Track, FileName, Radio, Unknown, }; Q_ENUM_NS(PlayListEntryType) enum FilterType { UnknownFilter, NoFilter, FilterById, FilterByGenre, FilterByArtist, FilterByGenreAndArtist, FilterByRecentlyPlayed, FilterByFrequentlyPlayed, }; Q_ENUM_NS(FilterType) } -Q_DECLARE_METATYPE(ElisaUtils::EntryData) -Q_DECLARE_METATYPE(ElisaUtils::EntryDataList) - #endif // ELISAUTILS_H diff --git a/src/main.cpp b/src/main.cpp index 6d230cba..a3a8812a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,174 +1,174 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #include "config-upnp-qt.h" #include "elisa-version.h" #include "elisaapplication.h" #include "elisa_settings.h" #include "localFileConfiguration/elisaconfigurationdialog.h" //#define QT_QML_DEBUG #if defined KF5Declarative_FOUND && KF5Declarative_FOUND #include #include #endif #include #include #include #if defined KF5Crash_FOUND && KF5Crash_FOUND #include #endif #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND #include #endif #include #include #include #include #include #include #include #include #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND #include #endif #include #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND #include #include #endif #if defined Q_OS_ANDROID int __attribute__((visibility("default"))) main(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { #if defined Q_OS_ANDROID if(argc > 1 && strcmp(argv[1], "-service") == 0){ QAndroidService app(argc, argv); qInfo() << "Service starting..."; // My service stuff return app.exec(); } qInfo() << "Application starting..."; #endif QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); qputenv("QT_GSTREAMER_USE_PLAYBIN_VOLUME", "true"); QApplication app(argc, argv); #if defined KF5Declarative_FOUND && KF5Declarative_FOUND KQuickAddons::QtQuickSettings::init(); #endif KLocalizedString::setApplicationDomain("elisa"); #if defined Qt5AndroidExtras_FOUND && Qt5AndroidExtras_FOUND qInfo() << QCoreApplication::arguments(); QAndroidJniObject::callStaticMethod("org/kde/elisa/ElisaService", "startMyService", "(Landroid/content/Context;)V", QtAndroid::androidContext().object()); #endif #if defined KF5Crash_FOUND && KF5Crash_FOUND KCrash::initialize(); #endif QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("elisa"))); KAboutData aboutData( QStringLiteral("elisa"), i18n("Elisa"), QStringLiteral(ELISA_VERSION_STRING), i18n("A Simple Music Player made with love by the KDE community"), KAboutLicense::LGPL_V3, i18n("(c) 2015-2020, Elisa contributors")); aboutData.addAuthor(QStringLiteral("Matthieu Gallien"),i18n("Creator"), QStringLiteral("mgallien@mgallien.fr")); aboutData.addAuthor(QStringLiteral("Alexander Stippich"), i18n("Author"), QStringLiteral("a.stippich@gmx.net")); aboutData.addAuthor(QStringLiteral("Nate Graham"), i18n("Author"), QStringLiteral("nate@kde.org")); aboutData.addCredit(QStringLiteral("Andrew Lake"), i18n("Concept and design work"), QStringLiteral("jamboarder@gmail.com")); aboutData.addCredit(QStringLiteral("Luigi Toscano"), i18n("Localization support"), QStringLiteral("luigi.toscano@tiscali.it")); aboutData.addCredit(QStringLiteral("Safa Alfulaij"), i18n("Right to left support in interface"), QStringLiteral("safa1996alfulaij@gmail.com")); aboutData.addCredit(QStringLiteral("Diego Gangl"), i18n("Various improvements to the interface"), QStringLiteral("diego@sinestesia.co")); aboutData.addCredit(QStringLiteral("Jérôme Guidon"), i18n("Support for online radios"), QStringLiteral("guidon@live.fr")); KAboutData::setApplicationData(aboutData); QCommandLineParser parser; aboutData.setupCommandLine(&parser); parser.process(app); aboutData.processCommandLine(&parser); QQuickStyle::setStyle(QStringLiteral("org.kde.desktop")); QQuickStyle::setFallbackStyle(QStringLiteral("Fusion")); QQmlApplicationEngine engine; engine.addImportPath(QStringLiteral("qrc:/imports")); QQmlFileSelector selector(&engine); #if defined KF5Declarative_FOUND && KF5Declarative_FOUND KDeclarative::KDeclarative decl; decl.setDeclarativeEngine(&engine); decl.setupEngine(&engine); decl.setupContext(); #endif engine.rootContext()->setContextObject(new KLocalizedContext(&engine)); #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND KDBusService elisaService(KDBusService::Unique); #endif std::unique_ptr myApp = std::make_unique(); myApp->setQmlEngine(&engine); #if defined KF5DBusAddons_FOUND && KF5DBusAddons_FOUND QObject::connect(&elisaService, &KDBusService::activateActionRequested, myApp.get(), &ElisaApplication::activateActionRequested); QObject::connect(&elisaService, &KDBusService::activateRequested, myApp.get(), &ElisaApplication::activateRequested); QObject::connect(&elisaService, &KDBusService::openRequested, myApp.get(), &ElisaApplication::openRequested); #endif - auto arguments = ElisaUtils::EntryDataList{}; + auto arguments = DataTypes::EntryDataList{}; auto realArgumentsList = parser.positionalArguments(); for (const auto &oneArgument : realArgumentsList) { - arguments.push_back(ElisaUtils::EntryData{{}, {}, QUrl(oneArgument)}); + arguments.push_back(DataTypes::EntryData{{}, {}, QUrl(oneArgument)}); } myApp->setArguments(arguments); engine.rootContext()->setContextProperty(QStringLiteral("elisa"), myApp.release()); engine.rootContext()->setContextProperty(QStringLiteral("config"), new ElisaConfigurationDialog); engine.load(QUrl(QStringLiteral("qrc:/qml/ElisaMainWindow.qml"))); return app.exec(); } diff --git a/src/mediaplaylist.cpp b/src/mediaplaylist.cpp index c2ed4324..0791bfec 100644 --- a/src/mediaplaylist.cpp +++ b/src/mediaplaylist.cpp @@ -1,653 +1,653 @@ /* 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 = 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 ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType) +void MediaPlayList::enqueueFilesList(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueFilesList"; beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size() + newEntries.size() - 1); for (const auto &oneTrackUrl : newEntries) { switch (databaseIdType) { case ElisaUtils::Radio: case ElisaUtils::Track: case ElisaUtils::FileName: { const auto &trackUrl = std::get<2>(oneTrackUrl); auto newEntry = MediaPlayListEntry(trackUrl); newEntry.mEntryType = databaseIdType; 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({}); } break; } case ElisaUtils::Album: case ElisaUtils::Artist: case ElisaUtils::Genre: case ElisaUtils::Lyricist: case ElisaUtils::Composer: case ElisaUtils::Unknown: break; } } endInsertRows(); } -void MediaPlayList::enqueueTracksListById(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType type) +void MediaPlayList::enqueueTracksListById(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType type) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueTracksListById" << newEntries.size() << type; beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size() + newEntries.size() - 1); for (const auto &newTrack : newEntries) { auto newMediaPlayListEntry = MediaPlayListEntry{std::get<0>(newTrack).databaseId(), std::get<1>(newTrack), type}; d->mData.push_back(newMediaPlayListEntry); d->mTrackData.push_back(std::get<0>(newTrack)); Q_EMIT newEntryInList(newMediaPlayListEntry.mId, newMediaPlayListEntry.mTitle.toString(), newMediaPlayListEntry.mEntryType); } endInsertRows(); } -void MediaPlayList::enqueueOneEntry(const ElisaUtils::EntryData &entryData, ElisaUtils::PlayListEntryType type) +void MediaPlayList::enqueueOneEntry(const DataTypes::EntryData &entryData, ElisaUtils::PlayListEntryType type) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueOneEntry" << std::get<0>(entryData) << std::get<1>(entryData) << type; if (!std::get<0>(entryData).isEmpty() || !std::get<1>(entryData).isEmpty()) { beginInsertRows(QModelIndex(), d->mData.size(), d->mData.size()); d->mData.push_back(MediaPlayListEntry{std::get<0>(entryData).databaseId(), std::get<1>(entryData), type}); d->mTrackData.push_back(std::get<0>(entryData)); Q_EMIT newEntryInList(std::get<0>(entryData).databaseId(), std::get<1>(entryData), type); endInsertRows(); } } -void MediaPlayList::enqueueMultipleEntries(const ElisaUtils::EntryDataList &entriesData, ElisaUtils::PlayListEntryType type) +void MediaPlayList::enqueueMultipleEntries(const DataTypes::EntryDataList &entriesData, ElisaUtils::PlayListEntryType type) { qCDebug(orgKdeElisaPlayList()) << "MediaPlayList::enqueueMultipleEntries" << entriesData.size() << type; 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)}); d->mTrackData.push_back({}); Q_EMIT newUrlInList(std::get<2>(entryData), type); } else { d->mData.push_back(MediaPlayListEntry{std::get<0>(entryData).databaseId(), std::get<1>(entryData), type}); d->mTrackData.push_back(std::get<0>(entryData)); Q_EMIT newEntryInList(std::get<0>(entryData).databaseId(), std::get<1>(entryData), type); } } 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/mediaplaylist.h b/src/mediaplaylist.h index 30bb48fa..74259a40 100644 --- a/src/mediaplaylist.h +++ b/src/mediaplaylist.h @@ -1,223 +1,223 @@ /* SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef MEDIAPLAYLIST_H #define MEDIAPLAYLIST_H #include "elisaLib_export.h" #include "elisautils.h" #include "datatypes.h" #include #include #include #include #include class MediaPlayListPrivate; class MediaPlayListEntry; class QDebug; class ELISALIB_EXPORT MediaPlayList : public QAbstractListModel { Q_OBJECT public: enum ColumnsRoles { TitleRole = DataTypes::TitleRole, SecondaryTextRole, ImageUrlRole, ShadowForImageRole, ChildModelRole, DurationRole, StringDurationRole, ArtistRole, AllArtistsRole, HighestTrackRating, AlbumRole, AlbumArtistRole, IsValidAlbumArtistRole, TrackNumberRole, DiscNumberRole, RatingRole, GenreRole, LyricistRole, ComposerRole, CommentRole, YearRole, ChannelsRole, BitRateRole, SampleRateRole, ResourceRole, IdRole, ParentIdRole, DatabaseIdRole, IsSingleDiscAlbumRole, ContainerDataRole, IsPartialDataRole, AlbumIdRole, HasEmbeddedCover, FileModificationTime, FirstPlayDate, LastPlayDate, PlayCounter, PlayFrequency, ElementTypeRole, LyricsRole, FullDataRole, IsValidRole, CountRole, IsPlayingRole, AlbumSectionRole, }; Q_ENUM(ColumnsRoles) enum PlayState { NotPlaying, IsPlaying, IsPaused, }; Q_ENUM(PlayState) using ListTrackDataType = DataTypes::ListTrackDataType; using TrackDataType = DataTypes::TrackDataType; explicit MediaPlayList(QObject *parent = nullptr); ~MediaPlayList() override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QHash roleNames() const override; bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; void clearPlayList(); void enqueueRestoredEntries(const QVariantList &newEntries); QVariantList getEntriesForRestore() const; Q_SIGNALS: void newTrackByNameInList(const QVariant &title, const QVariant &artist, const QVariant &album, const QVariant &trackNumber, const QVariant &discNumber); void newEntryInList(qulonglong newDatabaseId, const QString &entryTitle, ElisaUtils::PlayListEntryType databaseIdType); void newUrlInList(const QUrl &entryUrl, ElisaUtils::PlayListEntryType databaseIdType); public Q_SLOTS: void tracksListAdded(qulonglong newDatabaseId, const QString &entryTitle, ElisaUtils::PlayListEntryType databaseIdType, const MediaPlayList::ListTrackDataType &tracks); void trackChanged(const MediaPlayList::TrackDataType &track); void trackRemoved(qulonglong trackId); void trackInError(const QUrl &sourceInError, QMediaPlayer::Error playerError); - void enqueueFilesList(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType); + void enqueueFilesList(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType); - void enqueueTracksListById(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType type); + void enqueueTracksListById(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType type); - void enqueueOneEntry(const ElisaUtils::EntryData &entryData, ElisaUtils::PlayListEntryType type); + void enqueueOneEntry(const DataTypes::EntryData &entryData, ElisaUtils::PlayListEntryType type); - void enqueueMultipleEntries(const ElisaUtils::EntryDataList &entriesData, ElisaUtils::PlayListEntryType type); + void enqueueMultipleEntries(const DataTypes::EntryDataList &entriesData, ElisaUtils::PlayListEntryType type); private: std::unique_ptr d; }; class MediaPlayListEntry { public: MediaPlayListEntry() = default; explicit MediaPlayListEntry(qulonglong id) : mId(id), mIsValid(true) { } MediaPlayListEntry(QString title, QString artist, QString album, int trackNumber, int discNumber, ElisaUtils::PlayListEntryType entryType = ElisaUtils::Unknown) : mTitle(std::move(title)), mAlbum(std::move(album)), mArtist(std::move(artist)), mTrackNumber(trackNumber), mDiscNumber(discNumber), mEntryType(entryType) { } MediaPlayListEntry(qulonglong id, QVariant title, QVariant artist, QVariant album, QVariant trackNumber, QVariant discNumber, ElisaUtils::PlayListEntryType entryType = ElisaUtils::Unknown) : mTitle(std::move(title)), mAlbum(std::move(album)), mArtist(std::move(artist)), mTrackNumber(std::move(trackNumber)), mDiscNumber(std::move(discNumber)), mId(id), mEntryType(entryType) { } explicit MediaPlayListEntry(const MediaPlayList::TrackDataType &track) : mTitle(track[DataTypes::TitleRole]), mAlbum(track[DataTypes::AlbumRole]), mTrackNumber(track[DataTypes::TrackNumberRole]), mDiscNumber(track[DataTypes::DiscNumberRole]), mId(track[DataTypes::DatabaseIdRole].toULongLong()), mIsValid(true) { } explicit MediaPlayListEntry(QString artist) : mArtist(std::move(artist)), mEntryType(ElisaUtils::Artist) { } explicit MediaPlayListEntry(QUrl fileName) : mTrackUrl(std::move(fileName)) { } explicit MediaPlayListEntry(qulonglong id, const QString &entryTitle, ElisaUtils::PlayListEntryType type) : mTitle(entryTitle), mId(id), mIsValid(type == ElisaUtils::Track), mEntryType(type) { } QVariant mTitle; QVariant mAlbum; QVariant mArtist; QVariant mTrackUrl; QVariant mTrackNumber; QVariant mDiscNumber; qulonglong mId = 0; bool mIsValid = false; ElisaUtils::PlayListEntryType mEntryType = ElisaUtils::PlayListEntryType::Unknown; MediaPlayList::PlayState mIsPlaying = MediaPlayList::NotPlaying; }; QDebug operator<<(const QDebug &stream, const MediaPlayListEntry &data); #endif // MEDIAPLAYLIST_H diff --git a/src/mediaplaylistproxymodel.cpp b/src/mediaplaylistproxymodel.cpp index d7fe6c84..58f0c825 100644 --- a/src/mediaplaylistproxymodel.cpp +++ b/src/mediaplaylistproxymodel.cpp @@ -1,873 +1,873 @@ /* 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 ElisaUtils::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType) +void MediaPlayListProxyModel::enqueue(const DataTypes::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType) { enqueue(newEntry, databaseIdType, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::DoNotTriggerPlay); } -void MediaPlayListProxyModel::enqueue(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType) +void MediaPlayListProxyModel::enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType) { enqueue(newEntries, databaseIdType, ElisaUtils::PlayListEnqueueMode::AppendPlayList, ElisaUtils::PlayListEnqueueTriggerPlay::DoNotTriggerPlay); } void MediaPlayListProxyModel::enqueue(qulonglong newEntryDatabaseId, const QString &newEntryTitle, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { - enqueue(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, newEntryDatabaseId}}, newEntryTitle, {}}, databaseIdType, enqueueMode, triggerPlay); + enqueue(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, newEntryDatabaseId}}, newEntryTitle, {}}, databaseIdType, enqueueMode, triggerPlay); } void MediaPlayListProxyModel::enqueue(const QUrl &entryUrl, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { - enqueue(ElisaUtils::EntryData{{}, {}, entryUrl}, databaseIdType, enqueueMode, triggerPlay); + enqueue(DataTypes::EntryData{{}, {}, entryUrl}, databaseIdType, enqueueMode, triggerPlay); } -void MediaPlayListProxyModel::enqueue(const ElisaUtils::EntryData &newEntry, +void MediaPlayListProxyModel::enqueue(const DataTypes::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { d->mTriggerPlay = triggerPlay; if (enqueueMode == ElisaUtils::ReplacePlayList) { if (rowCount() == 0) { Q_EMIT hideUndoNotification(); } else { clearPlayList(); } } switch (databaseIdType) { case ElisaUtils::Album: case ElisaUtils::Artist: case ElisaUtils::Genre: d->mPlayListModel->enqueueOneEntry(newEntry, databaseIdType); break; case ElisaUtils::Track: case ElisaUtils::Radio: if (std::get<2>(newEntry).isValid()) { d->mPlayListModel->enqueueFilesList({newEntry}, databaseIdType); } else { d->mPlayListModel->enqueueOneEntry(newEntry, databaseIdType); } break; case ElisaUtils::FileName: d->mPlayListModel->enqueueFilesList({newEntry}, databaseIdType); break; case ElisaUtils::Lyricist: case ElisaUtils::Composer: case ElisaUtils::Unknown: break; } } -void MediaPlayListProxyModel::enqueue(const ElisaUtils::EntryDataList &newEntries, +void MediaPlayListProxyModel::enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType, 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(); } } switch (databaseIdType) { case ElisaUtils::Track: case ElisaUtils::Radio: d->mPlayListModel->enqueueMultipleEntries(newEntries, databaseIdType); break; case ElisaUtils::FileName: d->mPlayListModel->enqueueFilesList(newEntries, databaseIdType); break; case ElisaUtils::Album: case ElisaUtils::Artist: case ElisaUtils::Genre: d->mPlayListModel->enqueueMultipleEntries(newEntries, databaseIdType); break; case ElisaUtils::Lyricist: case ElisaUtils::Composer: case ElisaUtils::Unknown: break; } } 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(); for (int i = 0; i < d->mLoadPlaylist.mediaCount(); ++i) { #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - enqueue(ElisaUtils::EntryData{{}, {}, d->mLoadPlaylist.media(i).canonicalUrl()}, ElisaUtils::FileName); + enqueue(DataTypes::EntryData{{}, {}, d->mLoadPlaylist.media(i).canonicalUrl()}, ElisaUtils::FileName); #else - enqueue(ElisaUtils::EntryData{{}, {}, d->mLoadPlaylist.media(i).request().url()}, ElisaUtils::FileName); + enqueue(DataTypes::EntryData{{}, {}, d->mLoadPlaylist.media(i).request().url()}, ElisaUtils::FileName); #endif } 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 = ElisaUtils::EntryDataList(); + 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({ElisaUtils::EntryData{{},{},fileUrl}}); + 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, databaseIdType, ElisaUtils::AppendPlayList, triggerPlay); } #include "moc_mediaplaylistproxymodel.cpp" diff --git a/src/mediaplaylistproxymodel.h b/src/mediaplaylistproxymodel.h index 431bdcb4..d9297240 100644 --- a/src/mediaplaylistproxymodel.h +++ b/src/mediaplaylistproxymodel.h @@ -1,260 +1,260 @@ /* 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 #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 ElisaUtils::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType); + void enqueue(const DataTypes::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType); - void enqueue(const ElisaUtils::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType); + void enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType); void enqueue(qulonglong newEntryDatabaseId, const QString &newEntryTitle, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void enqueue(const QUrl &entryUrl, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); - void enqueue(const ElisaUtils::EntryData &newEntry, + void enqueue(const DataTypes::EntryData &newEntry, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); - void enqueue(const ElisaUtils::EntryDataList &newEntries, + void enqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); - void setRepeatPlay(const bool value); + void setRepeatPlay(bool value); - void setShufflePlayList(const 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 diff --git a/src/models/abstractmediaproxymodel.cpp b/src/models/abstractmediaproxymodel.cpp index 41c1dc36..17d5e4ac 100644 --- a/src/models/abstractmediaproxymodel.cpp +++ b/src/models/abstractmediaproxymodel.cpp @@ -1,112 +1,112 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2017 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "abstractmediaproxymodel.h" #include "mediaplaylistproxymodel.h" #include AbstractMediaProxyModel::AbstractMediaProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { setFilterCaseSensitivity(Qt::CaseInsensitive); mThreadPool.setMaxThreadCount(1); } AbstractMediaProxyModel::~AbstractMediaProxyModel() = default; QString AbstractMediaProxyModel::filterText() const { return mFilterText; } int AbstractMediaProxyModel::filterRating() const { return mFilterRating; } void AbstractMediaProxyModel::setFilterText(const QString &filterText) { QWriteLocker writeLocker(&mDataLock); if (mFilterText == filterText) return; mFilterText = filterText; mFilterExpression.setPattern(mFilterText); mFilterExpression.setPatternOptions(QRegularExpression::CaseInsensitiveOption); mFilterExpression.optimize(); invalidate(); Q_EMIT filterTextChanged(mFilterText); } void AbstractMediaProxyModel::setFilterRating(int filterRating) { QWriteLocker writeLocker(&mDataLock); if (mFilterRating == filterRating) { return; } mFilterRating = filterRating; invalidate(); Q_EMIT filterRatingChanged(filterRating); } bool AbstractMediaProxyModel::sortedAscending() const { return sortOrder() ? false : true; } MediaPlayListProxyModel *AbstractMediaProxyModel::playList() const { return mPlayList; } void AbstractMediaProxyModel::sortModel(Qt::SortOrder order) { this->sort(0, order); Q_EMIT sortedAscendingChanged(); } void AbstractMediaProxyModel::setPlayList(MediaPlayListProxyModel *playList) { disconnectPlayList(); if (mPlayList == playList) { return; } mPlayList = playList; Q_EMIT playListChanged(); connectPlayList(); } void AbstractMediaProxyModel::disconnectPlayList() { if (mPlayList) { disconnect(this, &AbstractMediaProxyModel::entriesToEnqueue, - mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); + mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); } } void AbstractMediaProxyModel::connectPlayList() { if (mPlayList) { connect(this, &AbstractMediaProxyModel::entriesToEnqueue, - mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); + mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); } } #include "moc_abstractmediaproxymodel.cpp" diff --git a/src/models/abstractmediaproxymodel.h b/src/models/abstractmediaproxymodel.h index 805e7599..6c8475df 100644 --- a/src/models/abstractmediaproxymodel.h +++ b/src/models/abstractmediaproxymodel.h @@ -1,104 +1,104 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2017 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef ABSTRACTMEDIAPROXYMODEL_H #define ABSTRACTMEDIAPROXYMODEL_H #include "elisaLib_export.h" #include "elisautils.h" #include #include #include #include class MediaPlayListProxyModel; class ELISALIB_EXPORT AbstractMediaProxyModel : public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(int filterRating READ filterRating WRITE setFilterRating NOTIFY filterRatingChanged) Q_PROPERTY(bool sortedAscending READ sortedAscending NOTIFY sortedAscendingChanged) Q_PROPERTY(MediaPlayListProxyModel* playList READ playList WRITE setPlayList NOTIFY playListChanged) public: explicit AbstractMediaProxyModel(QObject *parent = nullptr); ~AbstractMediaProxyModel() override; QString filterText() const; int filterRating() const; bool sortedAscending() const; MediaPlayListProxyModel* playList() const; public Q_SLOTS: void setFilterText(const QString &filterText); void setFilterRating(int filterRating); void sortModel(Qt::SortOrder order); void setPlayList(MediaPlayListProxyModel* playList); Q_SIGNALS: void filterTextChanged(const QString &filterText); void filterRatingChanged(int filterRating); void sortedAscendingChanged(); void playListChanged(); - void entriesToEnqueue(const ElisaUtils::EntryDataList &newEntries, + void entriesToEnqueue(const DataTypes::EntryDataList &newEntries, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override = 0; void disconnectPlayList(); void connectPlayList(); QString mFilterText; int mFilterRating = 0; QRegularExpression mFilterExpression; QReadWriteLock mDataLock; QThreadPool mThreadPool; MediaPlayListProxyModel* mPlayList = nullptr; }; #endif // ABSTRACTMEDIAPROXYMODEL_H diff --git a/src/models/alltracksproxymodel.cpp b/src/models/alltracksproxymodel.cpp index 5efe1766..edfdd362 100644 --- a/src/models/alltracksproxymodel.cpp +++ b/src/models/alltracksproxymodel.cpp @@ -1,74 +1,74 @@ /* SPDX-FileCopyrightText: 2017 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "alltracksproxymodel.h" #include "datatypes.h" #include #include AllTracksProxyModel::AllTracksProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { setSortCaseSensitivity(Qt::CaseInsensitive); } AllTracksProxyModel::~AllTracksProxyModel() = default; bool AllTracksProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { bool result = false; auto currentIndex = sourceModel()->index(source_row, 0, source_parent); const auto &titleValue = sourceModel()->data(currentIndex, Qt::DisplayRole).toString(); const auto &artistValue = sourceModel()->data(currentIndex, DataTypes::ColumnsRoles::ArtistRole).toString(); const auto maximumRatingValue = sourceModel()->data(currentIndex, DataTypes::ColumnsRoles::RatingRole).toInt(); if (maximumRatingValue < mFilterRating) { return result; } if (mFilterExpression.match(titleValue).hasMatch()) { result = true; } if (mFilterExpression.match(artistValue).hasMatch()) { result = true; } return result; } void AllTracksProxyModel::genericEnqueueToPlayList(ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { QtConcurrent::run(&mThreadPool, [=] () { QReadLocker locker(&mDataLock); - auto allTracks = ElisaUtils::EntryDataList{}; + auto allTracks = DataTypes::EntryDataList{}; allTracks.reserve(rowCount()); for (int rowIndex = 0, maxRowCount = rowCount(); rowIndex < maxRowCount; ++rowIndex) { auto currentIndex = index(rowIndex, 0); - allTracks.push_back(ElisaUtils::EntryData{data(currentIndex, DataTypes::FullDataRole).value(), + allTracks.push_back(DataTypes::EntryData{data(currentIndex, DataTypes::FullDataRole).value(), data(currentIndex, DataTypes::ColumnsRoles::TitleRole).toString(), data(currentIndex, DataTypes::ColumnsRoles::ResourceRole).toUrl()}); } Q_EMIT entriesToEnqueue(allTracks, ElisaUtils::Track, enqueueMode, triggerPlay); }); } void AllTracksProxyModel::enqueueToPlayList() { genericEnqueueToPlayList(ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); } void AllTracksProxyModel::replaceAndPlayOfPlayList() { genericEnqueueToPlayList(ElisaUtils::ReplacePlayList, ElisaUtils::TriggerPlay); } #include "moc_alltracksproxymodel.cpp" diff --git a/src/models/filebrowserproxymodel.cpp b/src/models/filebrowserproxymodel.cpp index 20531fbe..2ce78d02 100644 --- a/src/models/filebrowserproxymodel.cpp +++ b/src/models/filebrowserproxymodel.cpp @@ -1,251 +1,251 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2018 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "filebrowserproxymodel.h" #include "filebrowsermodel.h" #include "mediaplaylistproxymodel.h" #include #include #include #include #include "elisautils.h" FileBrowserProxyModel::FileBrowserProxyModel(QObject *parent) : KDirSortFilterProxyModel(parent) { setFilterCaseSensitivity(Qt::CaseInsensitive); mThreadPool.setMaxThreadCount(1); setSortFoldersFirst(true); sort(Qt::AscendingOrder); } FileBrowserProxyModel::~FileBrowserProxyModel() = default; QString FileBrowserProxyModel::filterText() const { return mFilterText; } void FileBrowserProxyModel::setFilterText(const QString &filterText) { QWriteLocker writeLocker(&mDataLock); if (mFilterText == filterText) return; mFilterText = filterText; mFilterExpression.setPattern(mFilterText); mFilterExpression.setPatternOptions(QRegularExpression::CaseInsensitiveOption); mFilterExpression.optimize(); invalidate(); Q_EMIT filterTextChanged(mFilterText); } bool FileBrowserProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { bool result = false; for (int column = 0, columnCount = sourceModel()->columnCount(source_parent); column < columnCount; ++column) { auto currentIndex = sourceModel()->index(source_row, column, source_parent); const auto &nameValue = sourceModel()->data(currentIndex, FileBrowserModel::NameRole).toString(); if (mFilterExpression.match(nameValue).hasMatch()) { result = true; continue; } if (result) { continue; } if (!result) { break; } } return result; } void FileBrowserProxyModel::enqueueToPlayList() { QtConcurrent::run(&mThreadPool, [=] () { QReadLocker locker(&mDataLock); - auto allTrackUrls = ElisaUtils::EntryDataList{}; + auto allTrackUrls = DataTypes::EntryDataList{}; for (int rowIndex = 0, maxRowCount = rowCount(); rowIndex < maxRowCount; ++rowIndex) { auto currentIndex = index(rowIndex, 0); if (!data(currentIndex, FileBrowserModel::IsDirectoryRole).toBool()) { allTrackUrls.push_back({{}, {}, data(currentIndex, FileBrowserModel::FileUrlRole).toUrl()}); } } Q_EMIT filesToEnqueue(allTrackUrls, ElisaUtils::FileName, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); }); } void FileBrowserProxyModel::replaceAndPlayOfPlayList() { QtConcurrent::run(&mThreadPool, [=] () { QReadLocker locker(&mDataLock); - auto allTrackUrls = ElisaUtils::EntryDataList{}; + auto allTrackUrls = DataTypes::EntryDataList{}; for (int rowIndex = 0, maxRowCount = rowCount(); rowIndex < maxRowCount; ++rowIndex) { auto currentIndex = index(rowIndex, 0); if (!data(currentIndex, FileBrowserModel::IsDirectoryRole).toBool()) { allTrackUrls.push_back({{}, {}, data(currentIndex, FileBrowserModel::FileUrlRole).toUrl()}); } } Q_EMIT filesToEnqueue(allTrackUrls, ElisaUtils::FileName, ElisaUtils::ReplacePlayList, ElisaUtils::TriggerPlay); }); } QString FileBrowserProxyModel::parentFolder() const { auto fileBrowserModel = dynamic_cast(sourceModel()); if (!fileBrowserModel) { return {}; } //return to the top folder if parent directory does not exist QDir dir(fileBrowserModel->dirLister()->url().toLocalFile()); if (dir.cdUp()) { return dir.path(); } else { return mTopFolder; } } void FileBrowserProxyModel::disconnectPlayList() { if (mPlayList) { disconnect(this, &FileBrowserProxyModel::filesToEnqueue, - mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); + mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); } } void FileBrowserProxyModel::connectPlayList() { if (mPlayList) { connect(this, &FileBrowserProxyModel::filesToEnqueue, - mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); + mPlayList, static_cast(&MediaPlayListProxyModel::enqueue)); } } void FileBrowserProxyModel::openParentFolder() { auto fileBrowserModel = dynamic_cast(sourceModel()); if (!fileBrowserModel) { return; } if (canGoBack()) { QString parent = parentFolder(); fileBrowserModel->setUrl(parent); if (parent == mTopFolder) { Q_EMIT canGoBackChanged(); } } } bool FileBrowserProxyModel::canGoBack() const { auto fileBrowserModel = dynamic_cast(sourceModel()); if (!fileBrowserModel) { return false; } return fileBrowserModel->dirLister()->url().toLocalFile() != mTopFolder; } void FileBrowserProxyModel::openFolder(const QString &folder, bool isDisplayRoot) { auto fileBrowserModel = dynamic_cast(sourceModel()); if (!fileBrowserModel) { return; } if (folder.isEmpty()) { return; } fileBrowserModel->setUrl(folder); if (!isDisplayRoot) { Q_EMIT canGoBackChanged(); } } QString FileBrowserProxyModel::url() const { auto fileBrowserModel = dynamic_cast(sourceModel()); if (!fileBrowserModel) { return {}; } return fileBrowserModel->dirLister()->url().toLocalFile(); } bool FileBrowserProxyModel::sortedAscending() const { return sortOrder() ? false : true; } void FileBrowserProxyModel::setSourceModel(QAbstractItemModel *sourceModel) { KDirSortFilterProxyModel::setSourceModel(sourceModel); auto fileBrowserModel = dynamic_cast(sourceModel); if (!fileBrowserModel) { return; } connect(fileBrowserModel, &FileBrowserModel::urlChanged,this, &FileBrowserProxyModel::urlChanged); mTopFolder = QDir::homePath(); openFolder(mTopFolder, true); } MediaPlayListProxyModel *FileBrowserProxyModel::playList() const { return mPlayList; } void FileBrowserProxyModel::sortModel(Qt::SortOrder order) { this->sort(0,order); Q_EMIT sortedAscendingChanged(); } void FileBrowserProxyModel::setPlayList(MediaPlayListProxyModel *playList) { disconnectPlayList(); if (mPlayList == playList) { return; } mPlayList = playList; Q_EMIT playListChanged(); connectPlayList(); } #include "moc_filebrowserproxymodel.cpp" diff --git a/src/models/filebrowserproxymodel.h b/src/models/filebrowserproxymodel.h index eecc12bf..b710e8e7 100644 --- a/src/models/filebrowserproxymodel.h +++ b/src/models/filebrowserproxymodel.h @@ -1,128 +1,128 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2018 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #ifndef FILEBROWSERPROXYMODEL_H #define FILEBROWSERPROXYMODEL_H #include "elisaLib_export.h" #include "filescanner.h" #include "elisautils.h" #include #include #include #include #include class MediaPlayListProxyModel; class ELISALIB_EXPORT FileBrowserProxyModel : public KDirSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(bool canGoBack READ canGoBack NOTIFY canGoBackChanged) Q_PROPERTY(QString url READ url NOTIFY urlChanged) Q_PROPERTY(bool sortedAscending READ sortedAscending NOTIFY sortedAscendingChanged) Q_PROPERTY(MediaPlayListProxyModel* playList READ playList WRITE setPlayList NOTIFY playListChanged) public: explicit FileBrowserProxyModel(QObject *parent = nullptr); ~FileBrowserProxyModel() override; QString filterText() const; QString url() const; bool canGoBack() const; bool sortedAscending() const; void setSourceModel(QAbstractItemModel *sourceModel) override; MediaPlayListProxyModel* playList() const; public Q_SLOTS: void enqueueToPlayList(); void replaceAndPlayOfPlayList(); void setFilterText(const QString &filterText); void openParentFolder(); void openFolder(const QString &folder, bool isDisplayRoot = false); void sortModel(Qt::SortOrder order); void setPlayList(MediaPlayListProxyModel* playList); Q_SIGNALS: - void filesToEnqueue(const ElisaUtils::EntryDataList &newFiles, + void filesToEnqueue(const DataTypes::EntryDataList &newFiles, ElisaUtils::PlayListEntryType databaseIdType, ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay); void urlChanged(); void canGoBackChanged(); void filterTextChanged(const QString &filterText); void sortedAscendingChanged(); void playListChanged(); protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; private: QString parentFolder() const; void disconnectPlayList(); void connectPlayList(); QString mTopFolder; FileScanner mFileScanner; QString mFilterText; QRegularExpression mFilterExpression; QReadWriteLock mDataLock; QThreadPool mThreadPool; MediaPlayListProxyModel* mPlayList = nullptr; }; #endif // FILEBROWSERPROXYMODEL_H diff --git a/src/models/gridviewproxymodel.cpp b/src/models/gridviewproxymodel.cpp index a39d4241..207381c5 100644 --- a/src/models/gridviewproxymodel.cpp +++ b/src/models/gridviewproxymodel.cpp @@ -1,134 +1,134 @@ /* SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien SPDX-FileCopyrightText: 2017 (c) Alexander Stippich SPDX-License-Identifier: LGPL-3.0-or-later */ #include "gridviewproxymodel.h" #include "datatypes.h" #include "elisautils.h" #include #include GridViewProxyModel::GridViewProxyModel(QObject *parent) : AbstractMediaProxyModel(parent) { setSortRole(Qt::DisplayRole); setSortCaseSensitivity(Qt::CaseInsensitive); sortModel(Qt::AscendingOrder); } ElisaUtils::PlayListEntryType GridViewProxyModel::dataType() const { return mDataType; } GridViewProxyModel::~GridViewProxyModel() = default; bool GridViewProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { bool result = false; auto currentIndex = sourceModel()->index(source_row, 0, source_parent); const auto &mainValue = sourceModel()->data(currentIndex, Qt::DisplayRole).toString(); const auto &artistValue = sourceModel()->data(currentIndex, DataTypes::ArtistRole).toString(); const auto &allArtistsValue = sourceModel()->data(currentIndex, DataTypes::AllArtistsRole).toStringList(); const auto maximumRatingValue = sourceModel()->data(currentIndex, DataTypes::HighestTrackRating).toInt(); if (maximumRatingValue < mFilterRating) { result = false; return result; } if (mFilterExpression.match(mainValue).hasMatch()) { result = true; return result; } if (mFilterExpression.match(artistValue).hasMatch()) { result = true; return result; } for (const auto &oneArtist : allArtistsValue) { if (mFilterExpression.match(oneArtist).hasMatch()) { result = true; return result; } } return result; } void GridViewProxyModel::genericEnqueueToPlayList(ElisaUtils::PlayListEnqueueMode enqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay triggerPlay) { QtConcurrent::run(&mThreadPool, [=] () { QReadLocker locker(&mDataLock); - auto allData = ElisaUtils::EntryDataList{}; + auto allData = DataTypes::EntryDataList{}; allData.reserve(rowCount()); for (int rowIndex = 0, maxRowCount = rowCount(); rowIndex < maxRowCount; ++rowIndex) { auto currentIndex = index(rowIndex, 0); switch (mDataType) { case ElisaUtils::Radio: case ElisaUtils::Track: - allData.push_back(ElisaUtils::EntryData{data(currentIndex, DataTypes::FullDataRole).value(), + allData.push_back(DataTypes::EntryData{data(currentIndex, DataTypes::FullDataRole).value(), data(currentIndex, Qt::DisplayRole).toString(), {}}); break; case ElisaUtils::Album: - allData.push_back(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}, + allData.push_back(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}, {DataTypes::ImageUrlRole, data(currentIndex, DataTypes::ImageUrlRole).toUrl()}, {DataTypes::AlbumArtistRole, data(currentIndex, DataTypes::ArtistRole).toString()}, {DataTypes::AlbumRole, data(currentIndex, DataTypes::AlbumRole).toString()}}, data(currentIndex, Qt::DisplayRole).toString(), {}}); break; case ElisaUtils::Artist: - allData.push_back(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}, + allData.push_back(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}, {DataTypes::ImageUrlRole, data(currentIndex, DataTypes::ImageUrlRole).toUrl()}, {DataTypes::AlbumArtistRole, data(currentIndex, DataTypes::ArtistRole).toString()}, {DataTypes::AlbumRole, {}}}, data(currentIndex, Qt::DisplayRole).toString(), {}}); break; case ElisaUtils::Genre: case ElisaUtils::Lyricist: case ElisaUtils::Composer: case ElisaUtils::FileName: - allData.push_back(ElisaUtils::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}}, + allData.push_back(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, data(currentIndex, DataTypes::DatabaseIdRole).toULongLong()}}, data(currentIndex, Qt::DisplayRole).toString(), {}}); break; case ElisaUtils::Unknown: break; } } Q_EMIT entriesToEnqueue(allData, mDataType, enqueueMode, triggerPlay); }); } void GridViewProxyModel::enqueueToPlayList() { genericEnqueueToPlayList(ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay); } void GridViewProxyModel::replaceAndPlayOfPlayList() { genericEnqueueToPlayList(ElisaUtils::ReplacePlayList, ElisaUtils::TriggerPlay); } void GridViewProxyModel::setDataType(ElisaUtils::PlayListEntryType newDataType) { if (mDataType == newDataType) { return; } mDataType = newDataType; Q_EMIT dataTypeChanged(); } #include "moc_gridviewproxymodel.cpp"