File indexing completed on 2024-04-28 04:48:55

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003    SPDX-FileCopyrightText: 2020 (c) Alexander Stippich <a.stippich@gmx.net>
0004 
0005    SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 #include "mediaplaylistproxymodeltest.h"
0009 #include "mediaplaylisttestconfig.h"
0010 
0011 #include "datatypes.h"
0012 #include "mediaplaylist.h"
0013 #include "mediaplaylistproxymodel.h"
0014 #include "databaseinterface.h"
0015 #include "trackslistener.h"
0016 
0017 #include "elisa_settings.h"
0018 
0019 #include "config-upnp-qt.h"
0020 
0021 #include <QSignalSpy>
0022 #include <QTest>
0023 #include <QUrl>
0024 #include <QTemporaryFile>
0025 #include <QAbstractItemModelTester>
0026 
0027 MediaPlayListProxyModelTest::MediaPlayListProxyModelTest(QObject *parent) : QObject(parent)
0028 {
0029 }
0030 
0031 void MediaPlayListProxyModelTest::initTestCase()
0032 {
0033     qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
0034     qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
0035     qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
0036     qRegisterMetaType<ElisaUtils::PlayListEntryType>("PlayListEntryType");
0037     Elisa::ElisaConfiguration::instance(QStringLiteral("testfoo"));
0038 }
0039 
0040 void MediaPlayListProxyModelTest::m3uPlaylistParser_SimpleCase()
0041 {
0042     PlaylistParser playlistParser;
0043     QList<QUrl> listOfUrls = playlistParser.fromPlaylist(QUrl(QStringLiteral("file:///home/n/a.m3u")), QStringLiteral("/home/n/Music/1.mp3\n/home/n/Music/2.mp3\n").toUtf8());
0044 
0045     QCOMPARE(listOfUrls.count(), 2);
0046 }
0047 
0048 void MediaPlayListProxyModelTest::m3uPlaylistParser_CommentCase()
0049 {
0050     const char * asString = R"--(#EXTM3U
0051 #EXTINF:-1 tvg-id="ArianaAfghanistanInternationalTV.us" status="online",Ariana Afghanistan International TV (720p) [Not 24/7]
0052 http://iptv.arianaafgtv.com/ariana/playlist.m3u8
0053 #EXTINF:-1 tvg-id="ArianaTVNational.af" status="online",Ariana TV National (720p) [Not 24/7]
0054 https://d10rltuy0iweup.cloudfront.net/ATNNAT/myStream/playlist.m3u8
0055 )--";
0056     PlaylistParser playlistParser;
0057     QList<QUrl> listOfUrls = playlistParser.fromPlaylist(QUrl(QStringLiteral("file:///home/n/a.m3u")), QString::fromUtf8(asString).toUtf8());
0058 
0059     QCOMPARE(listOfUrls.count(), 2);
0060 }
0061 
0062 void MediaPlayListProxyModelTest::plsPlaylistParserCase()
0063 {
0064     const char * asString = R"--([playlist]
0065 
0066 File1=https://test.test-dom:8068
0067 Length1=-1
0068 
0069 File2=example2.mp3
0070 Title2=Relative path
0071 Length2=120
0072 
0073 File3=/home/n/Music/1.mp3
0074 Title3=Absolute path
0075 
0076 NumberOfEntries=3
0077 Version=2
0078 )--";
0079     PlaylistParser playlistParser;
0080     QList<QUrl> listOfUrls = playlistParser.fromPlaylist(QUrl(QStringLiteral("file:///home/n/a.pls")), QString::fromUtf8(asString).toUtf8());
0081 
0082     QCOMPARE(listOfUrls.count(), 3);
0083 }
0084 
0085 void MediaPlayListProxyModelTest::m3uPlaylistParser_ToPlaylist()
0086 {
0087     PlaylistParser playlistParser;
0088     QList<QString> listOfUrls {QStringLiteral("/home/n/Music/1.mp3"), QStringLiteral("/home/n/Music/2.mp3")};
0089     QString fileContent = playlistParser.toPlaylist(QUrl(QStringLiteral("file:///home/n/a.m3u")), listOfUrls);
0090 
0091     QCOMPARE(fileContent.count(QLatin1Char('\n')), 2);
0092 }
0093 
0094 void MediaPlayListProxyModelTest::plsPlaylistParser_ToPlaylist()
0095 {
0096     PlaylistParser playlistParser;
0097     QList<QString> listOfUrls {QStringLiteral("/home/n/Music/1.mp3"), QStringLiteral("/home/n/Music/2.mp3")};
0098     QString fileContent = playlistParser.toPlaylist(QUrl(QStringLiteral("file:///home/n/a.pls")), listOfUrls);
0099 
0100     QCOMPARE(fileContent.count(QStringLiteral("\nFile")), 2);
0101 }
0102 
0103 void MediaPlayListProxyModelTest::simpleInitialCase()
0104 {
0105     MediaPlayList myPlayList;
0106     QAbstractItemModelTester testModel(&myPlayList);
0107     MediaPlayListProxyModel myPlayListProxyModel;
0108     myPlayListProxyModel.setPlayListModel(&myPlayList);
0109     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0110     DatabaseInterface myDatabaseContent;
0111     TracksListener myListener(&myDatabaseContent);
0112 
0113     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0114     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0115     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayList::rowsAboutToBeInserted);
0116     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0117     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0118     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0119     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0120     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0121     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0122     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0123     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0124 
0125     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0126     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0127     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0128     QCOMPARE(rowsRemovedSpy.count(), 0);
0129     QCOMPARE(rowsMovedSpy.count(), 0);
0130     QCOMPARE(rowsInsertedSpy.count(), 0);
0131     QCOMPARE(persistentStateChangedSpy.count(), 0);
0132     QCOMPARE(dataChangedSpy.count(), 0);
0133     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0134     QCOMPARE(newEntryInListSpy.count(), 0);
0135 
0136     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0137 
0138     connect(&myListener, &TracksListener::trackHasChanged,
0139             &myPlayList, &MediaPlayList::trackChanged,
0140             Qt::QueuedConnection);
0141     connect(&myListener, &TracksListener::tracksListAdded,
0142             &myPlayList, &MediaPlayList::tracksListAdded,
0143             Qt::QueuedConnection);
0144     connect(&myPlayList, &MediaPlayList::newEntryInList,
0145             &myListener, &TracksListener::newEntryInList,
0146             Qt::QueuedConnection);
0147     connect(&myPlayList, &MediaPlayList::newUrlInList,
0148             &myListener, &TracksListener::newUrlInList,
0149             Qt::QueuedConnection);
0150     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0151             &myListener, &TracksListener::trackByNameInList,
0152             Qt::QueuedConnection);
0153     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0154             &myListener, &TracksListener::tracksAdded);
0155 
0156     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0157 
0158     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0159     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0160     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0161     QCOMPARE(rowsRemovedSpy.count(), 0);
0162     QCOMPARE(rowsMovedSpy.count(), 0);
0163     QCOMPARE(rowsInsertedSpy.count(), 0);
0164     QCOMPARE(persistentStateChangedSpy.count(), 0);
0165     QCOMPARE(dataChangedSpy.count(), 0);
0166     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0167     QCOMPARE(newEntryInListSpy.count(), 0);
0168 
0169     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0170     auto newTrackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
0171     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
0172 
0173     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0174     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0175     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0176     QCOMPARE(rowsRemovedSpy.count(), 0);
0177     QCOMPARE(rowsMovedSpy.count(), 0);
0178     QCOMPARE(rowsInsertedSpy.count(), 1);
0179     QCOMPARE(persistentStateChangedSpy.count(), 1);
0180     QCOMPARE(dataChangedSpy.count(), 0);
0181     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0182     QCOMPARE(newEntryInListSpy.count(), 1);
0183 
0184     QCOMPARE(dataChangedSpy.wait(), true);
0185 
0186     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0187     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0188     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0189     QCOMPARE(rowsRemovedSpy.count(), 0);
0190     QCOMPARE(rowsMovedSpy.count(), 0);
0191     QCOMPARE(rowsInsertedSpy.count(), 1);
0192     QCOMPARE(persistentStateChangedSpy.count(), 1);
0193     QCOMPARE(dataChangedSpy.count(), 1);
0194     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0195     QCOMPARE(newEntryInListSpy.count(), 1);
0196 }
0197 
0198 void MediaPlayListProxyModelTest::enqueueAlbumCase()
0199 {
0200     MediaPlayList myPlayList;
0201     QAbstractItemModelTester testModel(&myPlayList);
0202     MediaPlayListProxyModel myPlayListProxyModel;
0203     myPlayListProxyModel.setPlayListModel(&myPlayList);
0204     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0205     DatabaseInterface myDatabaseContent;
0206     TracksListener myListener(&myDatabaseContent);
0207 
0208     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0209     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0210     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0211     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0212     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0213     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0214     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0215     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0216     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0217     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0218     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0219 
0220     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0221     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0222     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0223     QCOMPARE(rowsRemovedSpy.count(), 0);
0224     QCOMPARE(rowsMovedSpy.count(), 0);
0225     QCOMPARE(rowsInsertedSpy.count(), 0);
0226     QCOMPARE(dataChangedSpy.count(), 0);
0227     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0228     QCOMPARE(newEntryInListSpy.count(), 0);
0229 
0230     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0231 
0232     connect(&myListener, &TracksListener::trackHasChanged,
0233             &myPlayList, &MediaPlayList::trackChanged,
0234             Qt::QueuedConnection);
0235     connect(&myListener, &TracksListener::tracksListAdded,
0236             &myPlayList, &MediaPlayList::tracksListAdded,
0237             Qt::QueuedConnection);
0238     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0239             &myListener, &TracksListener::trackByNameInList,
0240             Qt::QueuedConnection);
0241     connect(&myPlayList, &MediaPlayList::newEntryInList,
0242             &myListener, &TracksListener::newEntryInList,
0243             Qt::QueuedConnection);
0244     connect(&myPlayList, &MediaPlayList::newUrlInList,
0245             &myListener, &TracksListener::newUrlInList,
0246             Qt::QueuedConnection);
0247     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0248             &myListener, &TracksListener::tracksAdded);
0249 
0250     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0251 
0252     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0253     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0254     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0255     QCOMPARE(rowsRemovedSpy.count(), 0);
0256     QCOMPARE(rowsMovedSpy.count(), 0);
0257     QCOMPARE(rowsInsertedSpy.count(), 0);
0258     QCOMPARE(dataChangedSpy.count(), 0);
0259     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0260     QCOMPARE(newEntryInListSpy.count(), 0);
0261 
0262     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
0263                                    QStringLiteral("album2"), {}}}, {}, {});
0264 
0265     QVERIFY(rowsAboutToBeInsertedSpy.wait());
0266 
0267     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
0268     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0269     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0270     QCOMPARE(rowsRemovedSpy.count(), 1);
0271     QCOMPARE(rowsMovedSpy.count(), 0);
0272     QCOMPARE(rowsInsertedSpy.count(), 2);
0273     QCOMPARE(persistentStateChangedSpy.count(), 3);
0274     QCOMPARE(dataChangedSpy.count(), 0);
0275     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0276     QCOMPARE(newEntryInListSpy.count(), 1);
0277 
0278     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
0279 
0280     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0281     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0282     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0283     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0284     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0285     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
0286     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0287     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0288     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0289     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0290     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0291     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0292     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
0293     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0294     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0295     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0296     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0297     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0298     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0299     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
0300     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0301     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0302     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0303     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0304     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0305     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0306     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
0307     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0308     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
0309     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0310     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0311     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
0312     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0313     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
0314     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0315     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
0316     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0317     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
0318     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
0319     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0320     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
0321     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0322 }
0323 
0324 void MediaPlayListProxyModelTest::enqueueArtistCase()
0325 {
0326     MediaPlayList myPlayList;
0327     QAbstractItemModelTester testModel(&myPlayList);
0328     MediaPlayListProxyModel myPlayListProxyModel;
0329     myPlayListProxyModel.setPlayListModel(&myPlayList);
0330     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0331     DatabaseInterface myDatabaseContent;
0332     TracksListener myListener(&myDatabaseContent);
0333 
0334     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0335     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0336     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0337     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0338     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0339     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0340     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0341     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0342     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0343     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0344     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0345 
0346     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0347     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0348     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0349     QCOMPARE(rowsRemovedSpy.count(), 0);
0350     QCOMPARE(rowsMovedSpy.count(), 0);
0351     QCOMPARE(rowsInsertedSpy.count(), 0);
0352     QCOMPARE(persistentStateChangedSpy.count(), 0);
0353     QCOMPARE(dataChangedSpy.count(), 0);
0354     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0355     QCOMPARE(newEntryInListSpy.count(), 0);
0356 
0357     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0358 
0359     connect(&myListener, &TracksListener::trackHasChanged,
0360             &myPlayList, &MediaPlayList::trackChanged,
0361             Qt::QueuedConnection);
0362     connect(&myListener, &TracksListener::tracksListAdded,
0363             &myPlayList, &MediaPlayList::tracksListAdded,
0364             Qt::QueuedConnection);
0365     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0366             &myListener, &TracksListener::trackByNameInList,
0367             Qt::QueuedConnection);
0368     connect(&myPlayList, &MediaPlayList::newEntryInList,
0369             &myListener, &TracksListener::newEntryInList,
0370             Qt::QueuedConnection);
0371     connect(&myPlayList, &MediaPlayList::newUrlInList,
0372             &myListener, &TracksListener::newUrlInList,
0373             Qt::QueuedConnection);
0374     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0375             &myListener, &TracksListener::tracksAdded);
0376 
0377     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0378 
0379     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0380     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0381     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0382     QCOMPARE(rowsRemovedSpy.count(), 0);
0383     QCOMPARE(rowsMovedSpy.count(), 0);
0384     QCOMPARE(rowsInsertedSpy.count(), 0);
0385     QCOMPARE(persistentStateChangedSpy.count(), 0);
0386     QCOMPARE(dataChangedSpy.count(), 0);
0387     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0388     QCOMPARE(newEntryInListSpy.count(), 0);
0389 
0390     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}}, {}, {});
0391 
0392     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0393     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0394     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0395     QCOMPARE(rowsRemovedSpy.count(), 0);
0396     QCOMPARE(rowsMovedSpy.count(), 0);
0397     QCOMPARE(rowsInsertedSpy.count(), 1);
0398     QCOMPARE(persistentStateChangedSpy.count(), 1);
0399     QCOMPARE(dataChangedSpy.count(), 0);
0400     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0401     QCOMPARE(newEntryInListSpy.count(), 1);
0402 
0403     QCOMPARE(myPlayListProxyModel.rowCount(), 1);
0404 
0405     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
0406 
0407     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
0408     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0409     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0410     QCOMPARE(rowsRemovedSpy.count(), 1);
0411     QCOMPARE(rowsMovedSpy.count(), 0);
0412     QCOMPARE(rowsInsertedSpy.count(), 2);
0413     QCOMPARE(persistentStateChangedSpy.count(), 3);
0414     QCOMPARE(dataChangedSpy.count(), 0);
0415     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0416     QCOMPARE(newEntryInListSpy.count(), 1);
0417 
0418     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
0419 
0420     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0421     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0422     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0423     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0424     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0425     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
0426     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1);
0427     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0428     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0429     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0430     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0431     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0432     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
0433     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0434     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0435     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0436     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0437     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0438     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0439     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
0440     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0441     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0442     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0443     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0444     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0445     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0446     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
0447     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0448     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0449     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0450     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0451     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0452     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0453     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
0454     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0455     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
0456     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0457     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0458     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
0459     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0460     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
0461     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0462 }
0463 
0464 void MediaPlayListProxyModelTest::enqueueMultipleAlbumsCase()
0465 {
0466     MediaPlayList myPlayList;
0467     QAbstractItemModelTester testModel(&myPlayList);
0468     MediaPlayListProxyModel myPlayListProxyModel;
0469     myPlayListProxyModel.setPlayListModel(&myPlayList);
0470     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0471     DatabaseInterface myDatabaseContent;
0472     TracksListener myListener(&myDatabaseContent);
0473 
0474     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0475     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0476     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0477     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0478     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0479     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0480     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0481     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0482     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0483     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0484     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0485 
0486     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0487     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0488     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0489     QCOMPARE(rowsRemovedSpy.count(), 0);
0490     QCOMPARE(rowsMovedSpy.count(), 0);
0491     QCOMPARE(rowsInsertedSpy.count(), 0);
0492     QCOMPARE(dataChangedSpy.count(), 0);
0493     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0494     QCOMPARE(newEntryInListSpy.count(), 0);
0495 
0496     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0497 
0498     connect(&myListener, &TracksListener::trackHasChanged,
0499             &myPlayList, &MediaPlayList::trackChanged,
0500             Qt::QueuedConnection);
0501     connect(&myListener, &TracksListener::tracksListAdded,
0502             &myPlayList, &MediaPlayList::tracksListAdded,
0503             Qt::QueuedConnection);
0504     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0505             &myListener, &TracksListener::trackByNameInList,
0506             Qt::QueuedConnection);
0507     connect(&myPlayList, &MediaPlayList::newEntryInList,
0508             &myListener, &TracksListener::newEntryInList,
0509             Qt::QueuedConnection);
0510     connect(&myPlayList, &MediaPlayList::newUrlInList,
0511             &myListener, &TracksListener::newUrlInList,
0512             Qt::QueuedConnection);
0513     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0514             &myListener, &TracksListener::tracksAdded);
0515 
0516     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0517 
0518     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0519     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0520     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0521     QCOMPARE(rowsRemovedSpy.count(), 0);
0522     QCOMPARE(rowsMovedSpy.count(), 0);
0523     QCOMPARE(rowsInsertedSpy.count(), 0);
0524     QCOMPARE(dataChangedSpy.count(), 0);
0525     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0526     QCOMPARE(newEntryInListSpy.count(), 0);
0527 
0528     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
0529                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
0530                                    QStringLiteral("album2"), {}},
0531                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Album},
0532                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"))}},
0533                                    QStringLiteral("album3"), {}}}, {}, {});
0534 
0535     QVERIFY(rowsAboutToBeInsertedSpy.wait());
0536 
0537     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
0538     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0539     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
0540     QCOMPARE(rowsRemovedSpy.count(), 2);
0541     QCOMPARE(rowsMovedSpy.count(), 0);
0542     QCOMPARE(rowsInsertedSpy.count(), 3);
0543     QCOMPARE(persistentStateChangedSpy.count(), 5);
0544     QCOMPARE(dataChangedSpy.count(), 0);
0545     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0546     QCOMPARE(newEntryInListSpy.count(), 2);
0547 
0548     QCOMPARE(myPlayListProxyModel.rowCount(), 9);
0549 
0550     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0551     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0552     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0553     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0554     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0555     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
0556     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0557     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0558     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0559     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0560     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0561     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0562     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
0563     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0564     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0565     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0566     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0567     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0568     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0569     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
0570     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0571     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0572     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0573     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0574     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0575     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0576     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
0577     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0578     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
0579     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0580     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0581     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
0582     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0583     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
0584     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0585     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
0586     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0587     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
0588     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
0589     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0590     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
0591     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0592     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0593     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
0594     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
0595     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0596     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0597     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 11);
0598     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
0599     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0600     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
0601     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
0602     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0603     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0604     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 12);
0605     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
0606     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0607     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
0608     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
0609     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0610     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0611     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 13);
0612     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
0613 }
0614 
0615 void MediaPlayListProxyModelTest::enqueueTrackByUrl()
0616 {
0617     MediaPlayList myPlayList;
0618     QAbstractItemModelTester testModel(&myPlayList);
0619     MediaPlayListProxyModel myPlayListProxyModel;
0620     myPlayListProxyModel.setPlayListModel(&myPlayList);
0621     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0622     DatabaseInterface myDatabaseContent;
0623     TracksListener myListener(&myDatabaseContent);
0624 
0625     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0626     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0627     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0628     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0629     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0630     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0631     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0632     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0633     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0634     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0635     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0636 
0637     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0638     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0639     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0640     QCOMPARE(rowsRemovedSpy.count(), 0);
0641     QCOMPARE(rowsMovedSpy.count(), 0);
0642     QCOMPARE(rowsInsertedSpy.count(), 0);
0643     QCOMPARE(persistentStateChangedSpy.count(), 0);
0644     QCOMPARE(dataChangedSpy.count(), 0);
0645     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0646     QCOMPARE(newEntryInListSpy.count(), 0);
0647     QCOMPARE(newUrlInListSpy.count(), 0);
0648 
0649     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0650 
0651     connect(&myListener, &TracksListener::trackHasChanged,
0652             &myPlayList, &MediaPlayList::trackChanged,
0653             Qt::QueuedConnection);
0654     connect(&myListener, &TracksListener::tracksListAdded,
0655             &myPlayList, &MediaPlayList::tracksListAdded,
0656             Qt::QueuedConnection);
0657     connect(&myPlayList, &MediaPlayList::newEntryInList,
0658             &myListener, &TracksListener::newEntryInList,
0659             Qt::QueuedConnection);
0660     connect(&myPlayList, &MediaPlayList::newUrlInList,
0661             &myListener, &TracksListener::newUrlInList,
0662             Qt::QueuedConnection);
0663     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0664             &myListener, &TracksListener::trackByNameInList,
0665             Qt::QueuedConnection);
0666     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0667             &myListener, &TracksListener::tracksAdded);
0668 
0669     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0670 
0671     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0672     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0673     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0674     QCOMPARE(rowsRemovedSpy.count(), 0);
0675     QCOMPARE(rowsMovedSpy.count(), 0);
0676     QCOMPARE(rowsInsertedSpy.count(), 0);
0677     QCOMPARE(persistentStateChangedSpy.count(), 0);
0678     QCOMPARE(dataChangedSpy.count(), 0);
0679     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0680     QCOMPARE(newEntryInListSpy.count(), 0);
0681     QCOMPARE(newUrlInListSpy.count(), 0);
0682 
0683     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0684     auto trackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
0685     myPlayListProxyModel.enqueue({{DataTypes::ElementTypeRole, ElisaUtils::Track},
0686                                   {DataTypes::ResourceRole, trackData.resourceURI()}}, {}, {}, {});
0687 
0688     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0689     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0690     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0691     QCOMPARE(rowsRemovedSpy.count(), 0);
0692     QCOMPARE(rowsMovedSpy.count(), 0);
0693     QCOMPARE(rowsInsertedSpy.count(), 1);
0694     QCOMPARE(persistentStateChangedSpy.count(), 1);
0695     QCOMPARE(dataChangedSpy.count(), 0);
0696     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0697     QCOMPARE(newEntryInListSpy.count(), 0);
0698     QCOMPARE(newUrlInListSpy.count(), 1);
0699 
0700     QCOMPARE(dataChangedSpy.wait(), true);
0701 
0702     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0703     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0704     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0705     QCOMPARE(rowsRemovedSpy.count(), 0);
0706     QCOMPARE(rowsMovedSpy.count(), 0);
0707     QCOMPARE(rowsInsertedSpy.count(), 1);
0708     QCOMPARE(persistentStateChangedSpy.count(), 1);
0709     QCOMPARE(dataChangedSpy.count(), 1);
0710     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0711     QCOMPARE(newEntryInListSpy.count(), 0);
0712     QCOMPARE(newUrlInListSpy.count(), 1);
0713 }
0714 
0715 void MediaPlayListProxyModelTest::enqueueTracksByUrl()
0716 {
0717     MediaPlayList myPlayList;
0718     QAbstractItemModelTester testModel(&myPlayList);
0719     MediaPlayListProxyModel myPlayListProxyModel;
0720     myPlayListProxyModel.setPlayListModel(&myPlayList);
0721     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0722     DatabaseInterface myDatabaseContent;
0723     TracksListener myListener(&myDatabaseContent);
0724 
0725     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0726     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0727     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0728     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0729     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0730     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0731     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0732     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0733     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0734     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0735     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0736 
0737     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0738     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0739     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0740     QCOMPARE(rowsRemovedSpy.count(), 0);
0741     QCOMPARE(rowsMovedSpy.count(), 0);
0742     QCOMPARE(rowsInsertedSpy.count(), 0);
0743     QCOMPARE(persistentStateChangedSpy.count(), 0);
0744     QCOMPARE(dataChangedSpy.count(), 0);
0745     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0746     QCOMPARE(newEntryInListSpy.count(), 0);
0747     QCOMPARE(newUrlInListSpy.count(), 0);
0748 
0749     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0750 
0751     connect(&myListener, &TracksListener::trackHasChanged,
0752             &myPlayList, &MediaPlayList::trackChanged,
0753             Qt::QueuedConnection);
0754     connect(&myListener, &TracksListener::tracksListAdded,
0755             &myPlayList, &MediaPlayList::tracksListAdded,
0756             Qt::QueuedConnection);
0757     connect(&myPlayList, &MediaPlayList::newEntryInList,
0758             &myListener, &TracksListener::newEntryInList,
0759             Qt::QueuedConnection);
0760     connect(&myPlayList, &MediaPlayList::newUrlInList,
0761             &myListener, &TracksListener::newUrlInList,
0762             Qt::QueuedConnection);
0763     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0764             &myListener, &TracksListener::trackByNameInList,
0765             Qt::QueuedConnection);
0766     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0767             &myListener, &TracksListener::tracksAdded);
0768 
0769     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0770 
0771     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0772     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0773     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0774     QCOMPARE(rowsRemovedSpy.count(), 0);
0775     QCOMPARE(rowsMovedSpy.count(), 0);
0776     QCOMPARE(rowsInsertedSpy.count(), 0);
0777     QCOMPARE(persistentStateChangedSpy.count(), 0);
0778     QCOMPARE(dataChangedSpy.count(), 0);
0779     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0780     QCOMPARE(newEntryInListSpy.count(), 0);
0781     QCOMPARE(newUrlInListSpy.count(), 0);
0782 
0783     auto firstNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0784     auto firstTrackData = myDatabaseContent.trackDataFromDatabaseId(firstNewTrackID);
0785     auto secondNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
0786     auto secondTrackData = myDatabaseContent.trackDataFromDatabaseId(secondNewTrackID);
0787     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
0788                                     {DataTypes::ResourceRole, firstTrackData.resourceURI()}}, {}, {}},
0789                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
0790                                     {DataTypes::ResourceRole, secondTrackData.resourceURI()}}, {}, {}}}, {}, {});
0791 
0792     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0793     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0794     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0795     QCOMPARE(rowsRemovedSpy.count(), 0);
0796     QCOMPARE(rowsMovedSpy.count(), 0);
0797     QCOMPARE(rowsInsertedSpy.count(), 1);
0798     QCOMPARE(persistentStateChangedSpy.count(), 1);
0799     QCOMPARE(dataChangedSpy.count(), 0);
0800     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0801     QCOMPARE(newEntryInListSpy.count(), 0);
0802     QCOMPARE(newUrlInListSpy.count(), 2);
0803 
0804     QCOMPARE(dataChangedSpy.wait(), true);
0805 
0806     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0807     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0808     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0809     QCOMPARE(rowsRemovedSpy.count(), 0);
0810     QCOMPARE(rowsMovedSpy.count(), 0);
0811     QCOMPARE(rowsInsertedSpy.count(), 1);
0812     QCOMPARE(persistentStateChangedSpy.count(), 1);
0813     QCOMPARE(dataChangedSpy.count(), 2);
0814     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0815     QCOMPARE(newEntryInListSpy.count(), 0);
0816     QCOMPARE(newUrlInListSpy.count(), 2);
0817 }
0818 
0819 void MediaPlayListProxyModelTest::enqueueReplaceAndPlay()
0820 {
0821     MediaPlayList myPlayList;
0822     QAbstractItemModelTester testModel(&myPlayList);
0823     MediaPlayListProxyModel myPlayListProxyModel;
0824     myPlayListProxyModel.setPlayListModel(&myPlayList);
0825     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
0826     DatabaseInterface myDatabaseContent;
0827     TracksListener myListener(&myDatabaseContent);
0828 
0829     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
0830     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
0831     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
0832     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
0833     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
0834     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
0835     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
0836     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
0837     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0838     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0839     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0840 
0841     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0842     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0843     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0844     QCOMPARE(rowsRemovedSpy.count(), 0);
0845     QCOMPARE(rowsMovedSpy.count(), 0);
0846     QCOMPARE(rowsInsertedSpy.count(), 0);
0847     QCOMPARE(persistentStateChangedSpy.count(), 0);
0848     QCOMPARE(dataChangedSpy.count(), 0);
0849     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0850     QCOMPARE(newEntryInListSpy.count(), 0);
0851 
0852     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0853 
0854     connect(&myListener, &TracksListener::trackHasChanged,
0855             &myPlayList, &MediaPlayList::trackChanged,
0856             Qt::QueuedConnection);
0857     connect(&myListener, &TracksListener::tracksListAdded,
0858             &myPlayList, &MediaPlayList::tracksListAdded,
0859             Qt::QueuedConnection);
0860     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0861             &myListener, &TracksListener::trackByNameInList,
0862             Qt::QueuedConnection);
0863     connect(&myPlayList, &MediaPlayList::newEntryInList,
0864             &myListener, &TracksListener::newEntryInList,
0865             Qt::QueuedConnection);
0866     connect(&myPlayList, &MediaPlayList::newUrlInList,
0867             &myListener, &TracksListener::newUrlInList,
0868             Qt::QueuedConnection);
0869     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0870             &myListener, &TracksListener::tracksAdded);
0871 
0872     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0873 
0874     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0875     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0876     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0877     QCOMPARE(rowsRemovedSpy.count(), 0);
0878     QCOMPARE(rowsMovedSpy.count(), 0);
0879     QCOMPARE(rowsInsertedSpy.count(), 0);
0880     QCOMPARE(persistentStateChangedSpy.count(), 0);
0881     QCOMPARE(dataChangedSpy.count(), 0);
0882     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0883     QCOMPARE(newEntryInListSpy.count(), 0);
0884 
0885     auto firstTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"),
0886                                                                                QStringLiteral("album2"), 6, 1);
0887     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, firstTrackID},{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
0888 
0889     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0890     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0891     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0892     QCOMPARE(rowsRemovedSpy.count(), 0);
0893     QCOMPARE(rowsMovedSpy.count(), 0);
0894     QCOMPARE(rowsInsertedSpy.count(), 1);
0895     QCOMPARE(persistentStateChangedSpy.count(), 1);
0896     QCOMPARE(dataChangedSpy.count(), 0);
0897     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0898     QCOMPARE(newEntryInListSpy.count(), 1);
0899 
0900     QCOMPARE(dataChangedSpy.wait(), true);
0901 
0902     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0903     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0904     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0905     QCOMPARE(rowsRemovedSpy.count(), 0);
0906     QCOMPARE(rowsMovedSpy.count(), 0);
0907     QCOMPARE(rowsInsertedSpy.count(), 1);
0908     QCOMPARE(persistentStateChangedSpy.count(), 1);
0909     QCOMPARE(dataChangedSpy.count(), 1);
0910     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0911     QCOMPARE(newEntryInListSpy.count(), 1);
0912 
0913     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
0914     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0915     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
0916     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
0917     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0918     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
0919 
0920     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
0921     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
0922 
0923     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0924     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0925     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0926     QCOMPARE(rowsRemovedSpy.count(), 0);
0927     QCOMPARE(rowsMovedSpy.count(), 0);
0928     QCOMPARE(rowsInsertedSpy.count(), 2);
0929     QCOMPARE(persistentStateChangedSpy.count(), 2);
0930     QCOMPARE(dataChangedSpy.count(), 1);
0931     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0932     QCOMPARE(newEntryInListSpy.count(), 2);
0933 
0934     QCOMPARE(dataChangedSpy.wait(), true);
0935 
0936     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0937     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0938     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0939     QCOMPARE(rowsRemovedSpy.count(), 0);
0940     QCOMPARE(rowsMovedSpy.count(), 0);
0941     QCOMPARE(rowsInsertedSpy.count(), 2);
0942     QCOMPARE(persistentStateChangedSpy.count(), 2);
0943     QCOMPARE(dataChangedSpy.count(), 2);
0944     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0945     QCOMPARE(newEntryInListSpy.count(), 2);
0946 
0947     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0948     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0949     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0950     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0951     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0952 
0953     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
0954                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}},
0955                                    QStringLiteral("album1"), {}}},
0956                                  ElisaUtils::ReplacePlayList,
0957                                  ElisaUtils::TriggerPlay);
0958 
0959     QVERIFY(rowsAboutToBeInsertedSpy.wait());
0960 
0961     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
0962     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0963     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
0964     QCOMPARE(rowsRemovedSpy.count(), 2);
0965     QCOMPARE(rowsMovedSpy.count(), 0);
0966     QCOMPARE(rowsInsertedSpy.count(), 4);
0967     QCOMPARE(persistentStateChangedSpy.count(), 6);
0968     QCOMPARE(dataChangedSpy.count(), 2);
0969     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0970     QCOMPARE(newEntryInListSpy.count(), 3);
0971 
0972     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0973     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0974     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0975     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0976     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0977     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
0978     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0979     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0980     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
0981     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0982     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
0983     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
0984     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0985     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0986     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
0987     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0988     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
0989     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
0990     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0991     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0992     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4"));
0993     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0994     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4);
0995     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4);
0996 }
0997 
0998 void MediaPlayListProxyModelTest::removeFirstTrackOfAlbum()
0999 {
1000     MediaPlayList myPlayList;
1001     QAbstractItemModelTester testModel(&myPlayList);
1002     MediaPlayListProxyModel myPlayListProxyModel;
1003     myPlayListProxyModel.setPlayListModel(&myPlayList);
1004     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1005     DatabaseInterface myDatabaseContent;
1006     TracksListener myListener(&myDatabaseContent);
1007 
1008     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
1009     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
1010     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
1011     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
1012     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
1013     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
1014     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
1015     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
1016     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1017     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1018     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1019 
1020     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1021     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1022     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1023     QCOMPARE(rowsRemovedSpy.count(), 0);
1024     QCOMPARE(rowsMovedSpy.count(), 0);
1025     QCOMPARE(rowsInsertedSpy.count(), 0);
1026     QCOMPARE(persistentStateChangedSpy.count(), 0);
1027     QCOMPARE(dataChangedSpy.count(), 0);
1028     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1029     QCOMPARE(newEntryInListSpy.count(), 0);
1030 
1031     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1032 
1033     connect(&myListener, &TracksListener::trackHasChanged,
1034             &myPlayList, &MediaPlayList::trackChanged,
1035             Qt::QueuedConnection);
1036     connect(&myListener, &TracksListener::tracksListAdded,
1037             &myPlayList, &MediaPlayList::tracksListAdded,
1038             Qt::QueuedConnection);
1039     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1040             &myListener, &TracksListener::trackByNameInList,
1041             Qt::QueuedConnection);
1042     connect(&myPlayList, &MediaPlayList::newEntryInList,
1043             &myListener, &TracksListener::newEntryInList,
1044             Qt::QueuedConnection);
1045     connect(&myPlayList, &MediaPlayList::newUrlInList,
1046             &myListener, &TracksListener::newUrlInList,
1047             Qt::QueuedConnection);
1048     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1049             &myListener, &TracksListener::tracksAdded);
1050 
1051     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1052 
1053     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1054     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1055     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1056     QCOMPARE(rowsRemovedSpy.count(), 0);
1057     QCOMPARE(rowsMovedSpy.count(), 0);
1058     QCOMPARE(rowsInsertedSpy.count(), 0);
1059     QCOMPARE(persistentStateChangedSpy.count(), 0);
1060     QCOMPARE(dataChangedSpy.count(), 0);
1061     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1062     QCOMPARE(newEntryInListSpy.count(), 0);
1063 
1064     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
1065                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
1066                                    QStringLiteral("album2"), {}}}, {}, {});
1067 
1068     QVERIFY(rowsAboutToBeInsertedSpy.wait());
1069 
1070     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1071     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1072     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1073     QCOMPARE(rowsRemovedSpy.count(), 1);
1074     QCOMPARE(rowsMovedSpy.count(), 0);
1075     QCOMPARE(rowsInsertedSpy.count(), 2);
1076     QCOMPARE(persistentStateChangedSpy.count(), 3);
1077     QCOMPARE(dataChangedSpy.count(), 0);
1078     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1079     QCOMPARE(newEntryInListSpy.count(), 1);
1080 
1081     myPlayListProxyModel.removeRow(0);
1082 
1083     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
1084     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1085     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1086     QCOMPARE(rowsRemovedSpy.count(), 2);
1087     QCOMPARE(rowsMovedSpy.count(), 0);
1088     QCOMPARE(rowsInsertedSpy.count(), 2);
1089     QCOMPARE(persistentStateChangedSpy.count(), 4);
1090     QCOMPARE(dataChangedSpy.count(), 0);
1091     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1092     QCOMPARE(newEntryInListSpy.count(), 1);
1093 }
1094 
1095 void MediaPlayListProxyModelTest::testSaveLoadPlayList()
1096 {
1097     MediaPlayList myPlayListSave;
1098     MediaPlayListProxyModel myPlayListProxyModelSave;
1099     myPlayListProxyModelSave.setPlayListModel(&myPlayListSave);
1100     QAbstractItemModelTester testModelSave(&myPlayListProxyModelSave);
1101     DatabaseInterface myDatabaseContent;
1102     TracksListener myListenerSave(&myDatabaseContent);
1103     MediaPlayList myPlayListRestore;
1104     MediaPlayListProxyModel myPlayListProxyModelRestore;
1105     myPlayListProxyModelRestore.setPlayListModel(&myPlayListRestore);
1106     QAbstractItemModelTester testModelRestore(&myPlayListProxyModelRestore);
1107     TracksListener myListenerRestore(&myDatabaseContent);
1108 
1109     QSignalSpy currentTrackChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::currentTrackChanged);
1110     QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::shufflePlayListChanged);
1111     QSignalSpy repeatModeChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::repeatModeChanged);
1112     QSignalSpy playListFinishedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListFinished);
1113     QSignalSpy playListLoadedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoaded);
1114     QSignalSpy playListLoadFailedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoadFailed);
1115     QSignalSpy dataChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::dataChanged);
1116     QSignalSpy currentTrackChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::currentTrackChanged);
1117     QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::shufflePlayListChanged);
1118     QSignalSpy repeatModeChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::repeatModeChanged);
1119     QSignalSpy playListFinishedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListFinished);
1120     QSignalSpy playListLoadedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoaded);
1121     QSignalSpy playListLoadFailedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoadFailed);
1122 
1123     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1124 
1125     connect(&myListenerSave, &TracksListener::trackHasChanged,
1126             &myPlayListSave, &MediaPlayList::trackChanged,
1127             Qt::QueuedConnection);
1128     connect(&myListenerSave, &TracksListener::tracksListAdded,
1129             &myPlayListSave, &MediaPlayList::tracksListAdded,
1130             Qt::QueuedConnection);
1131     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1132             &myListenerSave, &TracksListener::trackByNameInList,
1133             Qt::QueuedConnection);
1134     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1135             &myListenerSave, &TracksListener::newEntryInList,
1136             Qt::QueuedConnection);
1137     connect(&myPlayListSave, &MediaPlayList::newUrlInList,
1138             &myListenerSave, &TracksListener::newUrlInList,
1139             Qt::QueuedConnection);
1140     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1141             &myListenerSave, &TracksListener::tracksAdded);
1142     connect(&myListenerRestore, &TracksListener::trackHasChanged,
1143             &myPlayListRestore, &MediaPlayList::trackChanged,
1144             Qt::QueuedConnection);
1145     connect(&myListenerRestore, &TracksListener::tracksListAdded,
1146             &myPlayListRestore, &MediaPlayList::tracksListAdded,
1147             Qt::QueuedConnection);
1148     connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList,
1149             &myListenerRestore, &TracksListener::trackByNameInList,
1150             Qt::QueuedConnection);
1151     connect(&myPlayListRestore, &MediaPlayList::newEntryInList,
1152             &myListenerRestore, &TracksListener::newEntryInList,
1153             Qt::QueuedConnection);
1154     connect(&myPlayListRestore, &MediaPlayList::newUrlInList,
1155             &myListenerRestore, &TracksListener::newUrlInList,
1156             Qt::QueuedConnection);
1157     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1158             &myListenerRestore, &TracksListener::tracksAdded);
1159 
1160     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1161     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1162     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1163     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1164     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1165     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1166     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1167     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1168     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1169     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1170     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1171     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1172 
1173     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1174 
1175     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1176     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1177     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1178     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1179     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1180     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1181     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1182     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1183     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1184     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1185     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1186     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1187 
1188     myPlayListProxyModelSave.enqueue(
1189         {{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1190            {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}},
1191           {},
1192           {}},
1193          {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1194            {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}},
1195           {},
1196           {}}},
1197         {},
1198         {});
1199 
1200     QVERIFY(dataChangedSaveSpy.wait());
1201 
1202     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1203     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1204     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1205     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1206     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1207     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1208     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1209     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1210     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1211     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1212     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1213     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1214 
1215     QCOMPARE(myPlayListProxyModelSave.currentTrack(), QPersistentModelIndex(myPlayListProxyModelSave.index(0, 0)));
1216 
1217     QTemporaryFile playlistFile(QStringLiteral("./myPlaylistXXXXXX.m3u8"));
1218     playlistFile.open();
1219 
1220     QCOMPARE(myPlayListProxyModelSave.savePlayList(QUrl::fromLocalFile(playlistFile.fileName())), true);
1221 
1222     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1223     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1224     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1225     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1226     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1227     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1228     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1229     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1230     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1231     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1232     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1233     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1234 
1235     myPlayListProxyModelRestore.loadPlayList(QUrl::fromLocalFile(playlistFile.fileName()));
1236 
1237     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1238     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1239     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1240     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1241     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1242     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1243     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1244     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1245     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1246     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1247     QCOMPARE(playListLoadedRestoreSpy.count(), 1);
1248     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1249 
1250     QCOMPARE(currentTrackChangedRestoreSpy.wait(), true);
1251 
1252     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1253     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1254     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1255     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1256     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1257     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1258     QCOMPARE(currentTrackChangedRestoreSpy.count(), 1);
1259     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1260     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1261     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1262     QCOMPARE(playListLoadedRestoreSpy.count(), 1);
1263     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1264 
1265     QCOMPARE(myPlayListProxyModelRestore.currentTrack(), QPersistentModelIndex(myPlayListProxyModelRestore.index(0, 0)));
1266 }
1267 
1268 void MediaPlayListProxyModelTest::testSavePersistentState()
1269 {
1270     MediaPlayList myPlayListSave;
1271     QAbstractItemModelTester testModelSave(&myPlayListSave);
1272     MediaPlayListProxyModel myPlayListSaveProxyModel;
1273     myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave);
1274     QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel);
1275     DatabaseInterface myDatabaseContent;
1276     TracksListener myListenerSave(&myDatabaseContent);
1277     MediaPlayList myPlayListRead;
1278     QAbstractItemModelTester testModelRead(&myPlayListRead);
1279     MediaPlayListProxyModel myPlayListReadProxyModel;
1280     myPlayListReadProxyModel.setPlayListModel(&myPlayListRead);
1281     QAbstractItemModelTester testProxyModelRead(&myPlayListReadProxyModel);
1282     TracksListener myListenerRead(&myDatabaseContent);
1283 
1284     QSignalSpy rowsAboutToBeMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
1285     QSignalSpy rowsAboutToBeRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
1286     QSignalSpy rowsAboutToBeInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
1287     QSignalSpy rowsMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsMoved);
1288     QSignalSpy rowsRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsRemoved);
1289     QSignalSpy rowsInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsInserted);
1290     QSignalSpy persistentStateChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
1291     QSignalSpy dataChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged);
1292     QSignalSpy rowsAboutToBeMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
1293     QSignalSpy rowsAboutToBeRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
1294     QSignalSpy rowsAboutToBeInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
1295     QSignalSpy rowsMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsMoved);
1296     QSignalSpy rowsRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsRemoved);
1297     QSignalSpy rowsInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsInserted);
1298     QSignalSpy persistentStateChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
1299     QSignalSpy dataChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::dataChanged);
1300 
1301     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1302     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1303     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0);
1304     QCOMPARE(rowsRemovedSpySave.count(), 0);
1305     QCOMPARE(rowsMovedSpySave.count(), 0);
1306     QCOMPARE(rowsInsertedSpySave.count(), 0);
1307     QCOMPARE(persistentStateChangedSpySave.count(), 0);
1308     QCOMPARE(dataChangedSpySave.count(), 0);
1309     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1310     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1311     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1312     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1313     QCOMPARE(rowsMovedSpyRead.count(), 0);
1314     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1315     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1316     QCOMPARE(dataChangedSpyRead.count(), 0);
1317 
1318     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1319 
1320     connect(&myListenerSave, &TracksListener::trackHasChanged,
1321             &myPlayListSave, &MediaPlayList::trackChanged,
1322             Qt::QueuedConnection);
1323     connect(&myListenerSave, &TracksListener::tracksListAdded,
1324             &myPlayListSave, &MediaPlayList::tracksListAdded,
1325             Qt::QueuedConnection);
1326     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1327             &myListenerSave, &TracksListener::trackByNameInList,
1328             Qt::QueuedConnection);
1329     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1330             &myListenerSave, &TracksListener::newEntryInList,
1331             Qt::QueuedConnection);
1332     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1333             &myListenerSave, &TracksListener::tracksAdded);
1334     connect(&myListenerRead, &TracksListener::trackHasChanged,
1335             &myPlayListRead, &MediaPlayList::trackChanged,
1336             Qt::QueuedConnection);
1337     connect(&myListenerRead, &TracksListener::tracksListAdded,
1338             &myPlayListRead, &MediaPlayList::tracksListAdded,
1339             Qt::QueuedConnection);
1340     connect(&myPlayListRead, &MediaPlayList::newTrackByNameInList,
1341             &myListenerRead, &TracksListener::trackByNameInList,
1342             Qt::QueuedConnection);
1343     connect(&myPlayListRead, &MediaPlayList::newEntryInList,
1344             &myListenerRead, &TracksListener::newEntryInList,
1345             Qt::QueuedConnection);
1346     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1347             &myListenerRead, &TracksListener::tracksAdded);
1348 
1349     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1350 
1351     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1352     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1353     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0);
1354     QCOMPARE(rowsRemovedSpySave.count(), 0);
1355     QCOMPARE(rowsMovedSpySave.count(), 0);
1356     QCOMPARE(rowsInsertedSpySave.count(), 0);
1357     QCOMPARE(persistentStateChangedSpySave.count(), 0);
1358     QCOMPARE(dataChangedSpySave.count(), 0);
1359     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1360     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1361     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1362     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1363     QCOMPARE(rowsMovedSpyRead.count(), 0);
1364     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1365     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1366     QCOMPARE(dataChangedSpyRead.count(), 0);
1367 
1368     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
1369                                                                                QStringLiteral("album3"), 1, 1);
1370     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1371                                         {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
1372 
1373     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1374     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1375     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1);
1376     QCOMPARE(rowsRemovedSpySave.count(), 0);
1377     QCOMPARE(rowsMovedSpySave.count(), 0);
1378     QCOMPARE(rowsInsertedSpySave.count(), 1);
1379     QCOMPARE(persistentStateChangedSpySave.count(), 1);
1380     QCOMPARE(dataChangedSpySave.count(), 0);
1381     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1382     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1383     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1384     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1385     QCOMPARE(rowsMovedSpyRead.count(), 0);
1386     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1387     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1388     QCOMPARE(dataChangedSpyRead.count(), 0);
1389 
1390     QCOMPARE(dataChangedSpySave.wait(), true);
1391 
1392     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1393     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1394     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1);
1395     QCOMPARE(rowsRemovedSpySave.count(), 0);
1396     QCOMPARE(rowsMovedSpySave.count(), 0);
1397     QCOMPARE(rowsInsertedSpySave.count(), 1);
1398     QCOMPARE(persistentStateChangedSpySave.count(), 1);
1399     QCOMPARE(dataChangedSpySave.count(), 1);
1400     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1401     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1402     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1403     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1404     QCOMPARE(rowsMovedSpyRead.count(), 0);
1405     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1406     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1407     QCOMPARE(dataChangedSpyRead.count(), 0);
1408 
1409     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1410                                                                                 QStringLiteral("album1"), 1, 1);
1411     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1412                                         {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
1413 
1414     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1415     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1416     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2);
1417     QCOMPARE(rowsRemovedSpySave.count(), 0);
1418     QCOMPARE(rowsMovedSpySave.count(), 0);
1419     QCOMPARE(rowsInsertedSpySave.count(), 2);
1420     QCOMPARE(persistentStateChangedSpySave.count(), 2);
1421     QCOMPARE(dataChangedSpySave.count(), 1);
1422     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1423     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1424     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1425     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1426     QCOMPARE(rowsMovedSpyRead.count(), 0);
1427     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1428     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1429     QCOMPARE(dataChangedSpyRead.count(), 0);
1430 
1431     QCOMPARE(dataChangedSpySave.wait(), true);
1432 
1433     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1434     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1435     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2);
1436     QCOMPARE(rowsRemovedSpySave.count(), 0);
1437     QCOMPARE(rowsMovedSpySave.count(), 0);
1438     QCOMPARE(rowsInsertedSpySave.count(), 2);
1439     QCOMPARE(persistentStateChangedSpySave.count(), 2);
1440     QCOMPARE(dataChangedSpySave.count(), 2);
1441     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1442     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1443     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1444     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1445     QCOMPARE(rowsMovedSpyRead.count(), 0);
1446     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1447     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1448     QCOMPARE(dataChangedSpyRead.count(), 0);
1449 
1450     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1451                                                                                QStringLiteral("album3"), 2, 1);
1452     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1453                                         {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
1454 
1455     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1456     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1457     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1458     QCOMPARE(rowsRemovedSpySave.count(), 0);
1459     QCOMPARE(rowsMovedSpySave.count(), 0);
1460     QCOMPARE(rowsInsertedSpySave.count(), 3);
1461     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1462     QCOMPARE(dataChangedSpySave.count(), 2);
1463     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1464     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1465     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1466     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1467     QCOMPARE(rowsMovedSpyRead.count(), 0);
1468     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1469     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1470     QCOMPARE(dataChangedSpyRead.count(), 0);
1471 
1472     QCOMPARE(dataChangedSpySave.wait(), true);
1473 
1474     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1475     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1476     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1477     QCOMPARE(rowsRemovedSpySave.count(), 0);
1478     QCOMPARE(rowsMovedSpySave.count(), 0);
1479     QCOMPARE(rowsInsertedSpySave.count(), 3);
1480     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1481     QCOMPARE(dataChangedSpySave.count(), 3);
1482     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1483     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1484     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1485     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1486     QCOMPARE(rowsMovedSpyRead.count(), 0);
1487     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1488     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1489     QCOMPARE(dataChangedSpyRead.count(), 0);
1490 
1491     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1492     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1493     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11);
1494     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1495     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1496     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1497     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1498     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1499     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1500     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11")));
1501     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1502     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1503     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1504     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1505     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1506     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1507     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1508     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1509     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1510     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1511     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
1512     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1")));
1513     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1514     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
1515     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1516     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1517     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12);
1518     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1519     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1520     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1521     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1522     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1523     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1524     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12")));
1525     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1526     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1527 
1528     myPlayListReadProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState());
1529 
1530     QCOMPARE(dataChangedSpyRead.wait(), true);
1531 
1532     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1533     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1534     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1535     QCOMPARE(rowsRemovedSpySave.count(), 0);
1536     QCOMPARE(rowsMovedSpySave.count(), 0);
1537     QCOMPARE(rowsInsertedSpySave.count(), 3);
1538     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1539     QCOMPARE(dataChangedSpySave.count(), 3);
1540     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1541     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1542     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 1);
1543     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1544     QCOMPARE(rowsMovedSpyRead.count(), 0);
1545     QCOMPARE(rowsInsertedSpyRead.count(), 1);
1546     QCOMPARE(persistentStateChangedSpyRead.count(), 2);
1547     QCOMPARE(dataChangedSpyRead.count(), 3);
1548 
1549     QCOMPARE(myPlayListReadProxyModel.tracksCount(), 3);
1550 
1551     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1552     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1553     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11);
1554     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1555     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1556     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1557     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1558     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1559     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1560     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11")));
1561     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1562     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1563     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1564     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1565     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1566     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1567     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1568     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1569     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1570     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1571     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
1572     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1")));
1573     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1574     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
1575     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1576     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1577     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12);
1578     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1579     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1580     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1581     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1582     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1583     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1584     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12")));
1585     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1586     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1587 }
1588 
1589 void MediaPlayListProxyModelTest::testRestoreSettings()
1590 {
1591     MediaPlayList myPlayListModel;
1592     MediaPlayListProxyModel myPlayList;
1593     myPlayList.setPlayListModel(&myPlayListModel);
1594     QAbstractItemModelTester testModel(&myPlayList);
1595     DatabaseInterface myDatabaseContent;
1596     TracksListener myListener(&myDatabaseContent);
1597 
1598     QSignalSpy currentTrackChangedSpy(&myPlayList, &MediaPlayListProxyModel::currentTrackChanged);
1599     QSignalSpy shufflePlayListChangedSpy(&myPlayList, &MediaPlayListProxyModel::shufflePlayListChanged);
1600     QSignalSpy repeatModeChangedSpy(&myPlayList, &MediaPlayListProxyModel::repeatModeChanged);
1601     QSignalSpy playListFinishedSpy(&myPlayList, &MediaPlayListProxyModel::playListFinished);
1602     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
1603 
1604     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1605 
1606     connect(&myListener, &TracksListener::trackHasChanged,
1607             &myPlayListModel, &MediaPlayList::trackChanged,
1608             Qt::QueuedConnection);
1609     connect(&myListener, &TracksListener::tracksListAdded,
1610             &myPlayListModel, &MediaPlayList::tracksListAdded,
1611             Qt::QueuedConnection);
1612     connect(&myPlayListModel, &MediaPlayList::newTrackByNameInList,
1613             &myListener, &TracksListener::trackByNameInList,
1614             Qt::QueuedConnection);
1615     connect(&myPlayListModel, &MediaPlayList::newEntryInList,
1616             &myListener, &TracksListener::newEntryInList,
1617             Qt::QueuedConnection);
1618     connect(&myPlayListModel, &MediaPlayList::newUrlInList,
1619             &myListener, &TracksListener::newUrlInList,
1620             Qt::QueuedConnection);
1621     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1622             &myListener, &TracksListener::tracksAdded);
1623 
1624     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1625 
1626     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1627                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1628                          QStringLiteral("track1"), {}}}, {}, {});
1629     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1630                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1631                          QStringLiteral("track3"), {}}}, {}, {});
1632     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1633                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1634                          QStringLiteral("track5"), {}}}, {}, {});
1635     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1636                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1637                          QStringLiteral("track1"), {}}}, {}, {});
1638 
1639     QVERIFY(dataChangedSpy.wait());
1640 
1641     QCOMPARE(currentTrackChangedSpy.count(), 1);
1642     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1643     QCOMPARE(repeatModeChangedSpy.count(), 0);
1644     QCOMPARE(playListFinishedSpy.count(), 0);
1645 
1646     QVariantMap settings;
1647     settings[QStringLiteral("currentTrack")] = 2;
1648     settings[QStringLiteral("shufflePlayList")] = true;
1649     settings[QStringLiteral("repeatMode")] = true;
1650 
1651     myPlayList.setPersistentState(settings);
1652 
1653     QCOMPARE(currentTrackChangedSpy.count(), 2);
1654     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1655     QCOMPARE(repeatModeChangedSpy.count(), 1);
1656     QCOMPARE(playListFinishedSpy.count(), 0);
1657 }
1658 
1659 void MediaPlayListProxyModelTest::testSaveAndRestoreSettings()
1660 {
1661     MediaPlayList myPlayListSave;
1662     QAbstractItemModelTester testModelSave(&myPlayListSave);
1663     MediaPlayListProxyModel myPlayListSaveProxyModel;
1664     myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave);
1665     QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel);
1666     DatabaseInterface myDatabaseContent;
1667     TracksListener myListenerSave(&myDatabaseContent);
1668     MediaPlayList myPlayListRestore;
1669     QAbstractItemModelTester testModelRestore(&myPlayListRestore);
1670     MediaPlayListProxyModel myPlayListRestoreProxyModel;
1671     myPlayListRestoreProxyModel.setPlayListModel(&myPlayListRestore);
1672     QAbstractItemModelTester testProxyModelRestore(&myPlayListRestoreProxyModel);
1673     TracksListener myListenerRestore(&myDatabaseContent);
1674 
1675     QSignalSpy currentTrackChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1676     QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1677     QSignalSpy repeatModeChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1678     QSignalSpy playListFinishedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::playListFinished);
1679     QSignalSpy dataChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged);
1680     QSignalSpy currentTrackChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1681     QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1682     QSignalSpy repeatModeChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1683     QSignalSpy playListFinishedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::playListFinished);
1684 
1685     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1686 
1687     connect(&myListenerSave, &TracksListener::trackHasChanged,
1688             &myPlayListSave, &MediaPlayList::trackChanged,
1689             Qt::QueuedConnection);
1690     connect(&myListenerSave, &TracksListener::tracksListAdded,
1691             &myPlayListSave, &MediaPlayList::tracksListAdded,
1692             Qt::QueuedConnection);
1693     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1694             &myListenerSave, &TracksListener::trackByNameInList,
1695             Qt::QueuedConnection);
1696     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1697             &myListenerSave, &TracksListener::newEntryInList,
1698             Qt::QueuedConnection);
1699     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1700             &myListenerSave, &TracksListener::tracksAdded);
1701 
1702     connect(&myListenerRestore, &TracksListener::trackHasChanged,
1703             &myPlayListRestore, &MediaPlayList::trackChanged,
1704             Qt::QueuedConnection);
1705     connect(&myListenerRestore, &TracksListener::tracksListAdded,
1706             &myPlayListRestore, &MediaPlayList::tracksListAdded,
1707             Qt::QueuedConnection);
1708     connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList,
1709             &myListenerRestore, &TracksListener::trackByNameInList,
1710             Qt::QueuedConnection);
1711     connect(&myPlayListRestore, &MediaPlayList::newEntryInList,
1712             &myListenerRestore, &TracksListener::newEntryInList,
1713             Qt::QueuedConnection);
1714     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1715             &myListenerRestore, &TracksListener::tracksAdded);
1716 
1717     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1718     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1719     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1720     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1721     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1722     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1723     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1724     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1725 
1726     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1727     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1728     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1729     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1730     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1731     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1732     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1733     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1734 
1735     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1736 
1737     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1738     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1739     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1740     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1741     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1742     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1743     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1744     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1745 
1746     myPlayListSaveProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1747 
1748     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1749     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1750     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1751     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1752     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1753     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1754     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1755     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1756 
1757     myPlayListSaveProxyModel.setShufflePlayList(true);
1758 
1759     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1760     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1761     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1762     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1763     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1764     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1765     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1766     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1767 
1768     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1769                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1770                                        QStringLiteral("track1"), {}}}, {}, {});
1771     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1772                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1773                                        QStringLiteral("track3"), {}}}, {}, {});
1774     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1775                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1776                                        QStringLiteral("track5"), {}}}, {}, {});
1777     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1778                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}},
1779                                        QStringLiteral("track1"), {}}}, {}, {});
1780 
1781     QVERIFY(dataChangedSaveSpy.wait());
1782 
1783     QVERIFY(currentTrackChangedSaveSpy.count() >= 1);
1784     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1785     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1786     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1787     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1788     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1789     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1790     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1791 
1792     QCOMPARE(myPlayListSaveProxyModel.currentTrack(), QPersistentModelIndex(myPlayListSaveProxyModel.index(0, 0)));
1793 
1794     const auto oldCurrentTrackChangedCount = currentTrackChangedSaveSpy.count();
1795 
1796     myPlayListSaveProxyModel.skipNextTrack();
1797 
1798     QCOMPARE(currentTrackChangedSaveSpy.count(), oldCurrentTrackChangedCount + 1);
1799     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1800     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1801     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1802     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1803     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1804     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1805     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1806 
1807     myPlayListSaveProxyModel.skipNextTrack();
1808 
1809     QCOMPARE(currentTrackChangedSaveSpy.count(), oldCurrentTrackChangedCount + 2);
1810     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1811     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1812     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1813     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1814     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1815     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1816     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1817 
1818     myPlayListRestoreProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState());
1819 
1820     QCOMPARE(currentTrackChangedSaveSpy.count(), oldCurrentTrackChangedCount + 2);
1821     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1822     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1823     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1824     QCOMPARE(currentTrackChangedRestoreSpy.count(), 1);
1825     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 1);
1826     QCOMPARE(repeatModeChangedRestoreSpy.count(), 1);
1827     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1828 
1829     QCOMPARE(myPlayListRestoreProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
1830     QCOMPARE(myPlayListRestoreProxyModel.shufflePlayList(), true);
1831 }
1832 
1833 void MediaPlayListProxyModelTest::shufflePlayList()
1834 {
1835     MediaPlayList myPlayList;
1836     QAbstractItemModelTester testModel(&myPlayList);
1837     MediaPlayListProxyModel myPlayListProxyModel;
1838     myPlayListProxyModel.setPlayListModel(&myPlayList);
1839     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1840     DatabaseInterface myDatabaseContent;
1841     TracksListener myListener(&myDatabaseContent);
1842 
1843     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1844     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1845     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1846     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
1847 
1848     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1849 
1850     connect(&myListener, &TracksListener::trackHasChanged,
1851             &myPlayList, &MediaPlayList::trackChanged,
1852             Qt::QueuedConnection);
1853     connect(&myListener, &TracksListener::tracksListAdded,
1854             &myPlayList, &MediaPlayList::tracksListAdded,
1855             Qt::QueuedConnection);
1856     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1857             &myListener, &TracksListener::trackByNameInList,
1858             Qt::QueuedConnection);
1859     connect(&myPlayList, &MediaPlayList::newEntryInList,
1860             &myListener, &TracksListener::newEntryInList,
1861             Qt::QueuedConnection);
1862     connect(&myPlayList, &MediaPlayList::newUrlInList,
1863             &myListener, &TracksListener::newUrlInList,
1864             Qt::QueuedConnection);
1865     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1866             &myListener, &TracksListener::tracksAdded);
1867 
1868     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1869 
1870     QCOMPARE(currentTrackChangedSpy.count(), 0);
1871     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1872     QCOMPARE(repeatModeChangedSpy.count(), 0);
1873     QCOMPARE(playListFinishedSpy.count(), 0);
1874 
1875     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1876                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1877                                    QStringLiteral("track1"), {}}}, {}, {});
1878     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1879                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1880                                    QStringLiteral("track3"), {}}}, {}, {});
1881     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1882                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1883                                    QStringLiteral("track5"), {}}}, {}, {});
1884     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1885                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1886                                    QStringLiteral("track1"), {}}}, {}, {});
1887 
1888     QCOMPARE(currentTrackChangedSpy.count(), 1);
1889     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1890     QCOMPARE(repeatModeChangedSpy.count(), 0);
1891     QCOMPARE(playListFinishedSpy.count(), 0);
1892 
1893     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
1894 
1895     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1896     myPlayListProxyModel.setShufflePlayList(true);
1897 
1898     QCOMPARE(currentTrackChangedSpy.count(), 1);
1899     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1900     QCOMPARE(repeatModeChangedSpy.count(), 1);
1901     QCOMPARE(playListFinishedSpy.count(), 0);
1902 
1903     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
1904 
1905     myPlayListProxyModel.skipNextTrack();
1906 
1907     QCOMPARE(currentTrackChangedSpy.count(), 2);
1908     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1909     QCOMPARE(repeatModeChangedSpy.count(), 1);
1910     QCOMPARE(playListFinishedSpy.count(), 0);
1911 
1912     myPlayListProxyModel.skipNextTrack();
1913 
1914     QCOMPARE(currentTrackChangedSpy.count(), 3);
1915     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1916     QCOMPARE(repeatModeChangedSpy.count(), 1);
1917     QCOMPARE(playListFinishedSpy.count(), 0);
1918 
1919     myPlayListProxyModel.skipNextTrack();
1920 
1921     QCOMPARE(currentTrackChangedSpy.count(), 4);
1922     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1923     QCOMPARE(repeatModeChangedSpy.count(), 1);
1924     QCOMPARE(playListFinishedSpy.count(), 0);
1925 
1926     myPlayListProxyModel.skipNextTrack();
1927 
1928     QCOMPARE(currentTrackChangedSpy.count(), 5);
1929     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1930     QCOMPARE(repeatModeChangedSpy.count(), 1);
1931     QCOMPARE(playListFinishedSpy.count(), 0);
1932 }
1933 
1934 void MediaPlayListProxyModelTest::testShuffleMode()
1935 {
1936     MediaPlayList myPlayList;
1937     QAbstractItemModelTester testModel(&myPlayList);
1938     MediaPlayListProxyModel myPlayListProxyModel;
1939     myPlayListProxyModel.setPlayListModel(&myPlayList);
1940     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1941     DatabaseInterface myDatabaseContent;
1942     TracksListener myListener(&myDatabaseContent);
1943 
1944     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1945     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1946     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1947     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
1948 
1949     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1950 
1951     connect(&myListener, &TracksListener::trackHasChanged,
1952             &myPlayList, &MediaPlayList::trackChanged,
1953             Qt::QueuedConnection);
1954     connect(&myListener, &TracksListener::tracksListAdded,
1955             &myPlayList, &MediaPlayList::tracksListAdded,
1956             Qt::QueuedConnection);
1957     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1958             &myListener, &TracksListener::trackByNameInList,
1959             Qt::QueuedConnection);
1960     connect(&myPlayList, &MediaPlayList::newEntryInList,
1961             &myListener, &TracksListener::newEntryInList,
1962             Qt::QueuedConnection);
1963     connect(&myPlayList, &MediaPlayList::newUrlInList,
1964             &myListener, &TracksListener::newUrlInList,
1965             Qt::QueuedConnection);
1966     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1967             &myListener, &TracksListener::tracksAdded);
1968 
1969     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1970 
1971     QCOMPARE(currentTrackChangedSpy.count(), 0);
1972     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1973     QCOMPARE(repeatModeChangedSpy.count(), 0);
1974     QCOMPARE(playListFinishedSpy.count(), 0);
1975 
1976     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1977     myPlayListProxyModel.setShufflePlayList(true);
1978 
1979     QCOMPARE(currentTrackChangedSpy.count(), 0);
1980     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1981     QCOMPARE(repeatModeChangedSpy.count(), 1);
1982     QCOMPARE(playListFinishedSpy.count(), 0);
1983 
1984     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
1985     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
1986 
1987     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1988                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1989                                    QStringLiteral("track1"), {}}}, {}, {});
1990     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1991                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1992                                    QStringLiteral("track3"), {}}}, {}, {});
1993     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1994                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1995                                    QStringLiteral("track5"), {}}}, {}, {});
1996     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1997                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1998                                    QStringLiteral("track1"), {}}}, {}, {});
1999 
2000     QVERIFY(currentTrackChangedSpy.count() >= 1);
2001     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2002     QCOMPARE(repeatModeChangedSpy.count(), 1);
2003     QCOMPARE(playListFinishedSpy.count(), 0);
2004 
2005     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2006 
2007     const auto oldCurrentTrackChangedCount = currentTrackChangedSpy.count();
2008 
2009     myPlayListProxyModel.skipNextTrack();
2010 
2011     QCOMPARE(currentTrackChangedSpy.count(), oldCurrentTrackChangedCount + 1);
2012     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2013     QCOMPARE(repeatModeChangedSpy.count(), 1);
2014     QCOMPARE(playListFinishedSpy.count(), 0);
2015 
2016     myPlayListProxyModel.skipNextTrack();
2017 
2018     QCOMPARE(currentTrackChangedSpy.count(), oldCurrentTrackChangedCount + 2);
2019     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2020     QCOMPARE(repeatModeChangedSpy.count(), 1);
2021     QCOMPARE(playListFinishedSpy.count(), 0);
2022 
2023     myPlayListProxyModel.skipNextTrack();
2024 
2025     QCOMPARE(currentTrackChangedSpy.count(), oldCurrentTrackChangedCount + 3);
2026     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2027     QCOMPARE(repeatModeChangedSpy.count(), 1);
2028     QCOMPARE(playListFinishedSpy.count(), 0);
2029 
2030     myPlayListProxyModel.skipPreviousTrack(0);
2031 
2032     QCOMPARE(currentTrackChangedSpy.count(), oldCurrentTrackChangedCount + 4);
2033     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2034     QCOMPARE(repeatModeChangedSpy.count(), 1);
2035     QCOMPARE(playListFinishedSpy.count(), 0);
2036 
2037     myPlayListProxyModel.removeRow(1);
2038 }
2039 
2040 void MediaPlayListProxyModelTest::randomAndContinuePlayList()
2041 {
2042     MediaPlayList myPlayList;
2043     QAbstractItemModelTester testModel(&myPlayList);
2044     MediaPlayListProxyModel myPlayListProxyModel;
2045     myPlayListProxyModel.setPlayListModel(&myPlayList);
2046     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2047     DatabaseInterface myDatabaseContent;
2048     TracksListener myListener(&myDatabaseContent);
2049 
2050     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2051     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2052     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2053     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
2054 
2055     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2056 
2057     connect(&myListener, &TracksListener::trackHasChanged,
2058             &myPlayList, &MediaPlayList::trackChanged,
2059             Qt::QueuedConnection);
2060     connect(&myListener, &TracksListener::tracksListAdded,
2061             &myPlayList, &MediaPlayList::tracksListAdded,
2062             Qt::QueuedConnection);
2063     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2064             &myListener, &TracksListener::trackByNameInList,
2065             Qt::QueuedConnection);
2066     connect(&myPlayList, &MediaPlayList::newEntryInList,
2067             &myListener, &TracksListener::newEntryInList,
2068             Qt::QueuedConnection);
2069     connect(&myPlayList, &MediaPlayList::newUrlInList,
2070             &myListener, &TracksListener::newUrlInList,
2071             Qt::QueuedConnection);
2072     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2073             &myListener, &TracksListener::tracksAdded);
2074 
2075     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2076 
2077     QCOMPARE(currentTrackChangedSpy.count(), 0);
2078     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2079     QCOMPARE(repeatModeChangedSpy.count(), 0);
2080     QCOMPARE(playListFinishedSpy.count(), 0);
2081 
2082     QCOMPARE(currentTrackChangedSpy.count(), 0);
2083     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2084     QCOMPARE(repeatModeChangedSpy.count(), 0);
2085     QCOMPARE(playListFinishedSpy.count(), 0);
2086 
2087     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2088                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2089                                    QStringLiteral("track1"), {}}}, {}, {});
2090     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2091                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2092                                    QStringLiteral("track3"), {}}}, {}, {});
2093     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2094                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
2095                                    QStringLiteral("track5"), {}}}, {}, {});
2096     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2097                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2098                                    QStringLiteral("track1"), {}}}, {}, {});
2099 
2100     QCOMPARE(currentTrackChangedSpy.count(), 1);
2101     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2102     QCOMPARE(repeatModeChangedSpy.count(), 0);
2103     QCOMPARE(playListFinishedSpy.count(), 0);
2104 
2105     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2106 
2107     myPlayListProxyModel.setShufflePlayList(true);
2108 
2109     QCOMPARE(currentTrackChangedSpy.count(), 1);
2110     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2111     QCOMPARE(repeatModeChangedSpy.count(), 0);
2112     QCOMPARE(playListFinishedSpy.count(), 0);
2113 
2114     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
2115 
2116     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2117 
2118     QCOMPARE(currentTrackChangedSpy.count(), 1);
2119     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2120     QCOMPARE(repeatModeChangedSpy.count(), 1);
2121     QCOMPARE(playListFinishedSpy.count(), 0);
2122 
2123     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
2124 
2125     myPlayListProxyModel.switchTo(3);
2126 
2127     QCOMPARE(currentTrackChangedSpy.count(), 2);
2128     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2129     QCOMPARE(repeatModeChangedSpy.count(), 1);
2130     QCOMPARE(playListFinishedSpy.count(), 0);
2131 
2132     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2133 
2134     myPlayListProxyModel.skipNextTrack();
2135 
2136     QCOMPARE(currentTrackChangedSpy.count(), 3);
2137     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2138     QCOMPARE(repeatModeChangedSpy.count(), 1);
2139     QCOMPARE(playListFinishedSpy.count(), 0);
2140 
2141     myPlayListProxyModel.skipNextTrack();
2142 
2143     QCOMPARE(currentTrackChangedSpy.count(), 4);
2144     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2145     QCOMPARE(repeatModeChangedSpy.count(), 1);
2146     QCOMPARE(playListFinishedSpy.count(), 0);
2147 
2148     myPlayListProxyModel.skipNextTrack();
2149 
2150     QCOMPARE(currentTrackChangedSpy.count(), 5);
2151     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2152     QCOMPARE(repeatModeChangedSpy.count(), 1);
2153     QCOMPARE(playListFinishedSpy.count(), 0);
2154 }
2155 
2156 void MediaPlayListProxyModelTest::continuePlayList()
2157 {
2158     MediaPlayList myPlayList;
2159     QAbstractItemModelTester testModel(&myPlayList);
2160     MediaPlayListProxyModel myPlayListProxyModel;
2161     myPlayListProxyModel.setPlayListModel(&myPlayList);
2162     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2163     DatabaseInterface myDatabaseContent;
2164     TracksListener myListener(&myDatabaseContent);
2165 
2166     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2167     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2168     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2169     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
2170 
2171     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2172 
2173     connect(&myListener, &TracksListener::trackHasChanged,
2174             &myPlayList, &MediaPlayList::trackChanged,
2175             Qt::QueuedConnection);
2176     connect(&myListener, &TracksListener::tracksListAdded,
2177             &myPlayList, &MediaPlayList::tracksListAdded,
2178             Qt::QueuedConnection);
2179     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2180             &myListener, &TracksListener::trackByNameInList,
2181             Qt::QueuedConnection);
2182     connect(&myPlayList, &MediaPlayList::newEntryInList,
2183             &myListener, &TracksListener::newEntryInList,
2184             Qt::QueuedConnection);
2185     connect(&myPlayList, &MediaPlayList::newUrlInList,
2186             &myListener, &TracksListener::newUrlInList,
2187             Qt::QueuedConnection);
2188     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2189             &myListener, &TracksListener::tracksAdded);
2190 
2191     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2192 
2193     QCOMPARE(currentTrackChangedSpy.count(), 0);
2194     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2195     QCOMPARE(repeatModeChangedSpy.count(), 0);
2196     QCOMPARE(playListFinishedSpy.count(), 0);
2197 
2198     QCOMPARE(currentTrackChangedSpy.count(), 0);
2199     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2200     QCOMPARE(repeatModeChangedSpy.count(), 0);
2201     QCOMPARE(playListFinishedSpy.count(), 0);
2202 
2203     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2204                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2205                                    QStringLiteral("track1"), {}}}, {}, {});
2206     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2207                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2208                                    QStringLiteral("track3"), {}}}, {}, {});
2209     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2210                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
2211                                    QStringLiteral("track5"), {}}}, {}, {});
2212     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2213                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2214                                    QStringLiteral("track1"), {}}}, {}, {});
2215 
2216     QCOMPARE(currentTrackChangedSpy.count(), 1);
2217     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2218     QCOMPARE(repeatModeChangedSpy.count(), 0);
2219     QCOMPARE(playListFinishedSpy.count(), 0);
2220 
2221     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2222 
2223     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2224 
2225     QCOMPARE(currentTrackChangedSpy.count(), 1);
2226     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2227     QCOMPARE(repeatModeChangedSpy.count(), 1);
2228     QCOMPARE(playListFinishedSpy.count(), 0);
2229 
2230     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
2231 
2232     myPlayListProxyModel.skipNextTrack();
2233 
2234     QCOMPARE(currentTrackChangedSpy.count(), 2);
2235     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2236     QCOMPARE(repeatModeChangedSpy.count(), 1);
2237     QCOMPARE(playListFinishedSpy.count(), 0);
2238 
2239     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2240 
2241     myPlayListProxyModel.skipNextTrack();
2242 
2243     QCOMPARE(currentTrackChangedSpy.count(), 3);
2244     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2245     QCOMPARE(repeatModeChangedSpy.count(), 1);
2246     QCOMPARE(playListFinishedSpy.count(), 0);
2247 
2248     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
2249 
2250     myPlayListProxyModel.skipNextTrack();
2251 
2252     QCOMPARE(currentTrackChangedSpy.count(), 4);
2253     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2254     QCOMPARE(repeatModeChangedSpy.count(), 1);
2255     QCOMPARE(playListFinishedSpy.count(), 0);
2256 
2257     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2258 
2259     myPlayListProxyModel.skipNextTrack();
2260 
2261     QCOMPARE(currentTrackChangedSpy.count(), 5);
2262     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2263     QCOMPARE(repeatModeChangedSpy.count(), 1);
2264     QCOMPARE(playListFinishedSpy.count(), 0);
2265 
2266     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2267 }
2268 
2269 void MediaPlayListProxyModelTest::previousAndNextTracksTest()
2270 {
2271     MediaPlayList myPlayList;
2272     QAbstractItemModelTester testModel(&myPlayList);
2273     MediaPlayListProxyModel myPlayListProxyModel;
2274     myPlayListProxyModel.setPlayListModel(&myPlayList);
2275     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2276     DatabaseInterface myDatabaseContent;
2277     TracksListener myListener(&myDatabaseContent);
2278 
2279     QSignalSpy previousTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::previousTrackChanged);
2280     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2281     QSignalSpy nextTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::nextTrackChanged);
2282     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2283     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2284     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
2285 
2286     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2287 
2288     connect(&myListener, &TracksListener::trackHasChanged,
2289             &myPlayList, &MediaPlayList::trackChanged,
2290             Qt::QueuedConnection);
2291     connect(&myListener, &TracksListener::tracksListAdded,
2292             &myPlayList, &MediaPlayList::tracksListAdded,
2293             Qt::QueuedConnection);
2294     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2295             &myListener, &TracksListener::trackByNameInList,
2296             Qt::QueuedConnection);
2297     connect(&myPlayList, &MediaPlayList::newEntryInList,
2298             &myListener, &TracksListener::newEntryInList,
2299             Qt::QueuedConnection);
2300     connect(&myPlayList, &MediaPlayList::newUrlInList,
2301             &myListener, &TracksListener::newUrlInList,
2302             Qt::QueuedConnection);
2303     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2304             &myListener, &TracksListener::tracksAdded);
2305 
2306     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2307 
2308     QCOMPARE(previousTrackChangedSpy.count(), 0);
2309     QCOMPARE(currentTrackChangedSpy.count(), 0);
2310     QCOMPARE(nextTrackChangedSpy.count(), 0);
2311     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2312     QCOMPARE(repeatModeChangedSpy.count(), 0);
2313     QCOMPARE(playListFinishedSpy.count(), 0);
2314 
2315     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2316                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2317                                    QStringLiteral("track1"), {}}}, {}, {});
2318     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2319                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2320                                    QStringLiteral("track3"), {}}}, {}, {});
2321     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2322                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
2323                                    QStringLiteral("track4"), {}}}, {}, {});
2324     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2325                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
2326                                    QStringLiteral("track2"), {}}}, {}, {});
2327     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2328                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2329                                    QStringLiteral("track1"), {}}}, {}, {});
2330 
2331     QCOMPARE(previousTrackChangedSpy.count(), 0);
2332     QCOMPARE(currentTrackChangedSpy.count(), 1);
2333     QCOMPARE(nextTrackChangedSpy.count(), 1);
2334     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2335     QCOMPARE(repeatModeChangedSpy.count(), 0);
2336     QCOMPARE(playListFinishedSpy.count(), 0);
2337 
2338     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex());
2339     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2340     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2341 
2342     myPlayListProxyModel.skipNextTrack();
2343 
2344     QCOMPARE(previousTrackChangedSpy.count(), 1);
2345     QCOMPARE(currentTrackChangedSpy.count(), 2);
2346     QCOMPARE(nextTrackChangedSpy.count(), 2);
2347     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2348     QCOMPARE(repeatModeChangedSpy.count(), 0);
2349     QCOMPARE(playListFinishedSpy.count(), 0);
2350 
2351     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2352     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2353     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
2354 
2355     myPlayListProxyModel.switchTo(4);
2356 
2357     QCOMPARE(previousTrackChangedSpy.count(), 2);
2358     QCOMPARE(currentTrackChangedSpy.count(), 3);
2359     QCOMPARE(nextTrackChangedSpy.count(), 3);
2360 
2361     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2362     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2363     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex());
2364 
2365     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2366 
2367     QCOMPARE(previousTrackChangedSpy.count(), 2);
2368     QCOMPARE(currentTrackChangedSpy.count(), 3);
2369     QCOMPARE(nextTrackChangedSpy.count(), 4);
2370 
2371     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2372     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2373     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2374 
2375     myPlayListProxyModel.skipNextTrack();
2376 
2377     QCOMPARE(previousTrackChangedSpy.count(), 3);
2378     QCOMPARE(currentTrackChangedSpy.count(), 4);
2379     QCOMPARE(nextTrackChangedSpy.count(), 5);
2380 
2381     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2382     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2383     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2384 
2385     myPlayListProxyModel.setShufflePlayList(true);
2386 
2387     QVERIFY(myPlayListProxyModel.previousTrack() != QPersistentModelIndex());
2388     QVERIFY(myPlayListProxyModel.currentTrack() != QPersistentModelIndex());
2389     QVERIFY(myPlayListProxyModel.nextTrack() != QPersistentModelIndex());
2390 }
2391 
2392 void MediaPlayListProxyModelTest::remainingTracksTest()
2393 {
2394     MediaPlayList myPlayList;
2395     QAbstractItemModelTester testModel(&myPlayList);
2396     MediaPlayListProxyModel myPlayListProxyModel;
2397     myPlayListProxyModel.setPlayListModel(&myPlayList);
2398     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2399     DatabaseInterface myDatabaseContent;
2400     TracksListener myListener(&myDatabaseContent);
2401 
2402     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2403     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2404     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2405     QSignalSpy remainingTracksChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::remainingTracksChanged);
2406 
2407     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2408 
2409     connect(&myListener, &TracksListener::trackHasChanged,
2410             &myPlayList, &MediaPlayList::trackChanged,
2411             Qt::QueuedConnection);
2412     connect(&myListener, &TracksListener::tracksListAdded,
2413             &myPlayList, &MediaPlayList::tracksListAdded,
2414             Qt::QueuedConnection);
2415     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2416             &myListener, &TracksListener::trackByNameInList,
2417             Qt::QueuedConnection);
2418     connect(&myPlayList, &MediaPlayList::newEntryInList,
2419             &myListener, &TracksListener::newEntryInList,
2420             Qt::QueuedConnection);
2421     connect(&myPlayList, &MediaPlayList::newUrlInList,
2422             &myListener, &TracksListener::newUrlInList,
2423             Qt::QueuedConnection);
2424     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2425             &myListener, &TracksListener::tracksAdded);
2426 
2427     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2428 
2429     QCOMPARE(currentTrackChangedSpy.count(), 0);
2430     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2431     QCOMPARE(repeatModeChangedSpy.count(), 0);
2432     QCOMPARE(remainingTracksChangedSpy.count(), 0);
2433 
2434     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2435                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2436                                    QStringLiteral("track1"), {}}}, {}, {});
2437     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2438                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2439                                    QStringLiteral("track3"), {}}}, {}, {});
2440     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2441                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
2442                                    QStringLiteral("track4"), {}}}, {}, {});
2443     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2444                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
2445                                    QStringLiteral("track2"), {}}}, {}, {});
2446     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2447                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2448                                    QStringLiteral("track1"), {}}}, {}, {});
2449 
2450     QCOMPARE(currentTrackChangedSpy.count(), 1);
2451     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2452     QCOMPARE(repeatModeChangedSpy.count(), 0);
2453     QCOMPARE(remainingTracksChangedSpy.count(), 6);
2454 
2455     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2456     QCOMPARE(myPlayListProxyModel.remainingTracks(), 4);
2457 
2458     myPlayListProxyModel.skipNextTrack();
2459 
2460     QCOMPARE(currentTrackChangedSpy.count(), 2);
2461     QCOMPARE(remainingTracksChangedSpy.count(), 7);
2462     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2463     QCOMPARE(myPlayListProxyModel.remainingTracks(), 3);
2464 
2465     myPlayListProxyModel.setShufflePlayList(true);
2466 
2467     QCOMPARE(currentTrackChangedSpy.count(), 2);
2468     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2469     QCOMPARE(repeatModeChangedSpy.count(), 0);
2470     QCOMPARE(remainingTracksChangedSpy.count(), 8);
2471 
2472     myPlayListProxyModel.setShufflePlayList(false);
2473     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2474 
2475     QCOMPARE(currentTrackChangedSpy.count(), 2);
2476     QCOMPARE(shufflePlayListChangedSpy.count(), 2);
2477     QCOMPARE(repeatModeChangedSpy.count(), 1);
2478     QCOMPARE(remainingTracksChangedSpy.count(), 10);
2479 
2480     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::One);
2481     QCOMPARE(myPlayListProxyModel.remainingTracks(), -1);
2482 }
2483 
2484 void MediaPlayListProxyModelTest::clearPlayListCase()
2485 {
2486     MediaPlayList myPlayList;
2487     QAbstractItemModelTester testModel(&myPlayList);
2488     MediaPlayListProxyModel myPlayListProxyModel;
2489     myPlayListProxyModel.setPlayListModel(&myPlayList);
2490     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2491     DatabaseInterface myDatabaseContent;
2492     TracksListener myListener(&myDatabaseContent);
2493 
2494     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2495     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2496     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2497     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2498     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2499     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2500     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2501     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2502     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2503     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2504     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2505     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2506     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2507 
2508     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2509     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2510     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2511     QCOMPARE(rowsRemovedSpy.count(), 0);
2512     QCOMPARE(rowsMovedSpy.count(), 0);
2513     QCOMPARE(rowsInsertedSpy.count(), 0);
2514     QCOMPARE(tracksCountChangedSpy.count(), 0);
2515     QCOMPARE(persistentStateChangedSpy.count(), 0);
2516     QCOMPARE(dataChangedSpy.count(), 0);
2517     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2518     QCOMPARE(newEntryInListSpy.count(), 0);
2519     QCOMPARE(currentTrackChangedSpy.count(), 0);
2520 
2521     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2522 
2523     connect(&myListener, &TracksListener::trackHasChanged,
2524             &myPlayList, &MediaPlayList::trackChanged,
2525             Qt::QueuedConnection);
2526     connect(&myListener, &TracksListener::tracksListAdded,
2527             &myPlayList, &MediaPlayList::tracksListAdded,
2528             Qt::QueuedConnection);
2529     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2530             &myListener, &TracksListener::trackByNameInList,
2531             Qt::QueuedConnection);
2532     connect(&myPlayList, &MediaPlayList::newEntryInList,
2533             &myListener, &TracksListener::newEntryInList,
2534             Qt::QueuedConnection);
2535     connect(&myPlayList, &MediaPlayList::newUrlInList,
2536             &myListener, &TracksListener::newUrlInList,
2537             Qt::QueuedConnection);
2538     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2539             &myListener, &TracksListener::tracksAdded);
2540 
2541     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2542 
2543     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2544     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2545     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2546     QCOMPARE(rowsRemovedSpy.count(), 0);
2547     QCOMPARE(rowsMovedSpy.count(), 0);
2548     QCOMPARE(rowsInsertedSpy.count(), 0);
2549     QCOMPARE(tracksCountChangedSpy.count(), 0);
2550     QCOMPARE(persistentStateChangedSpy.count(), 0);
2551     QCOMPARE(dataChangedSpy.count(), 0);
2552     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2553     QCOMPARE(newEntryInListSpy.count(), 0);
2554     QCOMPARE(currentTrackChangedSpy.count(), 0);
2555 
2556     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2557                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2558                                    QStringLiteral("album2"), {}}}, {}, {});
2559 
2560     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2561 
2562     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2563     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2564     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2565     QCOMPARE(rowsRemovedSpy.count(), 1);
2566     QCOMPARE(rowsMovedSpy.count(), 0);
2567     QCOMPARE(rowsInsertedSpy.count(), 2);
2568     QCOMPARE(tracksCountChangedSpy.count(), 3);
2569     QCOMPARE(persistentStateChangedSpy.count(), 3);
2570     QCOMPARE(dataChangedSpy.count(), 0);
2571     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2572     QCOMPARE(newEntryInListSpy.count(), 1);
2573     QCOMPARE(currentTrackChangedSpy.count(), 1);
2574 
2575     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2576 
2577     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2578     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2579     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2580     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2581     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2582     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2583     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2584     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2585     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2586     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2587     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2588     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2589     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2590     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2591     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2592     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2593     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2594     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2595     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2596     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2597     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2598     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2599     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2600     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2601     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2602     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2603     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2604     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2605     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2606     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2607     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2608     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2609     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2610     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2611     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2612     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2613 
2614     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2615 
2616     myPlayListProxyModel.clearPlayList();
2617 
2618     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2619     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2620     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2621     QCOMPARE(rowsRemovedSpy.count(), 2);
2622     QCOMPARE(rowsMovedSpy.count(), 0);
2623     QCOMPARE(rowsInsertedSpy.count(), 2);
2624     QCOMPARE(tracksCountChangedSpy.count(), 4);
2625     QCOMPARE(persistentStateChangedSpy.count(), 4);
2626     QCOMPARE(dataChangedSpy.count(), 0);
2627     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2628     QCOMPARE(newEntryInListSpy.count(), 1);
2629     QCOMPARE(currentTrackChangedSpy.count(), 2);
2630 
2631     QCOMPARE(myPlayListProxyModel.rowCount(), 0);
2632 
2633     QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false);
2634 }
2635 
2636 void MediaPlayListProxyModelTest::undoClearPlayListCase()
2637 {
2638     MediaPlayList myPlayList;
2639     QAbstractItemModelTester testModel(&myPlayList);
2640     MediaPlayListProxyModel myPlayListProxyModel;
2641     myPlayListProxyModel.setPlayListModel(&myPlayList);
2642     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2643     DatabaseInterface myDatabaseContent;
2644     TracksListener myListener(&myDatabaseContent);
2645 
2646     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2647     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2648     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2649     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2650     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2651     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2652     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2653     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2654     QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification);
2655     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2656     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2657     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2658     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2659     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2660 
2661     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2662     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2663     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2664     QCOMPARE(rowsRemovedSpy.count(), 0);
2665     QCOMPARE(rowsMovedSpy.count(), 0);
2666     QCOMPARE(rowsInsertedSpy.count(), 0);
2667     QCOMPARE(tracksCountChangedSpy.count(), 0);
2668     QCOMPARE(persistentStateChangedSpy.count(), 0);
2669     QCOMPARE(dataChangedSpy.count(), 0);
2670     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2671     QCOMPARE(newEntryInListSpy.count(), 0);
2672     QCOMPARE(currentTrackChangedSpy.count(), 0);
2673 
2674     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2675 
2676     connect(&myListener, &TracksListener::trackHasChanged,
2677             &myPlayList, &MediaPlayList::trackChanged,
2678             Qt::QueuedConnection);
2679     connect(&myListener, &TracksListener::tracksListAdded,
2680             &myPlayList, &MediaPlayList::tracksListAdded,
2681             Qt::QueuedConnection);
2682     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2683             &myListener, &TracksListener::trackByNameInList,
2684             Qt::QueuedConnection);
2685     connect(&myPlayList, &MediaPlayList::newEntryInList,
2686             &myListener, &TracksListener::newEntryInList,
2687             Qt::QueuedConnection);
2688     connect(&myPlayList, &MediaPlayList::newUrlInList,
2689             &myListener, &TracksListener::newUrlInList,
2690             Qt::QueuedConnection);
2691     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2692             &myListener, &TracksListener::tracksAdded);
2693 
2694     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2695 
2696     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2697     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2698     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2699     QCOMPARE(rowsRemovedSpy.count(), 0);
2700     QCOMPARE(rowsMovedSpy.count(), 0);
2701     QCOMPARE(rowsInsertedSpy.count(), 0);
2702     QCOMPARE(tracksCountChangedSpy.count(), 0);
2703     QCOMPARE(persistentStateChangedSpy.count(), 0);
2704     QCOMPARE(dataChangedSpy.count(), 0);
2705     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2706     QCOMPARE(newEntryInListSpy.count(), 0);
2707     QCOMPARE(currentTrackChangedSpy.count(), 0);
2708 
2709     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2710                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2711                                    QStringLiteral("album2"), {}}}, {}, {});
2712 
2713     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2714 
2715     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2716     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2717     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2718     QCOMPARE(rowsRemovedSpy.count(), 1);
2719     QCOMPARE(rowsMovedSpy.count(), 0);
2720     QCOMPARE(rowsInsertedSpy.count(), 2);
2721     QCOMPARE(tracksCountChangedSpy.count(), 3);
2722     QCOMPARE(persistentStateChangedSpy.count(), 3);
2723     QCOMPARE(dataChangedSpy.count(), 0);
2724     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2725     QCOMPARE(newEntryInListSpy.count(), 1);
2726     QCOMPARE(currentTrackChangedSpy.count(), 1);
2727 
2728     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2729 
2730     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2731     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2732     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2733     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2734     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2735     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2736     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2737     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2738     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2739     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2740     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2741     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2742     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2743     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2744     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2745     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2746     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2747     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2748     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2749     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2750     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2751     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2752     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2753     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2754     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2755     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2756     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2757     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2758     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2759     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2760     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2761     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2762     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2763     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2764     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2765     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2766 
2767     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2768 
2769     myPlayListProxyModel.clearPlayList();
2770 
2771     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2772     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2773     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2774     QCOMPARE(rowsRemovedSpy.count(), 2);
2775     QCOMPARE(rowsMovedSpy.count(), 0);
2776     QCOMPARE(rowsInsertedSpy.count(), 2);
2777     QCOMPARE(tracksCountChangedSpy.count(), 4);
2778     QCOMPARE(persistentStateChangedSpy.count(), 4);
2779     QCOMPARE(dataChangedSpy.count(), 0);
2780     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2781     QCOMPARE(newEntryInListSpy.count(), 1);
2782     QCOMPARE(currentTrackChangedSpy.count(), 2);
2783 
2784     QCOMPARE(myPlayListProxyModel.rowCount(), 0);
2785 
2786     QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false);
2787 
2788     myPlayListProxyModel.undoClearPlayList();
2789 
2790     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2791     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2792     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2793     QCOMPARE(rowsRemovedSpy.count(), 2);
2794     QCOMPARE(rowsMovedSpy.count(), 0);
2795     QCOMPARE(rowsInsertedSpy.count(), 3);
2796     QCOMPARE(tracksCountChangedSpy.count(), 5);
2797     QCOMPARE(persistentStateChangedSpy.count(), 6);
2798     QCOMPARE(dataChangedSpy.count(), 0);
2799     QCOMPARE(newTrackByNameInListSpy.count(), 6);
2800     QCOMPARE(newEntryInListSpy.count(), 1);
2801     QCOMPARE(currentTrackChangedSpy.count(), 3);
2802     QCOMPARE(displayUndoNotificationSpy.count(), 1);
2803 
2804     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2805 
2806     QVERIFY(dataChangedSpy.wait());
2807 
2808     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2809     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2810     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2811     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2812     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2813     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2814     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2815     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2816     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2817     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2818     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2819     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2820     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2821     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2822     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2823     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2824     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2825     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2826     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2827     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2828     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2829     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2830     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2831     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2832     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2833     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2834     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2835     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2836     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2837     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2838     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2839     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2840     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2841     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2842     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2843     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2844 
2845     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2846 }
2847 
2848 void MediaPlayListProxyModelTest::undoReplacePlayListCase()
2849 {
2850     MediaPlayList myPlayList;
2851     QAbstractItemModelTester testModel(&myPlayList);
2852     MediaPlayListProxyModel myPlayListProxyModel;
2853     myPlayListProxyModel.setPlayListModel(&myPlayList);
2854     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2855     DatabaseInterface myDatabaseContent;
2856     TracksListener myListener(&myDatabaseContent);
2857 
2858     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2859     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2860     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2861     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2862     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2863     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2864     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2865     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2866     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2867     QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification);
2868     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2869     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2870     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2871     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2872 
2873     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2874     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2875     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2876     QCOMPARE(rowsRemovedSpy.count(), 0);
2877     QCOMPARE(rowsMovedSpy.count(), 0);
2878     QCOMPARE(rowsInsertedSpy.count(), 0);
2879     QCOMPARE(tracksCountChangedSpy.count(), 0);
2880     QCOMPARE(persistentStateChangedSpy.count(), 0);
2881     QCOMPARE(dataChangedSpy.count(), 0);
2882     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2883     QCOMPARE(newEntryInListSpy.count(), 0);
2884     QCOMPARE(currentTrackChangedSpy.count(), 0);
2885 
2886     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2887 
2888     connect(&myListener, &TracksListener::trackHasChanged,
2889             &myPlayList, &MediaPlayList::trackChanged,
2890             Qt::QueuedConnection);
2891     connect(&myListener, &TracksListener::tracksListAdded,
2892             &myPlayList, &MediaPlayList::tracksListAdded,
2893             Qt::QueuedConnection);
2894     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2895             &myListener, &TracksListener::trackByNameInList,
2896             Qt::QueuedConnection);
2897     connect(&myPlayList, &MediaPlayList::newEntryInList,
2898             &myListener, &TracksListener::newEntryInList,
2899             Qt::QueuedConnection);
2900     connect(&myPlayList, &MediaPlayList::newUrlInList,
2901             &myListener, &TracksListener::newUrlInList,
2902             Qt::QueuedConnection);
2903     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2904             &myListener, &TracksListener::tracksAdded);
2905 
2906     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2907 
2908     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2909     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2910     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2911     QCOMPARE(rowsRemovedSpy.count(), 0);
2912     QCOMPARE(rowsMovedSpy.count(), 0);
2913     QCOMPARE(rowsInsertedSpy.count(), 0);
2914     QCOMPARE(tracksCountChangedSpy.count(), 0);
2915     QCOMPARE(persistentStateChangedSpy.count(), 0);
2916     QCOMPARE(dataChangedSpy.count(), 0);
2917     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2918     QCOMPARE(newEntryInListSpy.count(), 0);
2919     QCOMPARE(currentTrackChangedSpy.count(), 0);
2920 
2921     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2922                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2923                                    QStringLiteral("album2"), {}}}, {}, {});
2924 
2925     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2926 
2927     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2928     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2929     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2930     QCOMPARE(rowsRemovedSpy.count(), 1);
2931     QCOMPARE(rowsMovedSpy.count(), 0);
2932     QCOMPARE(rowsInsertedSpy.count(), 2);
2933     QCOMPARE(tracksCountChangedSpy.count(), 3);
2934     QCOMPARE(persistentStateChangedSpy.count(), 3);
2935     QCOMPARE(dataChangedSpy.count(), 0);
2936     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2937     QCOMPARE(newEntryInListSpy.count(), 1);
2938     QCOMPARE(currentTrackChangedSpy.count(), 1);
2939 
2940     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2941 
2942     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2943     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2944     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2945     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2946     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2947     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2948     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2949     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2950     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2951     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2952     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2953     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2954     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2955     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2956     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2957     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2958     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2959     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2960     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2961     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2962     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2963     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2964     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2965     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2966     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2967     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2968     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2969     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2970     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2971     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2972     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2973     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2974     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2975     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2976     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2977     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2978 
2979     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2980 
2981     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2982                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}},
2983                                    QStringLiteral("album1"), {}}},
2984                                  ElisaUtils::ReplacePlayList,
2985                                  ElisaUtils::TriggerPlay);
2986 
2987     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2988 
2989     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3);
2990     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2991     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2992     QCOMPARE(rowsRemovedSpy.count(), 3);
2993     QCOMPARE(rowsMovedSpy.count(), 0);
2994     QCOMPARE(rowsInsertedSpy.count(), 4);
2995     QCOMPARE(persistentStateChangedSpy.count(), 7);
2996     QCOMPARE(dataChangedSpy.count(), 0);
2997     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2998     QCOMPARE(newEntryInListSpy.count(), 2);
2999     QCOMPARE(currentTrackChangedSpy.count(), 3);
3000 
3001     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
3002     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
3003     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3004     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
3005     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3006     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
3007     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
3008     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
3009     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
3010     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
3011     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
3012     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
3013     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
3014     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
3015     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
3016     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
3017     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
3018     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
3019     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
3020     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
3021     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4"));
3022     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
3023     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4);
3024     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4);
3025 
3026     myPlayListProxyModel.undoClearPlayList();
3027 
3028     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4);
3029     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3030     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
3031     QCOMPARE(rowsRemovedSpy.count(), 4);
3032     QCOMPARE(rowsMovedSpy.count(), 0);
3033     QCOMPARE(rowsInsertedSpy.count(), 5);
3034     QCOMPARE(tracksCountChangedSpy.count(), 9);
3035     QCOMPARE(persistentStateChangedSpy.count(), 10);
3036     QCOMPARE(dataChangedSpy.count(), 0);
3037     QCOMPARE(newTrackByNameInListSpy.count(), 6);
3038     QCOMPARE(newEntryInListSpy.count(), 2);
3039     QCOMPARE(currentTrackChangedSpy.count(), 5);
3040     QCOMPARE(displayUndoNotificationSpy.count(), 1);
3041 
3042     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
3043 
3044     QVERIFY(dataChangedSpy.wait());
3045 
3046     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
3047     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3048     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3049     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
3050     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3051     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
3052     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
3053     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3054     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3055     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
3056     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3057     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
3058     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
3059     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3060     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3061     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
3062     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3063     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
3064     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
3065     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3066     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3067     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
3068     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3069     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
3070     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
3071     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3072     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3073     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
3074     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3075     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
3076     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
3077     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3078     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
3079     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
3080     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3081     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
3082 
3083     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3084 }
3085 
3086 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousAndContinueCase()
3087 {
3088     MediaPlayList myPlayList;
3089     QAbstractItemModelTester testModel(&myPlayList);
3090     MediaPlayListProxyModel myPlayListProxyModel;
3091     myPlayListProxyModel.setPlayListModel(&myPlayList);
3092     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3093     DatabaseInterface myDatabaseContent;
3094     TracksListener myListener(&myDatabaseContent);
3095 
3096     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3097     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
3098     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
3099     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3100 
3101     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3102 
3103     connect(&myListener, &TracksListener::trackHasChanged,
3104             &myPlayList, &MediaPlayList::trackChanged,
3105             Qt::QueuedConnection);
3106     connect(&myListener, &TracksListener::tracksListAdded,
3107             &myPlayList, &MediaPlayList::tracksListAdded,
3108             Qt::QueuedConnection);
3109     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3110             &myListener, &TracksListener::trackByNameInList,
3111             Qt::QueuedConnection);
3112     connect(&myPlayList, &MediaPlayList::newEntryInList,
3113             &myListener, &TracksListener::newEntryInList,
3114             Qt::QueuedConnection);
3115     connect(&myPlayList, &MediaPlayList::newUrlInList,
3116             &myListener, &TracksListener::newUrlInList,
3117             Qt::QueuedConnection);
3118     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3119             &myListener, &TracksListener::tracksAdded);
3120 
3121     QCOMPARE(currentTrackChangedSpy.count(), 0);
3122     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3123     QCOMPARE(repeatModeChangedSpy.count(), 0);
3124     QCOMPARE(playListFinishedSpy.count(), 0);
3125 
3126     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
3127 
3128     QCOMPARE(currentTrackChangedSpy.count(), 0);
3129     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3130     QCOMPARE(repeatModeChangedSpy.count(), 1);
3131     QCOMPARE(playListFinishedSpy.count(), 0);
3132 
3133     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3134 
3135     QCOMPARE(currentTrackChangedSpy.count(), 0);
3136     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3137     QCOMPARE(repeatModeChangedSpy.count(), 1);
3138     QCOMPARE(playListFinishedSpy.count(), 0);
3139 
3140     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3141                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3142                                    QStringLiteral("track1"), {}}}, {}, {});
3143     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3144                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
3145                                    QStringLiteral("track3"), {}}}, {}, {});
3146     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3147                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}},
3148                                    QStringLiteral("track2"), {}}}, {}, {});
3149     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3150                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3151                                    QStringLiteral("track1"), {}}}, {}, {});
3152     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3153                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}},
3154                                    QStringLiteral("track3"), {}}}, {}, {});
3155     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3156                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
3157                                    QStringLiteral("track2"), {}}}, {}, {});
3158 
3159     QCOMPARE(currentTrackChangedSpy.count(), 1);
3160     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3161     QCOMPARE(repeatModeChangedSpy.count(), 1);
3162     QCOMPARE(playListFinishedSpy.count(), 0);
3163 
3164     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3165 
3166     myPlayListProxyModel.skipNextTrack();
3167 
3168     QCOMPARE(currentTrackChangedSpy.count(), 2);
3169     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3170     QCOMPARE(repeatModeChangedSpy.count(), 1);
3171     QCOMPARE(playListFinishedSpy.count(), 0);
3172 
3173     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3174 
3175     myPlayListProxyModel.skipNextTrack();
3176 
3177     QCOMPARE(currentTrackChangedSpy.count(), 3);
3178     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3179     QCOMPARE(repeatModeChangedSpy.count(), 1);
3180     QCOMPARE(playListFinishedSpy.count(), 0);
3181 
3182     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
3183 
3184     myPlayListProxyModel.skipNextTrack();
3185 
3186     QCOMPARE(currentTrackChangedSpy.count(), 4);
3187     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3188     QCOMPARE(repeatModeChangedSpy.count(), 1);
3189     QCOMPARE(playListFinishedSpy.count(), 0);
3190 
3191     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
3192 
3193     myPlayListProxyModel.skipNextTrack();
3194 
3195     QCOMPARE(currentTrackChangedSpy.count(), 5);
3196     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3197     QCOMPARE(repeatModeChangedSpy.count(), 1);
3198     QCOMPARE(playListFinishedSpy.count(), 0);
3199 
3200     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3201 
3202     myPlayListProxyModel.skipNextTrack();
3203 
3204     QCOMPARE(currentTrackChangedSpy.count(), 6);
3205     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3206     QCOMPARE(repeatModeChangedSpy.count(), 1);
3207     QCOMPARE(playListFinishedSpy.count(), 0);
3208 
3209     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3210 
3211     myPlayListProxyModel.skipPreviousTrack(0);
3212 
3213     QCOMPARE(currentTrackChangedSpy.count(), 7);
3214     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3215     QCOMPARE(repeatModeChangedSpy.count(), 1);
3216     QCOMPARE(playListFinishedSpy.count(), 0);
3217 
3218     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3219 
3220     myPlayListProxyModel.skipPreviousTrack(0);
3221 
3222     QCOMPARE(currentTrackChangedSpy.count(), 8);
3223     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3224     QCOMPARE(repeatModeChangedSpy.count(), 1);
3225     QCOMPARE(playListFinishedSpy.count(), 0);
3226 
3227     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
3228 
3229     myPlayListProxyModel.skipPreviousTrack(0);
3230 
3231     QCOMPARE(currentTrackChangedSpy.count(), 9);
3232     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3233     QCOMPARE(repeatModeChangedSpy.count(), 1);
3234     QCOMPARE(playListFinishedSpy.count(), 0);
3235 
3236     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
3237 
3238     myPlayListProxyModel.skipPreviousTrack(0);
3239 
3240     QCOMPARE(currentTrackChangedSpy.count(), 10);
3241     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3242     QCOMPARE(repeatModeChangedSpy.count(), 1);
3243     QCOMPARE(playListFinishedSpy.count(), 0);
3244 
3245     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3246 
3247     myPlayListProxyModel.skipPreviousTrack(0);
3248 
3249     QCOMPARE(currentTrackChangedSpy.count(), 11);
3250     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3251     QCOMPARE(repeatModeChangedSpy.count(), 1);
3252     QCOMPARE(playListFinishedSpy.count(), 0);
3253 
3254     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3255 
3256     myPlayListProxyModel.skipPreviousTrack(0);
3257 
3258     QCOMPARE(currentTrackChangedSpy.count(), 12);
3259     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3260     QCOMPARE(repeatModeChangedSpy.count(), 1);
3261     QCOMPARE(playListFinishedSpy.count(), 0);
3262 
3263     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3264 
3265     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::One);
3266 
3267     QCOMPARE(currentTrackChangedSpy.count(), 12);
3268     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3269     QCOMPARE(repeatModeChangedSpy.count(), 2);
3270     QCOMPARE(playListFinishedSpy.count(), 0);
3271 
3272     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3273     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3274     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3275 
3276     myPlayListProxyModel.skipPreviousTrack(0);
3277 
3278     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3279     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3280     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3281 
3282     myPlayListProxyModel.skipPreviousTrack(2001);
3283 
3284     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3285     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3286     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3287 
3288     myPlayListProxyModel.skipNextTrack();
3289 
3290     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3291     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3292     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3293 
3294     myPlayListProxyModel.skipNextTrack(ElisaUtils::SkipReason::Manual);
3295 
3296     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3297     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3298     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3299 
3300     myPlayListProxyModel.skipNextTrack(ElisaUtils::SkipReason::Manual);
3301 
3302     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3303     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3304     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3305 }
3306 
3307 void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleNotBeginCase()
3308 {
3309     MediaPlayList myPlayList;
3310     QAbstractItemModelTester testModel(&myPlayList);
3311     MediaPlayListProxyModel myPlayListProxyModel;
3312     myPlayListProxyModel.setPlayListModel(&myPlayList);
3313     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3314     DatabaseInterface myDatabaseContent;
3315     TracksListener myListener(&myDatabaseContent);
3316 
3317     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3318     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3319 
3320     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3321 
3322     connect(&myListener, &TracksListener::trackHasChanged,
3323             &myPlayList, &MediaPlayList::trackChanged,
3324             Qt::QueuedConnection);
3325     connect(&myListener, &TracksListener::tracksListAdded,
3326             &myPlayList, &MediaPlayList::tracksListAdded,
3327             Qt::QueuedConnection);
3328     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3329             &myListener, &TracksListener::trackByNameInList,
3330             Qt::QueuedConnection);
3331     connect(&myPlayList, &MediaPlayList::newEntryInList,
3332             &myListener, &TracksListener::newEntryInList,
3333             Qt::QueuedConnection);
3334     connect(&myPlayList, &MediaPlayList::newUrlInList,
3335             &myListener, &TracksListener::newUrlInList,
3336             Qt::QueuedConnection);
3337     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3338             &myListener, &TracksListener::tracksAdded);
3339 
3340     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3341 
3342     QCOMPARE(currentTrackChangedSpy.count(), 0);
3343     QCOMPARE(playListFinishedSpy.count(), 0);
3344 
3345     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3346                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3347                                    QStringLiteral("track1"), {}}}, {}, {});
3348 
3349     QCOMPARE(currentTrackChangedSpy.count(), 1);
3350     QCOMPARE(playListFinishedSpy.count(), 0);
3351 
3352     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3353 
3354     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3355                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
3356                                    QStringLiteral("track2"), {}}}, {}, {});
3357 
3358     QCOMPARE(currentTrackChangedSpy.count(), 1);
3359     QCOMPARE(playListFinishedSpy.count(), 0);
3360 
3361     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3362                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 1)}},
3363                                    QStringLiteral("track4"), {}}}, {}, {});
3364 
3365     QCOMPARE(currentTrackChangedSpy.count(), 1);
3366     QCOMPARE(playListFinishedSpy.count(), 0);
3367 
3368     myPlayListProxyModel.skipNextTrack();
3369 
3370     QCOMPARE(currentTrackChangedSpy.count(), 2);
3371     QCOMPARE(playListFinishedSpy.count(), 0);
3372 
3373     qDebug() << myPlayListProxyModel.currentTrack() << QPersistentModelIndex(myPlayListProxyModel.index(1, 0));
3374     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3375 
3376     myPlayListProxyModel.removeRow(1);
3377 
3378     QCOMPARE(currentTrackChangedSpy.count(), 3);
3379     QCOMPARE(playListFinishedSpy.count(), 0);
3380 
3381     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3382 }
3383 
3384 void MediaPlayListProxyModelTest::testBringUpAndPlayCase()
3385 {
3386     MediaPlayList myPlayList;
3387     QAbstractItemModelTester testModel(&myPlayList);
3388     MediaPlayListProxyModel myPlayListProxyModel;
3389     myPlayListProxyModel.setPlayListModel(&myPlayList);
3390     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3391     DatabaseInterface myDatabaseContent;
3392     TracksListener myListener(&myDatabaseContent);
3393 
3394     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3395     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3396 
3397     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3398 
3399     connect(&myListener, &TracksListener::trackHasChanged,
3400             &myPlayList, &MediaPlayList::trackChanged,
3401             Qt::QueuedConnection);
3402     connect(&myListener, &TracksListener::tracksListAdded,
3403             &myPlayList, &MediaPlayList::tracksListAdded,
3404             Qt::QueuedConnection);
3405     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3406             &myListener, &TracksListener::trackByNameInList,
3407             Qt::QueuedConnection);
3408     connect(&myPlayList, &MediaPlayList::newEntryInList,
3409             &myListener, &TracksListener::newEntryInList,
3410             Qt::QueuedConnection);
3411     connect(&myPlayList, &MediaPlayList::newUrlInList,
3412             &myListener, &TracksListener::newUrlInList,
3413             Qt::QueuedConnection);
3414     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3415             &myListener, &TracksListener::tracksAdded);
3416 
3417     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3418 
3419     QCOMPARE(currentTrackChangedSpy.count(), 0);
3420     QCOMPARE(playListFinishedSpy.count(), 0);
3421 
3422     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3423                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3424                                    QStringLiteral("track1"), {}}}, {}, {});
3425     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3426                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3427                                    QStringLiteral("track3"), {}}}, {}, {});
3428 
3429     QCOMPARE(currentTrackChangedSpy.count(), 1);
3430     QCOMPARE(playListFinishedSpy.count(), 0);
3431 
3432     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3433 
3434     myPlayListProxyModel.skipNextTrack();
3435 
3436     QCOMPARE(currentTrackChangedSpy.count(), 2);
3437     QCOMPARE(playListFinishedSpy.count(), 0);
3438 
3439     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3440 }
3441 
3442 void MediaPlayListProxyModelTest::testBringUpAndSkipNextCase()
3443 {
3444     MediaPlayList myPlayList;
3445     QAbstractItemModelTester testModel(&myPlayList);
3446     MediaPlayListProxyModel myPlayListProxyModel;
3447     myPlayListProxyModel.setPlayListModel(&myPlayList);
3448     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3449     DatabaseInterface myDatabaseContent;
3450     TracksListener myListener(&myDatabaseContent);
3451 
3452     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3453     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3454 
3455     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3456 
3457     connect(&myListener, &TracksListener::trackHasChanged,
3458             &myPlayList, &MediaPlayList::trackChanged,
3459             Qt::QueuedConnection);
3460     connect(&myListener, &TracksListener::tracksListAdded,
3461             &myPlayList, &MediaPlayList::tracksListAdded,
3462             Qt::QueuedConnection);
3463     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3464             &myListener, &TracksListener::trackByNameInList,
3465             Qt::QueuedConnection);
3466     connect(&myPlayList, &MediaPlayList::newEntryInList,
3467             &myListener, &TracksListener::newEntryInList,
3468             Qt::QueuedConnection);
3469     connect(&myPlayList, &MediaPlayList::newUrlInList,
3470             &myListener, &TracksListener::newUrlInList,
3471             Qt::QueuedConnection);
3472     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3473             &myListener, &TracksListener::tracksAdded);
3474 
3475     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3476 
3477     QCOMPARE(currentTrackChangedSpy.count(), 0);
3478     QCOMPARE(playListFinishedSpy.count(), 0);
3479 
3480     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3481                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3482                                    QStringLiteral("track1"), {}}}, {}, {});
3483     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3484                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3485                                    QStringLiteral("track3"), {}}}, {}, {});
3486 
3487     QCOMPARE(currentTrackChangedSpy.count(), 1);
3488     QCOMPARE(playListFinishedSpy.count(), 0);
3489 
3490     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3491 
3492     myPlayListProxyModel.skipNextTrack();
3493 
3494     QCOMPARE(currentTrackChangedSpy.count(), 2);
3495     QCOMPARE(playListFinishedSpy.count(), 0);
3496 
3497     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3498 }
3499 
3500 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousCase()
3501 {
3502     MediaPlayList myPlayList;
3503     QAbstractItemModelTester testModel(&myPlayList);
3504     MediaPlayListProxyModel myPlayListProxyModel;
3505     myPlayListProxyModel.setPlayListModel(&myPlayList);
3506     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3507     DatabaseInterface myDatabaseContent;
3508     TracksListener myListener(&myDatabaseContent);
3509 
3510     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3511     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3512 
3513     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3514 
3515     connect(&myListener, &TracksListener::trackHasChanged,
3516             &myPlayList, &MediaPlayList::trackChanged,
3517             Qt::QueuedConnection);
3518     connect(&myListener, &TracksListener::tracksListAdded,
3519             &myPlayList, &MediaPlayList::tracksListAdded,
3520             Qt::QueuedConnection);
3521     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3522             &myListener, &TracksListener::trackByNameInList,
3523             Qt::QueuedConnection);
3524     connect(&myPlayList, &MediaPlayList::newEntryInList,
3525             &myListener, &TracksListener::newEntryInList,
3526             Qt::QueuedConnection);
3527     connect(&myPlayList, &MediaPlayList::newUrlInList,
3528             &myListener, &TracksListener::newUrlInList,
3529             Qt::QueuedConnection);
3530     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3531             &myListener, &TracksListener::tracksAdded);
3532 
3533     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3534 
3535     QCOMPARE(currentTrackChangedSpy.count(), 0);
3536     QCOMPARE(playListFinishedSpy.count(), 0);
3537 
3538     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3539                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3540                                    QStringLiteral("track1"), {}}}, {}, {});
3541     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3542                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3543                                    QStringLiteral("track3"), {}}}, {}, {});
3544 
3545     QCOMPARE(currentTrackChangedSpy.count(), 1);
3546     QCOMPARE(playListFinishedSpy.count(), 0);
3547 
3548     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3549 
3550     myPlayListProxyModel.skipNextTrack();
3551 
3552     QCOMPARE(currentTrackChangedSpy.count(), 2);
3553     QCOMPARE(playListFinishedSpy.count(), 0);
3554 
3555     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3556 
3557     myPlayListProxyModel.skipPreviousTrack(0);
3558 
3559     QCOMPARE(currentTrackChangedSpy.count(), 3);
3560     QCOMPARE(playListFinishedSpy.count(), 0);
3561 
3562     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3563 }
3564 
3565 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousWithSeekCase()
3566 {
3567     MediaPlayList myPlayList;
3568     QAbstractItemModelTester testModel(&myPlayList);
3569     MediaPlayListProxyModel myPlayListProxyModel;
3570     myPlayListProxyModel.setPlayListModel(&myPlayList);
3571     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3572     DatabaseInterface myDatabaseContent;
3573     TracksListener myListener(&myDatabaseContent);
3574 
3575     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3576     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3577     QSignalSpy trackSeekedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::seek);
3578 
3579     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3580 
3581     connect(&myListener, &TracksListener::trackHasChanged,
3582             &myPlayList, &MediaPlayList::trackChanged,
3583             Qt::QueuedConnection);
3584     connect(&myListener, &TracksListener::tracksListAdded,
3585             &myPlayList, &MediaPlayList::tracksListAdded,
3586             Qt::QueuedConnection);
3587     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3588             &myListener, &TracksListener::trackByNameInList,
3589             Qt::QueuedConnection);
3590     connect(&myPlayList, &MediaPlayList::newEntryInList,
3591             &myListener, &TracksListener::newEntryInList,
3592             Qt::QueuedConnection);
3593     connect(&myPlayList, &MediaPlayList::newUrlInList,
3594             &myListener, &TracksListener::newUrlInList,
3595             Qt::QueuedConnection);
3596     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3597             &myListener, &TracksListener::tracksAdded);
3598 
3599     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3600 
3601     QCOMPARE(currentTrackChangedSpy.count(), 0);
3602     QCOMPARE(playListFinishedSpy.count(), 0);
3603 
3604     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3605                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3606                                    QStringLiteral("track1"), {}}}, {}, {});
3607     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3608                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3609                                    QStringLiteral("track3"), {}}}, {}, {});
3610 
3611     QCOMPARE(currentTrackChangedSpy.count(), 1);
3612     QCOMPARE(playListFinishedSpy.count(), 0);
3613     QCOMPARE(trackSeekedSpy.count(), 0);
3614 
3615     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3616 
3617     myPlayListProxyModel.skipNextTrack();
3618 
3619     QCOMPARE(currentTrackChangedSpy.count(), 2);
3620     QCOMPARE(playListFinishedSpy.count(), 0);
3621     QCOMPARE(trackSeekedSpy.count(), 0);
3622 
3623     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3624 
3625     myPlayListProxyModel.skipPreviousTrack(10000);
3626 
3627     QCOMPARE(currentTrackChangedSpy.count(), 2);
3628     QCOMPARE(playListFinishedSpy.count(), 0);
3629     QCOMPARE(trackSeekedSpy.count(), 1);
3630 
3631     myPlayListProxyModel.skipPreviousTrack(0);
3632 
3633     QCOMPARE(currentTrackChangedSpy.count(), 3);
3634     QCOMPARE(playListFinishedSpy.count(), 0);
3635     QCOMPARE(trackSeekedSpy.count(), 1);
3636 
3637     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3638 }
3639 
3640 void MediaPlayListProxyModelTest::testRemoveSelection()
3641 {
3642     MediaPlayList myPlayList;
3643     QAbstractItemModelTester testModel(&myPlayList);
3644     MediaPlayListProxyModel myPlayListProxyModel;
3645     myPlayListProxyModel.setPlayListModel(&myPlayList);
3646     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3647     DatabaseInterface myDatabaseContent;
3648     TracksListener myListener(&myDatabaseContent);
3649 
3650     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3651     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3652     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3653     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3654     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3655     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3656     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3657     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3658     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3659     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3660     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3661 
3662     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3663     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3664     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3665     QCOMPARE(rowsRemovedSpy.count(), 0);
3666     QCOMPARE(rowsMovedSpy.count(), 0);
3667     QCOMPARE(rowsInsertedSpy.count(), 0);
3668     QCOMPARE(persistentStateChangedSpy.count(), 0);
3669     QCOMPARE(dataChangedSpy.count(), 0);
3670     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3671     QCOMPARE(newEntryInListSpy.count(), 0);
3672 
3673     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3674 
3675     connect(&myListener, &TracksListener::trackHasChanged,
3676             &myPlayList, &MediaPlayList::trackChanged,
3677             Qt::QueuedConnection);
3678     connect(&myListener, &TracksListener::tracksListAdded,
3679             &myPlayList, &MediaPlayList::tracksListAdded,
3680             Qt::QueuedConnection);
3681     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3682             &myListener, &TracksListener::trackByNameInList,
3683             Qt::QueuedConnection);
3684     connect(&myPlayList, &MediaPlayList::newEntryInList,
3685             &myListener, &TracksListener::newEntryInList,
3686             Qt::QueuedConnection);
3687     connect(&myPlayList, &MediaPlayList::newUrlInList,
3688             &myListener, &TracksListener::newUrlInList,
3689             Qt::QueuedConnection);
3690     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3691             &myListener, &TracksListener::tracksAdded);
3692 
3693     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3694 
3695     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3696     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3697     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3698     QCOMPARE(rowsRemovedSpy.count(), 0);
3699     QCOMPARE(rowsMovedSpy.count(), 0);
3700     QCOMPARE(rowsInsertedSpy.count(), 0);
3701     QCOMPARE(persistentStateChangedSpy.count(), 0);
3702     QCOMPARE(dataChangedSpy.count(), 0);
3703     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3704     QCOMPARE(newEntryInListSpy.count(), 0);
3705 
3706     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}},
3707                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3708 
3709     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3710     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3711     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3712     QCOMPARE(rowsRemovedSpy.count(), 0);
3713     QCOMPARE(rowsMovedSpy.count(), 0);
3714     QCOMPARE(rowsInsertedSpy.count(), 1);
3715     QCOMPARE(persistentStateChangedSpy.count(), 1);
3716     QCOMPARE(dataChangedSpy.count(), 0);
3717     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3718     QCOMPARE(newEntryInListSpy.count(), 1);
3719 
3720     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3721 
3722     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
3723     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3724     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3725     QCOMPARE(rowsRemovedSpy.count(),1);
3726     QCOMPARE(rowsMovedSpy.count(), 0);
3727     QCOMPARE(rowsInsertedSpy.count(), 2);
3728     QCOMPARE(persistentStateChangedSpy.count(), 3);
3729     QCOMPARE(dataChangedSpy.count(), 0);
3730     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3731     QCOMPARE(newEntryInListSpy.count(), 1);
3732 
3733     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
3734 
3735     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3736     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3737     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3738     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3739     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3740     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3741     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3742     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3743     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3744     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3745     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3746     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3747     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3748     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3749     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3750     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
3751     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3752     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3753     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3754     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
3755     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3756     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3757     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3758     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3759     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3760     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3761     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3762     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3763     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3764     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
3765     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3766     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3767     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3768     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
3769     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3770     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3771     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
3772     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3773     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3774     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3775     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
3776     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3777 
3778     myPlayListProxyModel.removeSelection({2, 4, 5});
3779 
3780     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4);
3781     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3782     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3783     QCOMPARE(rowsRemovedSpy.count(), 4);
3784     QCOMPARE(rowsMovedSpy.count(), 0);
3785     QCOMPARE(rowsInsertedSpy.count(), 2);
3786     QCOMPARE(persistentStateChangedSpy.count(), 6);
3787     QCOMPARE(dataChangedSpy.count(), 0);
3788     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3789     QCOMPARE(newEntryInListSpy.count(), 1);
3790 
3791     QCOMPARE(myPlayListProxyModel.tracksCount(), 3);
3792 
3793     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3794     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3795     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3796     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3797     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3798     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3799     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3800     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3801     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3802     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3803     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3804     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3805     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3806     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3807     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3808     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3809     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3810     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3811     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3812     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3813     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3814 }
3815 
3816 void MediaPlayListProxyModelTest::testReplaceAndPlayArtist()
3817 {
3818     MediaPlayList myPlayList;
3819     QAbstractItemModelTester testModel(&myPlayList);
3820     MediaPlayListProxyModel myPlayListProxyModel;
3821     myPlayListProxyModel.setPlayListModel(&myPlayList);
3822     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3823     DatabaseInterface myDatabaseContent;
3824     TracksListener myListener(&myDatabaseContent);
3825 
3826     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3827     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3828     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3829     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3830     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3831     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3832     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3833     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3834     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3835     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3836     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3837 
3838     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3839     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3840     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3841     QCOMPARE(rowsRemovedSpy.count(), 0);
3842     QCOMPARE(rowsMovedSpy.count(), 0);
3843     QCOMPARE(rowsInsertedSpy.count(), 0);
3844     QCOMPARE(persistentStateChangedSpy.count(), 0);
3845     QCOMPARE(dataChangedSpy.count(), 0);
3846     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3847     QCOMPARE(newEntryInListSpy.count(), 0);
3848 
3849     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3850 
3851     connect(&myListener, &TracksListener::trackHasChanged,
3852             &myPlayList, &MediaPlayList::trackChanged,
3853             Qt::QueuedConnection);
3854     connect(&myListener, &TracksListener::tracksListAdded,
3855             &myPlayList, &MediaPlayList::tracksListAdded,
3856             Qt::QueuedConnection);
3857     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3858             &myListener, &TracksListener::trackByNameInList,
3859             Qt::QueuedConnection);
3860     connect(&myPlayList, &MediaPlayList::newEntryInList,
3861             &myListener, &TracksListener::newEntryInList,
3862             Qt::QueuedConnection);
3863     connect(&myPlayList, &MediaPlayList::newUrlInList,
3864             &myListener, &TracksListener::newUrlInList,
3865             Qt::QueuedConnection);
3866     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3867             &myListener, &TracksListener::tracksAdded);
3868 
3869     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3870 
3871     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3872     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3873     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3874     QCOMPARE(rowsRemovedSpy.count(), 0);
3875     QCOMPARE(rowsMovedSpy.count(), 0);
3876     QCOMPARE(rowsInsertedSpy.count(), 0);
3877     QCOMPARE(persistentStateChangedSpy.count(), 0);
3878     QCOMPARE(dataChangedSpy.count(), 0);
3879     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3880     QCOMPARE(newEntryInListSpy.count(), 0);
3881 
3882     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist3"), {}}},
3883                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3884 
3885     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3886     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3887     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3888     QCOMPARE(rowsRemovedSpy.count(), 0);
3889     QCOMPARE(rowsMovedSpy.count(), 0);
3890     QCOMPARE(rowsInsertedSpy.count(), 1);
3891     QCOMPARE(persistentStateChangedSpy.count(), 1);
3892     QCOMPARE(dataChangedSpy.count(), 0);
3893     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3894     QCOMPARE(newEntryInListSpy.count(), 1);
3895 
3896     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3897 
3898     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
3899     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3900     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3901     QCOMPARE(rowsRemovedSpy.count(), 1);
3902     QCOMPARE(rowsMovedSpy.count(), 0);
3903     QCOMPARE(rowsInsertedSpy.count(), 2);
3904     QCOMPARE(persistentStateChangedSpy.count(), 3);
3905     QCOMPARE(dataChangedSpy.count(), 0);
3906     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3907     QCOMPARE(newEntryInListSpy.count(), 1);
3908 
3909     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
3910 
3911     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3912     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3913     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3);
3914     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3"));
3915     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3916     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3917     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3918     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3);
3919     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
3920     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3")));
3921     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
3922     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
3923 
3924     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist4"), {}}},
3925                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3926 
3927     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
3928     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3929     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3930     QCOMPARE(rowsRemovedSpy.count(), 2);
3931     QCOMPARE(rowsMovedSpy.count(), 0);
3932     QCOMPARE(rowsInsertedSpy.count(), 3);
3933     QCOMPARE(persistentStateChangedSpy.count(), 5);
3934     QCOMPARE(dataChangedSpy.count(), 0);
3935     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3936     QCOMPARE(newEntryInListSpy.count(), 2);
3937 
3938     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3939 
3940     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3);
3941     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3942     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3943     QCOMPARE(rowsRemovedSpy.count(), 3);
3944     QCOMPARE(rowsMovedSpy.count(), 0);
3945     QCOMPARE(rowsInsertedSpy.count(), 4);
3946     QCOMPARE(persistentStateChangedSpy.count(), 7);
3947     QCOMPARE(dataChangedSpy.count(), 0);
3948     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3949     QCOMPARE(newEntryInListSpy.count(), 2);
3950 
3951     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
3952 
3953     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3954     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
3955     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4);
3956     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4"));
3957     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3958     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3959     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
3960     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4);
3961     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
3962     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4")));
3963     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
3964     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
3965 }
3966 
3967 void MediaPlayListProxyModelTest::testReplaceAndPlayTrackId()
3968 {
3969     MediaPlayList myPlayList;
3970     QAbstractItemModelTester testModel(&myPlayList);
3971     MediaPlayListProxyModel myPlayListProxyModel;
3972     myPlayListProxyModel.setPlayListModel(&myPlayList);
3973     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3974     DatabaseInterface myDatabaseContent;
3975     TracksListener myListener(&myDatabaseContent);
3976 
3977     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3978     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3979     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3980     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3981     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3982     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3983     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3984     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3985     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3986     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3987     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3988 
3989     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3990     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3991     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3992     QCOMPARE(rowsRemovedSpy.count(), 0);
3993     QCOMPARE(rowsMovedSpy.count(), 0);
3994     QCOMPARE(rowsInsertedSpy.count(), 0);
3995     QCOMPARE(persistentStateChangedSpy.count(), 0);
3996     QCOMPARE(dataChangedSpy.count(), 0);
3997     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3998     QCOMPARE(newEntryInListSpy.count(), 0);
3999 
4000     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4001 
4002     connect(&myListener, &TracksListener::trackHasChanged,
4003             &myPlayList, &MediaPlayList::trackChanged,
4004             Qt::QueuedConnection);
4005     connect(&myListener, &TracksListener::tracksListAdded,
4006             &myPlayList, &MediaPlayList::tracksListAdded,
4007             Qt::QueuedConnection);
4008     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4009             &myListener, &TracksListener::trackByNameInList,
4010             Qt::QueuedConnection);
4011     connect(&myPlayList, &MediaPlayList::newEntryInList,
4012             &myListener, &TracksListener::newEntryInList,
4013             Qt::QueuedConnection);
4014     connect(&myPlayList, &MediaPlayList::newUrlInList,
4015             &myListener, &TracksListener::newUrlInList,
4016             Qt::QueuedConnection);
4017     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4018             &myListener, &TracksListener::tracksAdded);
4019 
4020     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4021 
4022     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4023     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4024     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4025     QCOMPARE(rowsRemovedSpy.count(), 0);
4026     QCOMPARE(rowsMovedSpy.count(), 0);
4027     QCOMPARE(rowsInsertedSpy.count(), 0);
4028     QCOMPARE(persistentStateChangedSpy.count(), 0);
4029     QCOMPARE(dataChangedSpy.count(), 0);
4030     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4031     QCOMPARE(newEntryInListSpy.count(), 0);
4032 
4033     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
4034                                                                                QStringLiteral("album1"), 3, 3);
4035 
4036     QCOMPARE(firstTrackId != 0, true);
4037 
4038     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}},
4039                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
4040 
4041     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4042     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4043     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4044     QCOMPARE(rowsRemovedSpy.count(), 0);
4045     QCOMPARE(rowsMovedSpy.count(), 0);
4046     QCOMPARE(rowsInsertedSpy.count(), 1);
4047     QCOMPARE(persistentStateChangedSpy.count(), 1);
4048     QCOMPARE(dataChangedSpy.count(), 0);
4049     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4050     QCOMPARE(newEntryInListSpy.count(), 1);
4051 
4052     QCOMPARE(dataChangedSpy.wait(), true);
4053 
4054     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4055     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4056     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4057     QCOMPARE(rowsRemovedSpy.count(), 0);
4058     QCOMPARE(rowsMovedSpy.count(), 0);
4059     QCOMPARE(rowsInsertedSpy.count(), 1);
4060     QCOMPARE(persistentStateChangedSpy.count(), 1);
4061     QCOMPARE(dataChangedSpy.count(), 1);
4062     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4063     QCOMPARE(newEntryInListSpy.count(), 1);
4064 
4065     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
4066 
4067     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4068     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
4069     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3);
4070     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3"));
4071     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4072     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4073     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
4074     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3);
4075     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
4076     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3")));
4077     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
4078     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
4079 
4080     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"),
4081                                                                                 QStringLiteral("album1"), 4, 4);
4082 
4083     QCOMPARE(secondTrackId != 0, true);
4084 
4085     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}},
4086                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
4087 
4088     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4089     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4090     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4091     QCOMPARE(rowsRemovedSpy.count(), 1);
4092     QCOMPARE(rowsMovedSpy.count(), 0);
4093     QCOMPARE(rowsInsertedSpy.count(), 2);
4094     QCOMPARE(persistentStateChangedSpy.count(), 3);
4095     QCOMPARE(dataChangedSpy.count(), 1);
4096     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4097     QCOMPARE(newEntryInListSpy.count(), 2);
4098 
4099     QCOMPARE(dataChangedSpy.wait(), true);
4100 
4101     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4102     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4103     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4104     QCOMPARE(rowsRemovedSpy.count(), 1);
4105     QCOMPARE(rowsMovedSpy.count(), 0);
4106     QCOMPARE(rowsInsertedSpy.count(), 2);
4107     QCOMPARE(persistentStateChangedSpy.count(), 3);
4108     QCOMPARE(dataChangedSpy.count(), 2);
4109     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4110     QCOMPARE(newEntryInListSpy.count(), 2);
4111 
4112     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
4113 
4114     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4115     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4116     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4);
4117     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4"));
4118     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4119     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4120     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4121     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4);
4122     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
4123     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4")));
4124     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
4125     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
4126 }
4127 
4128 void MediaPlayListProxyModelTest::testTrackBeenRemoved()
4129 {
4130     MediaPlayList myPlayList;
4131     QAbstractItemModelTester testModel(&myPlayList);
4132     MediaPlayListProxyModel myPlayListProxyModel;
4133     myPlayListProxyModel.setPlayListModel(&myPlayList);
4134     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4135     DatabaseInterface myDatabaseContent;
4136     TracksListener myListener(&myDatabaseContent);
4137 
4138     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
4139     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
4140     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
4141     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
4142     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
4143     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
4144     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
4145     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
4146     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
4147     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
4148     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
4149 
4150     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4151     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4152     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4153     QCOMPARE(rowsRemovedSpy.count(), 0);
4154     QCOMPARE(rowsMovedSpy.count(), 0);
4155     QCOMPARE(rowsInsertedSpy.count(), 0);
4156     QCOMPARE(persistentStateChangedSpy.count(), 0);
4157     QCOMPARE(dataChangedSpy.count(), 0);
4158     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4159     QCOMPARE(newEntryInListSpy.count(), 0);
4160 
4161     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4162 
4163     connect(&myListener, &TracksListener::trackHasChanged,
4164             &myPlayList, &MediaPlayList::trackChanged,
4165             Qt::QueuedConnection);
4166     connect(&myListener, &TracksListener::tracksListAdded,
4167             &myPlayList, &MediaPlayList::tracksListAdded,
4168             Qt::QueuedConnection);
4169     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4170             &myListener, &TracksListener::trackByNameInList,
4171             Qt::QueuedConnection);
4172     connect(&myPlayList, &MediaPlayList::newEntryInList,
4173             &myListener, &TracksListener::newEntryInList,
4174             Qt::QueuedConnection);
4175     connect(&myPlayList, &MediaPlayList::newUrlInList,
4176             &myListener, &TracksListener::newUrlInList,
4177             Qt::QueuedConnection);
4178     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4179             &myListener, &TracksListener::tracksAdded);
4180 
4181     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4182 
4183     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4184     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4185     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4186     QCOMPARE(rowsRemovedSpy.count(), 0);
4187     QCOMPARE(rowsMovedSpy.count(), 0);
4188     QCOMPARE(rowsInsertedSpy.count(), 0);
4189     QCOMPARE(persistentStateChangedSpy.count(), 0);
4190     QCOMPARE(dataChangedSpy.count(), 0);
4191     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4192     QCOMPARE(newEntryInListSpy.count(), 0);
4193 
4194     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}},
4195                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
4196 
4197     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4198     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4199     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4200     QCOMPARE(rowsRemovedSpy.count(), 0);
4201     QCOMPARE(rowsMovedSpy.count(), 0);
4202     QCOMPARE(rowsInsertedSpy.count(), 1);
4203     QCOMPARE(persistentStateChangedSpy.count(), 1);
4204     QCOMPARE(dataChangedSpy.count(), 0);
4205     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4206     QCOMPARE(newEntryInListSpy.count(), 1);
4207 
4208     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
4209 
4210     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4211     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4212     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4213     QCOMPARE(rowsRemovedSpy.count(), 1);
4214     QCOMPARE(rowsMovedSpy.count(), 0);
4215     QCOMPARE(rowsInsertedSpy.count(), 2);
4216     QCOMPARE(persistentStateChangedSpy.count(), 3);
4217     QCOMPARE(dataChangedSpy.count(), 0);
4218     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4219     QCOMPARE(newEntryInListSpy.count(), 1);
4220 
4221     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
4222 
4223     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4224     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4225     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4226     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4227     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4228     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4229     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4230     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4231     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4232     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4233     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4234     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4235     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4236     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4237     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4238     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
4239     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4240     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4241     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4242     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
4243     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4244     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4245     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
4246     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4247     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4248     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4249     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
4250     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4251     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4252     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4253     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4254     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4255     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4256     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4257     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4258     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4259     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
4260     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4261     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4262     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4263     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
4264     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4265 
4266     auto removedTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"),
4267                                                                                  QStringLiteral("album2"), 2, 1);
4268 
4269     QCOMPARE(removedTrackId != 0, true);
4270 
4271     auto removedTrack = myDatabaseContent.trackDataFromDatabaseId(removedTrackId);
4272 
4273     QVERIFY(!removedTrack.isEmpty());
4274 
4275     myPlayList.trackRemoved(removedTrack[DataTypes::DatabaseIdRole].toULongLong());
4276 
4277     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4278     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4279     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4280     QCOMPARE(rowsRemovedSpy.count(), 1);
4281     QCOMPARE(rowsMovedSpy.count(), 0);
4282     QCOMPARE(rowsInsertedSpy.count(), 2);
4283     QCOMPARE(persistentStateChangedSpy.count(), 3);
4284     QCOMPARE(dataChangedSpy.count(), 1);
4285     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4286     QCOMPARE(newEntryInListSpy.count(), 1);
4287 
4288     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
4289 
4290     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4291     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4292     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4293     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4294     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4295     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4296     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4297     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4298     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4299     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4300     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4301     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4302     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4303     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4304     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false);
4305     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
4306     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4307     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4308     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4309     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1);
4310     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0);
4311     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4312     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
4313     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4314     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4315     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4316     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
4317     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4318     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4319     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4320     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4321     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4322     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4323     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4324     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4325     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4326     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
4327     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4328     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4329     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4330     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
4331     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4332 }
4333 
4334 void MediaPlayListProxyModelTest::finishPlayList()
4335 {
4336     MediaPlayList myPlayList;
4337     QAbstractItemModelTester testModel(&myPlayList);
4338     MediaPlayListProxyModel myPlayListProxyModel;
4339     myPlayListProxyModel.setPlayListModel(&myPlayList);
4340     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4341     DatabaseInterface myDatabaseContent;
4342     TracksListener myListener(&myDatabaseContent);
4343 
4344     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4345     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4346 
4347     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4348 
4349     connect(&myListener, &TracksListener::trackHasChanged,
4350             &myPlayList, &MediaPlayList::trackChanged,
4351             Qt::QueuedConnection);
4352     connect(&myListener, &TracksListener::tracksListAdded,
4353             &myPlayList, &MediaPlayList::tracksListAdded,
4354             Qt::QueuedConnection);
4355     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4356             &myListener, &TracksListener::trackByNameInList,
4357             Qt::QueuedConnection);
4358     connect(&myPlayList, &MediaPlayList::newEntryInList,
4359             &myListener, &TracksListener::newEntryInList,
4360             Qt::QueuedConnection);
4361     connect(&myPlayList, &MediaPlayList::newUrlInList,
4362             &myListener, &TracksListener::newUrlInList,
4363             Qt::QueuedConnection);
4364     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4365             &myListener, &TracksListener::tracksAdded);
4366 
4367     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4368 
4369     QCOMPARE(currentTrackChangedSpy.count(), 0);
4370     QCOMPARE(playListFinishedSpy.count(), 0);
4371 
4372     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4373                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4374                                    QStringLiteral("track1"), {}}}, {}, {});
4375     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4376                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
4377                                    QStringLiteral("track3"), {}}}, {}, {});
4378 
4379     QCOMPARE(currentTrackChangedSpy.count(), 1);
4380     QCOMPARE(playListFinishedSpy.count(), 0);
4381 
4382     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4383 
4384     myPlayListProxyModel.skipNextTrack();
4385 
4386     QCOMPARE(currentTrackChangedSpy.count(), 2);
4387     QCOMPARE(playListFinishedSpy.count(), 0);
4388 
4389     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4390 
4391     myPlayListProxyModel.skipNextTrack();
4392 
4393     QCOMPARE(currentTrackChangedSpy.count(), 3);
4394     QCOMPARE(playListFinishedSpy.count(), 1);
4395 
4396     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4397 }
4398 
4399 void MediaPlayListProxyModelTest::removeBeforeCurrentTrack()
4400 {
4401     MediaPlayList myPlayList;
4402     QAbstractItemModelTester testModel(&myPlayList);
4403     MediaPlayListProxyModel myPlayListProxyModel;
4404     myPlayListProxyModel.setPlayListModel(&myPlayList);
4405     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4406     DatabaseInterface myDatabaseContent;
4407     TracksListener myListener(&myDatabaseContent);
4408 
4409     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4410     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4411 
4412     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4413 
4414     connect(&myListener, &TracksListener::trackHasChanged,
4415             &myPlayList, &MediaPlayList::trackChanged,
4416             Qt::QueuedConnection);
4417     connect(&myListener, &TracksListener::tracksListAdded,
4418             &myPlayList, &MediaPlayList::tracksListAdded,
4419             Qt::QueuedConnection);
4420     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4421             &myListener, &TracksListener::trackByNameInList,
4422             Qt::QueuedConnection);
4423     connect(&myPlayList, &MediaPlayList::newEntryInList,
4424             &myListener, &TracksListener::newEntryInList,
4425             Qt::QueuedConnection);
4426     connect(&myPlayList, &MediaPlayList::newUrlInList,
4427             &myListener, &TracksListener::newUrlInList,
4428             Qt::QueuedConnection);
4429     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4430             &myListener, &TracksListener::tracksAdded);
4431 
4432     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4433 
4434     QCOMPARE(currentTrackChangedSpy.count(), 0);
4435     QCOMPARE(playListFinishedSpy.count(), 0);
4436 
4437     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4438                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4439                                    QStringLiteral("track1"), {}}}, {}, {});
4440     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4441                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
4442                                    QStringLiteral("track3"), {}}}, {}, {});
4443     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4444                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
4445                                    QStringLiteral("track5"), {}}}, {}, {});
4446     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4447                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4448                                    QStringLiteral("track1"), {}}}, {}, {});
4449 
4450     QCOMPARE(currentTrackChangedSpy.count(), 1);
4451     QCOMPARE(playListFinishedSpy.count(), 0);
4452 
4453     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4454 
4455     myPlayListProxyModel.skipNextTrack();
4456 
4457     QCOMPARE(currentTrackChangedSpy.count(), 2);
4458     QCOMPARE(playListFinishedSpy.count(), 0);
4459 
4460     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4461 
4462     myPlayListProxyModel.skipNextTrack();
4463 
4464     QCOMPARE(currentTrackChangedSpy.count(), 3);
4465     QCOMPARE(playListFinishedSpy.count(), 0);
4466 
4467     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
4468 
4469     myPlayListProxyModel.skipNextTrack();
4470 
4471     QCOMPARE(currentTrackChangedSpy.count(), 4);
4472     QCOMPARE(playListFinishedSpy.count(), 0);
4473 
4474     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
4475 
4476     myPlayListProxyModel.removeRow(1);
4477 
4478     QCOMPARE(currentTrackChangedSpy.count(), 4);
4479     QCOMPARE(playListFinishedSpy.count(), 0);
4480 }
4481 
4482 void MediaPlayListProxyModelTest::switchToTrackTest()
4483 {
4484     MediaPlayList myPlayList;
4485     QAbstractItemModelTester testModel(&myPlayList);
4486     MediaPlayListProxyModel myPlayListProxyModel;
4487     myPlayListProxyModel.setPlayListModel(&myPlayList);
4488     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4489     DatabaseInterface myDatabaseContent;
4490     TracksListener myListener(&myDatabaseContent);
4491 
4492     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4493     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4494 
4495     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4496 
4497     connect(&myListener, &TracksListener::trackHasChanged,
4498             &myPlayList, &MediaPlayList::trackChanged,
4499             Qt::QueuedConnection);
4500     connect(&myListener, &TracksListener::tracksListAdded,
4501             &myPlayList, &MediaPlayList::tracksListAdded,
4502             Qt::QueuedConnection);
4503     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4504             &myListener, &TracksListener::trackByNameInList,
4505             Qt::QueuedConnection);
4506     connect(&myPlayList, &MediaPlayList::newEntryInList,
4507             &myListener, &TracksListener::newEntryInList,
4508             Qt::QueuedConnection);
4509     connect(&myPlayList, &MediaPlayList::newUrlInList,
4510             &myListener, &TracksListener::newUrlInList,
4511             Qt::QueuedConnection);
4512     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4513             &myListener, &TracksListener::tracksAdded);
4514 
4515     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4516 
4517     QCOMPARE(currentTrackChangedSpy.count(), 0);
4518     QCOMPARE(playListFinishedSpy.count(), 0);
4519 
4520     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4521                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4522                                    QStringLiteral("track1"), {}}}, {}, {});
4523     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4524                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
4525                                    QStringLiteral("track3"), {}}}, {}, {});
4526     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4527                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
4528                                    QStringLiteral("track4"), {}}}, {}, {});
4529     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4530                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
4531                                    QStringLiteral("track2"), {}}}, {}, {});
4532     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4533                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4534                                    QStringLiteral("track1"), {}}}, {}, {});
4535 
4536     QCOMPARE(currentTrackChangedSpy.count(), 1);
4537     QCOMPARE(playListFinishedSpy.count(), 0);
4538 
4539     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4540 
4541     myPlayListProxyModel.switchTo(4);
4542 
4543     QCOMPARE(currentTrackChangedSpy.count(), 2);
4544     QCOMPARE(playListFinishedSpy.count(), 0);
4545 
4546     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
4547 }
4548 
4549 void MediaPlayListProxyModelTest::singleTrack()
4550 {
4551     MediaPlayList myPlayList;
4552     QAbstractItemModelTester testModel(&myPlayList);
4553     MediaPlayListProxyModel myPlayListProxyModel;
4554     myPlayListProxyModel.setPlayListModel(&myPlayList);
4555     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4556     DatabaseInterface myDatabaseContent;
4557     TracksListener myListener(&myDatabaseContent);
4558 
4559     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4560     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4561 
4562     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4563 
4564     connect(&myListener, &TracksListener::trackHasChanged,
4565             &myPlayList, &MediaPlayList::trackChanged,
4566             Qt::QueuedConnection);
4567     connect(&myListener, &TracksListener::tracksListAdded,
4568             &myPlayList, &MediaPlayList::tracksListAdded,
4569             Qt::QueuedConnection);
4570     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4571             &myListener, &TracksListener::trackByNameInList,
4572             Qt::QueuedConnection);
4573     connect(&myPlayList, &MediaPlayList::newEntryInList,
4574             &myListener, &TracksListener::newEntryInList,
4575             Qt::QueuedConnection);
4576     connect(&myPlayList, &MediaPlayList::newUrlInList,
4577             &myListener, &TracksListener::newUrlInList,
4578             Qt::QueuedConnection);
4579     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4580             &myListener, &TracksListener::tracksAdded);
4581 
4582     QCOMPARE(currentTrackChangedSpy.count(), 0);
4583     QCOMPARE(playListFinishedSpy.count(), 0);
4584 
4585     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4586 
4587     QCOMPARE(currentTrackChangedSpy.count(), 0);
4588     QCOMPARE(playListFinishedSpy.count(), 0);
4589 
4590     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4591                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4592                                    QStringLiteral("track1"), {}}}, {}, {});
4593 
4594     QCOMPARE(currentTrackChangedSpy.count(), 1);
4595     QCOMPARE(playListFinishedSpy.count(), 0);
4596 
4597     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4598 
4599     myPlayListProxyModel.skipNextTrack();
4600 
4601     QCOMPARE(currentTrackChangedSpy.count(), 2);
4602     QCOMPARE(playListFinishedSpy.count(), 1);
4603 
4604     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4605 }
4606 
4607 void MediaPlayListProxyModelTest::testBringUpAndRemoveCase()
4608 {
4609     MediaPlayList myPlayList;
4610     QAbstractItemModelTester testModel(&myPlayList);
4611     MediaPlayListProxyModel myPlayListProxyModel;
4612     myPlayListProxyModel.setPlayListModel(&myPlayList);
4613     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4614     DatabaseInterface myDatabaseContent;
4615     TracksListener myListener(&myDatabaseContent);
4616 
4617     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4618     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4619 
4620     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4621 
4622     connect(&myListener, &TracksListener::trackHasChanged,
4623             &myPlayList, &MediaPlayList::trackChanged,
4624             Qt::QueuedConnection);
4625     connect(&myListener, &TracksListener::tracksListAdded,
4626             &myPlayList, &MediaPlayList::tracksListAdded,
4627             Qt::QueuedConnection);
4628     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4629             &myListener, &TracksListener::trackByNameInList,
4630             Qt::QueuedConnection);
4631     connect(&myPlayList, &MediaPlayList::newEntryInList,
4632             &myListener, &TracksListener::newEntryInList,
4633             Qt::QueuedConnection);
4634     connect(&myPlayList, &MediaPlayList::newUrlInList,
4635             &myListener, &TracksListener::newUrlInList,
4636             Qt::QueuedConnection);
4637     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4638             &myListener, &TracksListener::tracksAdded);
4639 
4640     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4641 
4642     QCOMPARE(currentTrackChangedSpy.count(), 0);
4643     QCOMPARE(playListFinishedSpy.count(), 0);
4644 
4645     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4646                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4647                                    QStringLiteral("track1"), {}}}, {}, {});
4648 
4649     QCOMPARE(currentTrackChangedSpy.count(), 1);
4650     QCOMPARE(playListFinishedSpy.count(), 0);
4651 
4652     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4653 
4654     myPlayListProxyModel.removeRow(0);
4655 
4656     QCOMPARE(currentTrackChangedSpy.count(), 2);
4657     QCOMPARE(playListFinishedSpy.count(), 1);
4658 
4659     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex());
4660 }
4661 
4662 void MediaPlayListProxyModelTest::testBringUpAndRemoveLastCase()
4663 {
4664     MediaPlayList myPlayList;
4665     QAbstractItemModelTester testModel(&myPlayList);
4666     MediaPlayListProxyModel myPlayListProxyModel;
4667     myPlayListProxyModel.setPlayListModel(&myPlayList);
4668     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4669     DatabaseInterface myDatabaseContent;
4670     TracksListener myListener(&myDatabaseContent);
4671 
4672     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4673     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4674 
4675     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4676 
4677     connect(&myListener, &TracksListener::trackHasChanged,
4678             &myPlayList, &MediaPlayList::trackChanged,
4679             Qt::QueuedConnection);
4680     connect(&myListener, &TracksListener::tracksListAdded,
4681             &myPlayList, &MediaPlayList::tracksListAdded,
4682             Qt::QueuedConnection);
4683     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4684             &myListener, &TracksListener::trackByNameInList,
4685             Qt::QueuedConnection);
4686     connect(&myPlayList, &MediaPlayList::newEntryInList,
4687             &myListener, &TracksListener::newEntryInList,
4688             Qt::QueuedConnection);
4689     connect(&myPlayList, &MediaPlayList::newUrlInList,
4690             &myListener, &TracksListener::newUrlInList,
4691             Qt::QueuedConnection);
4692     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4693             &myListener, &TracksListener::tracksAdded);
4694 
4695     QCOMPARE(currentTrackChangedSpy.count(), 0);
4696     QCOMPARE(playListFinishedSpy.count(), 0);
4697 
4698     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4699 
4700     QCOMPARE(currentTrackChangedSpy.count(), 0);
4701     QCOMPARE(playListFinishedSpy.count(), 0);
4702 
4703     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4704                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4705                                    QStringLiteral("track1"), {}}}, {}, {});
4706     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4707                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}},
4708                                    QStringLiteral("track2"), {}}}, {}, {});
4709     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4710                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}},
4711                                    QStringLiteral("track3"), {}}}, {}, {});
4712 
4713     QCOMPARE(currentTrackChangedSpy.count(), 1);
4714     QCOMPARE(playListFinishedSpy.count(), 0);
4715 
4716     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4717 
4718     myPlayListProxyModel.skipNextTrack();
4719 
4720     QCOMPARE(currentTrackChangedSpy.count(), 2);
4721     QCOMPARE(playListFinishedSpy.count(), 0);
4722 
4723     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4724 
4725     myPlayListProxyModel.skipNextTrack();
4726 
4727     QCOMPARE(currentTrackChangedSpy.count(), 3);
4728     QCOMPARE(playListFinishedSpy.count(), 0);
4729 
4730     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
4731 
4732     myPlayListProxyModel.removeRow(2);
4733 
4734     QCOMPARE(currentTrackChangedSpy.count(), 4);
4735     QCOMPARE(playListFinishedSpy.count(), 1);
4736 
4737     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4738 }
4739 
4740 void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleCase()
4741 {
4742     MediaPlayList myPlayList;
4743     QAbstractItemModelTester testModel(&myPlayList);
4744     MediaPlayListProxyModel myPlayListProxyModel;
4745     myPlayListProxyModel.setPlayListModel(&myPlayList);
4746     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4747     DatabaseInterface myDatabaseContent;
4748     TracksListener myListener(&myDatabaseContent);
4749 
4750     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4751     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4752 
4753     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4754 
4755     connect(&myListener, &TracksListener::trackHasChanged,
4756             &myPlayList, &MediaPlayList::trackChanged,
4757             Qt::QueuedConnection);
4758     connect(&myListener, &TracksListener::tracksListAdded,
4759             &myPlayList, &MediaPlayList::tracksListAdded,
4760             Qt::QueuedConnection);
4761     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4762             &myListener, &TracksListener::trackByNameInList,
4763             Qt::QueuedConnection);
4764     connect(&myPlayList, &MediaPlayList::newEntryInList,
4765             &myListener, &TracksListener::newEntryInList,
4766             Qt::QueuedConnection);
4767     connect(&myPlayList, &MediaPlayList::newUrlInList,
4768             &myListener, &TracksListener::newUrlInList,
4769             Qt::QueuedConnection);
4770     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4771             &myListener, &TracksListener::tracksAdded);
4772 
4773     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4774 
4775     QCOMPARE(currentTrackChangedSpy.count(), 0);
4776     QCOMPARE(playListFinishedSpy.count(), 0);
4777 
4778     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4779                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4780                                    QStringLiteral("track1"), {}}}, {}, {});
4781 
4782     QCOMPARE(currentTrackChangedSpy.count(), 1);
4783     QCOMPARE(playListFinishedSpy.count(), 0);
4784 
4785     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4786 
4787     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4788                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
4789                                    QStringLiteral("track2"), {}}}, {}, {});
4790 
4791     QCOMPARE(currentTrackChangedSpy.count(), 1);
4792     QCOMPARE(playListFinishedSpy.count(), 0);
4793 
4794     myPlayListProxyModel.removeRow(0);
4795 
4796     QCOMPARE(currentTrackChangedSpy.count(), 2);
4797     QCOMPARE(playListFinishedSpy.count(), 0);
4798 
4799     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4800 }
4801 
4802 void MediaPlayListProxyModelTest::testBringUpAndDownCase()
4803 {
4804     MediaPlayList myPlayList;
4805     QAbstractItemModelTester testModel(&myPlayList);
4806     MediaPlayListProxyModel myPlayListProxyModel;
4807     myPlayListProxyModel.setPlayListModel(&myPlayList);
4808     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4809     DatabaseInterface myDatabaseContent;
4810     TracksListener myListener(&myDatabaseContent);
4811 
4812     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4813     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4814 
4815     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4816 
4817     connect(&myListener, &TracksListener::trackHasChanged,
4818             &myPlayList, &MediaPlayList::trackChanged,
4819             Qt::QueuedConnection);
4820     connect(&myListener, &TracksListener::tracksListAdded,
4821             &myPlayList, &MediaPlayList::tracksListAdded,
4822             Qt::QueuedConnection);
4823     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4824             &myListener, &TracksListener::trackByNameInList,
4825             Qt::QueuedConnection);
4826     connect(&myPlayList, &MediaPlayList::newEntryInList,
4827             &myListener, &TracksListener::newEntryInList,
4828             Qt::QueuedConnection);
4829     connect(&myPlayList, &MediaPlayList::newUrlInList,
4830             &myListener, &TracksListener::newUrlInList,
4831             Qt::QueuedConnection);
4832     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4833             &myListener, &TracksListener::tracksAdded);
4834 
4835     QCOMPARE(currentTrackChangedSpy.count(), 0);
4836     QCOMPARE(playListFinishedSpy.count(), 0);
4837 
4838     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4839 
4840     QCOMPARE(currentTrackChangedSpy.count(), 0);
4841     QCOMPARE(playListFinishedSpy.count(), 0);
4842 
4843     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4844                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4845                                    QStringLiteral("track1"), {}}}, {}, {});
4846 
4847     QCOMPARE(currentTrackChangedSpy.count(), 1);
4848     QCOMPARE(playListFinishedSpy.count(), 0);
4849 
4850     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4851 
4852     myPlayListProxyModel.removeRow(0);
4853 
4854     QCOMPARE(currentTrackChangedSpy.count(), 2);
4855     QCOMPARE(playListFinishedSpy.count(), 1);
4856 
4857     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex());
4858 }
4859 
4860 void MediaPlayListProxyModelTest::testBringUpCase()
4861 {
4862     MediaPlayList myPlayList;
4863     QAbstractItemModelTester testModel(&myPlayList);
4864     MediaPlayListProxyModel myPlayListProxyModel;
4865     myPlayListProxyModel.setPlayListModel(&myPlayList);
4866     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4867     DatabaseInterface myDatabaseContent;
4868     TracksListener myListener(&myDatabaseContent);
4869 
4870     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4871     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4872 
4873     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4874 
4875     connect(&myListener, &TracksListener::trackHasChanged,
4876             &myPlayList, &MediaPlayList::trackChanged,
4877             Qt::QueuedConnection);
4878     connect(&myListener, &TracksListener::tracksListAdded,
4879             &myPlayList, &MediaPlayList::tracksListAdded,
4880             Qt::QueuedConnection);
4881     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4882             &myListener, &TracksListener::trackByNameInList,
4883             Qt::QueuedConnection);
4884     connect(&myPlayList, &MediaPlayList::newEntryInList,
4885             &myListener, &TracksListener::newEntryInList,
4886             Qt::QueuedConnection);
4887     connect(&myPlayList, &MediaPlayList::newUrlInList,
4888             &myListener, &TracksListener::newUrlInList,
4889             Qt::QueuedConnection);
4890     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4891             &myListener, &TracksListener::tracksAdded);
4892 
4893     QCOMPARE(currentTrackChangedSpy.count(), 0);
4894     QCOMPARE(playListFinishedSpy.count(), 0);
4895 
4896     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4897 
4898     QCOMPARE(currentTrackChangedSpy.count(), 0);
4899     QCOMPARE(playListFinishedSpy.count(), 0);
4900 
4901     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4902                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4903                                    QStringLiteral("track1"), {}}}, {}, {});
4904 
4905     QCOMPARE(currentTrackChangedSpy.count(), 1);
4906     QCOMPARE(playListFinishedSpy.count(), 0);
4907 
4908     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4909 }
4910 
4911 void MediaPlayListProxyModelTest::testBringUpCaseFromNewAlbum()
4912 {
4913     MediaPlayList myPlayList;
4914     QAbstractItemModelTester testModel(&myPlayList);
4915     MediaPlayListProxyModel myPlayListProxyModel;
4916     myPlayListProxyModel.setPlayListModel(&myPlayList);
4917     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4918     DatabaseInterface myDatabaseContent;
4919     TracksListener myListener(&myDatabaseContent);
4920 
4921     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4922     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4923 
4924     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4925 
4926     connect(&myListener, &TracksListener::trackHasChanged,
4927             &myPlayList, &MediaPlayList::trackChanged,
4928             Qt::QueuedConnection);
4929     connect(&myListener, &TracksListener::tracksListAdded,
4930             &myPlayList, &MediaPlayList::tracksListAdded,
4931             Qt::QueuedConnection);
4932     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4933             &myListener, &TracksListener::trackByNameInList,
4934             Qt::QueuedConnection);
4935     connect(&myPlayList, &MediaPlayList::newEntryInList,
4936             &myListener, &TracksListener::newEntryInList,
4937             Qt::QueuedConnection);
4938     connect(&myPlayList, &MediaPlayList::newUrlInList,
4939             &myListener, &TracksListener::newUrlInList,
4940             Qt::QueuedConnection);
4941     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4942             &myListener, &TracksListener::tracksAdded);
4943 
4944     QCOMPARE(currentTrackChangedSpy.count(), 0);
4945     QCOMPARE(playListFinishedSpy.count(), 0);
4946 
4947     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4948 
4949     QCOMPARE(currentTrackChangedSpy.count(), 0);
4950     QCOMPARE(playListFinishedSpy.count(), 0);
4951 
4952     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
4953                                                                              QStringLiteral("album2"), 1, 1);
4954 
4955     QVERIFY(newTrackID != 0);
4956 
4957     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4958                                     {DataTypes::DatabaseIdRole, newTrackID}}, QStringLiteral("track1"), {}}}, {}, {});
4959 
4960     QCOMPARE(currentTrackChangedSpy.count(), 1);
4961     QCOMPARE(playListFinishedSpy.count(), 0);
4962 
4963     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4964 }
4965 
4966 void MediaPlayListProxyModelTest::testSetData()
4967 {
4968     MediaPlayList myPlayList;
4969     QAbstractItemModelTester testModel(&myPlayList);
4970     MediaPlayListProxyModel myPlayListProxyModel;
4971     myPlayListProxyModel.setPlayListModel(&myPlayList);
4972     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4973     DatabaseInterface myDatabaseContent;
4974     TracksListener myListener(&myDatabaseContent);
4975 
4976     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
4977     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
4978     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
4979     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
4980     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
4981     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
4982     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
4983     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
4984     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
4985     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
4986     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
4987 
4988     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4989     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4990     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4991     QCOMPARE(rowsRemovedSpy.count(), 0);
4992     QCOMPARE(rowsMovedSpy.count(), 0);
4993     QCOMPARE(rowsInsertedSpy.count(), 0);
4994     QCOMPARE(persistentStateChangedSpy.count(), 0);
4995     QCOMPARE(dataChangedSpy.count(), 0);
4996     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4997     QCOMPARE(newEntryInListSpy.count(), 0);
4998 
4999     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5000 
5001     connect(&myListener, &TracksListener::trackHasChanged,
5002             &myPlayList, &MediaPlayList::trackChanged,
5003             Qt::QueuedConnection);
5004     connect(&myListener, &TracksListener::tracksListAdded,
5005             &myPlayList, &MediaPlayList::tracksListAdded,
5006             Qt::QueuedConnection);
5007     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5008             &myListener, &TracksListener::trackByNameInList,
5009             Qt::QueuedConnection);
5010     connect(&myPlayList, &MediaPlayList::newEntryInList,
5011             &myListener, &TracksListener::newEntryInList,
5012             Qt::QueuedConnection);
5013     connect(&myPlayList, &MediaPlayList::newUrlInList,
5014             &myListener, &TracksListener::newUrlInList,
5015             Qt::QueuedConnection);
5016     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5017             &myListener, &TracksListener::tracksAdded);
5018 
5019     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5020 
5021     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5022     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5023     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5024     QCOMPARE(rowsRemovedSpy.count(), 0);
5025     QCOMPARE(rowsMovedSpy.count(), 0);
5026     QCOMPARE(rowsInsertedSpy.count(), 0);
5027     QCOMPARE(persistentStateChangedSpy.count(), 0);
5028     QCOMPARE(dataChangedSpy.count(), 0);
5029     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5030     QCOMPARE(newEntryInListSpy.count(), 0);
5031 
5032     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
5033                                                                                QStringLiteral("album3"), 1, 1);
5034     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5035                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5036 
5037     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5038     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5039     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5040     QCOMPARE(rowsRemovedSpy.count(), 0);
5041     QCOMPARE(rowsMovedSpy.count(), 0);
5042     QCOMPARE(rowsInsertedSpy.count(), 1);
5043     QCOMPARE(persistentStateChangedSpy.count(), 1);
5044     QCOMPARE(dataChangedSpy.count(), 0);
5045     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5046     QCOMPARE(newEntryInListSpy.count(), 1);
5047 
5048     QCOMPARE(dataChangedSpy.wait(), true);
5049 
5050     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5051     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5052     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5053     QCOMPARE(rowsRemovedSpy.count(), 0);
5054     QCOMPARE(rowsMovedSpy.count(), 0);
5055     QCOMPARE(rowsInsertedSpy.count(), 1);
5056     QCOMPARE(persistentStateChangedSpy.count(), 1);
5057     QCOMPARE(dataChangedSpy.count(), 1);
5058     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5059     QCOMPARE(newEntryInListSpy.count(), 1);
5060 
5061     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5062 
5063     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
5064                                                                                 QStringLiteral("album1"), 1, 1);
5065     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5066                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5067 
5068     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5069     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5070     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5071     QCOMPARE(rowsRemovedSpy.count(), 0);
5072     QCOMPARE(rowsMovedSpy.count(), 0);
5073     QCOMPARE(rowsInsertedSpy.count(), 2);
5074     QCOMPARE(persistentStateChangedSpy.count(), 2);
5075     QCOMPARE(dataChangedSpy.count(), 1);
5076     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5077     QCOMPARE(newEntryInListSpy.count(), 2);
5078 
5079     QCOMPARE(dataChangedSpy.wait(), true);
5080 
5081     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5082     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5083     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5084     QCOMPARE(rowsRemovedSpy.count(), 0);
5085     QCOMPARE(rowsMovedSpy.count(), 0);
5086     QCOMPARE(rowsInsertedSpy.count(), 2);
5087     QCOMPARE(persistentStateChangedSpy.count(), 2);
5088     QCOMPARE(dataChangedSpy.count(), 2);
5089     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5090     QCOMPARE(newEntryInListSpy.count(), 2);
5091 
5092     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5093     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5094 
5095     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
5096                                                                                QStringLiteral("album3"), 2, 1);
5097     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5098                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5099 
5100     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5101     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5102     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5103     QCOMPARE(rowsRemovedSpy.count(), 0);
5104     QCOMPARE(rowsMovedSpy.count(), 0);
5105     QCOMPARE(rowsInsertedSpy.count(), 3);
5106     QCOMPARE(persistentStateChangedSpy.count(), 3);
5107     QCOMPARE(dataChangedSpy.count(), 2);
5108     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5109     QCOMPARE(newEntryInListSpy.count(), 3);
5110 
5111     QCOMPARE(dataChangedSpy.wait(), true);
5112 
5113     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5114     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5115     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5116     QCOMPARE(rowsRemovedSpy.count(), 0);
5117     QCOMPARE(rowsMovedSpy.count(), 0);
5118     QCOMPARE(rowsInsertedSpy.count(), 3);
5119     QCOMPARE(persistentStateChangedSpy.count(), 3);
5120     QCOMPARE(dataChangedSpy.count(), 3);
5121     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5122     QCOMPARE(newEntryInListSpy.count(), 3);
5123 
5124     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5125     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5126     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5127 
5128     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::IsPlayingRole), true);
5129 
5130     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5131     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5132     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5133     QCOMPARE(rowsRemovedSpy.count(), 0);
5134     QCOMPARE(rowsMovedSpy.count(), 0);
5135     QCOMPARE(rowsInsertedSpy.count(), 3);
5136     QCOMPARE(persistentStateChangedSpy.count(), 3);
5137     QCOMPARE(dataChangedSpy.count(), 4);
5138     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5139     QCOMPARE(newEntryInListSpy.count(), 3);
5140 
5141     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5142     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5143     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true);
5144 
5145     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::SecondaryTextRole), false);
5146 
5147     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5148     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5149     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5150     QCOMPARE(rowsRemovedSpy.count(), 0);
5151     QCOMPARE(rowsMovedSpy.count(), 0);
5152     QCOMPARE(rowsInsertedSpy.count(), 3);
5153     QCOMPARE(persistentStateChangedSpy.count(), 3);
5154     QCOMPARE(dataChangedSpy.count(), 4);
5155     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5156     QCOMPARE(newEntryInListSpy.count(), 3);
5157 
5158     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(4, 0), true, MediaPlayList::ColumnsRoles::TitleRole), false);
5159 
5160     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5161     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5162     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5163     QCOMPARE(rowsRemovedSpy.count(), 0);
5164     QCOMPARE(rowsMovedSpy.count(), 0);
5165     QCOMPARE(rowsInsertedSpy.count(), 3);
5166     QCOMPARE(persistentStateChangedSpy.count(), 3);
5167     QCOMPARE(dataChangedSpy.count(), 4);
5168     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5169     QCOMPARE(newEntryInListSpy.count(), 3);
5170 
5171     QCOMPARE(myPlayListProxyModel.setData({}, true, MediaPlayList::ColumnsRoles::TitleRole), false);
5172 
5173     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5174     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5175     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5176     QCOMPARE(rowsRemovedSpy.count(), 0);
5177     QCOMPARE(rowsMovedSpy.count(), 0);
5178     QCOMPARE(rowsInsertedSpy.count(), 3);
5179     QCOMPARE(persistentStateChangedSpy.count(), 3);
5180     QCOMPARE(dataChangedSpy.count(), 4);
5181     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5182     QCOMPARE(newEntryInListSpy.count(), 3);
5183 }
5184 
5185 void MediaPlayListProxyModelTest::testHasHeader()
5186 {
5187     MediaPlayList myPlayList;
5188     QAbstractItemModelTester testModel(&myPlayList);
5189     MediaPlayListProxyModel myPlayListProxyModel;
5190     myPlayListProxyModel.setPlayListModel(&myPlayList);
5191     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5192     DatabaseInterface myDatabaseContent;
5193     TracksListener myListener(&myDatabaseContent);
5194 
5195     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5196     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5197     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5198     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5199     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5200     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5201     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5202     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5203     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5204     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5205     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5206 
5207     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5208     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5209     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5210     QCOMPARE(rowsRemovedSpy.count(), 0);
5211     QCOMPARE(rowsMovedSpy.count(), 0);
5212     QCOMPARE(rowsInsertedSpy.count(), 0);
5213     QCOMPARE(persistentStateChangedSpy.count(), 0);
5214     QCOMPARE(dataChangedSpy.count(), 0);
5215     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5216     QCOMPARE(newEntryInListSpy.count(), 0);
5217 
5218     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5219 
5220     connect(&myListener, &TracksListener::trackHasChanged,
5221             &myPlayList, &MediaPlayList::trackChanged,
5222             Qt::QueuedConnection);
5223     connect(&myListener, &TracksListener::tracksListAdded,
5224             &myPlayList, &MediaPlayList::tracksListAdded,
5225             Qt::QueuedConnection);
5226     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5227             &myListener, &TracksListener::trackByNameInList,
5228             Qt::QueuedConnection);
5229     connect(&myPlayList, &MediaPlayList::newEntryInList,
5230             &myListener, &TracksListener::newEntryInList,
5231             Qt::QueuedConnection);
5232     connect(&myPlayList, &MediaPlayList::newUrlInList,
5233             &myListener, &TracksListener::newUrlInList,
5234             Qt::QueuedConnection);
5235     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5236             &myListener, &TracksListener::tracksAdded);
5237 
5238     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5239 
5240     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5241     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5242     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5243     QCOMPARE(rowsRemovedSpy.count(), 0);
5244     QCOMPARE(rowsMovedSpy.count(), 0);
5245     QCOMPARE(rowsInsertedSpy.count(), 0);
5246     QCOMPARE(persistentStateChangedSpy.count(), 0);
5247     QCOMPARE(dataChangedSpy.count(), 0);
5248     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5249     QCOMPARE(newEntryInListSpy.count(), 0);
5250 
5251     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5252     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5253                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5254 
5255     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5256     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5257     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5258     QCOMPARE(rowsRemovedSpy.count(), 0);
5259     QCOMPARE(rowsMovedSpy.count(), 0);
5260     QCOMPARE(rowsInsertedSpy.count(), 1);
5261     QCOMPARE(persistentStateChangedSpy.count(), 1);
5262     QCOMPARE(dataChangedSpy.count(), 0);
5263     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5264     QCOMPARE(newEntryInListSpy.count(), 1);
5265 
5266     QCOMPARE(dataChangedSpy.wait(), true);
5267 
5268     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5269     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5270     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5271     QCOMPARE(rowsRemovedSpy.count(), 0);
5272     QCOMPARE(rowsMovedSpy.count(), 0);
5273     QCOMPARE(rowsInsertedSpy.count(), 1);
5274     QCOMPARE(persistentStateChangedSpy.count(), 1);
5275     QCOMPARE(dataChangedSpy.count(), 1);
5276     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5277     QCOMPARE(newEntryInListSpy.count(), 1);
5278 
5279     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
5280     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5281                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5282 
5283     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5284     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5285     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5286     QCOMPARE(rowsRemovedSpy.count(), 0);
5287     QCOMPARE(rowsMovedSpy.count(), 0);
5288     QCOMPARE(rowsInsertedSpy.count(), 2);
5289     QCOMPARE(persistentStateChangedSpy.count(), 2);
5290     QCOMPARE(dataChangedSpy.count(), 1);
5291     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5292     QCOMPARE(newEntryInListSpy.count(), 2);
5293 
5294     QCOMPARE(dataChangedSpy.wait(), true);
5295 
5296     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5297     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5298     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5299     QCOMPARE(rowsRemovedSpy.count(), 0);
5300     QCOMPARE(rowsMovedSpy.count(), 0);
5301     QCOMPARE(rowsInsertedSpy.count(), 2);
5302     QCOMPARE(persistentStateChangedSpy.count(), 2);
5303     QCOMPARE(dataChangedSpy.count(), 2);
5304     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5305     QCOMPARE(newEntryInListSpy.count(), 2);
5306 
5307     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5308     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5309                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5310 
5311     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5312     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5313     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5314     QCOMPARE(rowsRemovedSpy.count(), 0);
5315     QCOMPARE(rowsMovedSpy.count(), 0);
5316     QCOMPARE(rowsInsertedSpy.count(), 3);
5317     QCOMPARE(persistentStateChangedSpy.count(), 3);
5318     QCOMPARE(dataChangedSpy.count(), 2);
5319     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5320     QCOMPARE(newEntryInListSpy.count(), 3);
5321 
5322     QCOMPARE(dataChangedSpy.wait(), true);
5323 
5324     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5325     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5326     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5327     QCOMPARE(rowsRemovedSpy.count(), 0);
5328     QCOMPARE(rowsMovedSpy.count(), 0);
5329     QCOMPARE(rowsInsertedSpy.count(), 3);
5330     QCOMPARE(persistentStateChangedSpy.count(), 3);
5331     QCOMPARE(dataChangedSpy.count(), 3);
5332     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5333     QCOMPARE(newEntryInListSpy.count(), 3);
5334 
5335     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5336     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5337                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5338 
5339     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5340     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5341     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5342     QCOMPARE(rowsRemovedSpy.count(), 0);
5343     QCOMPARE(rowsMovedSpy.count(), 0);
5344     QCOMPARE(rowsInsertedSpy.count(), 4);
5345     QCOMPARE(persistentStateChangedSpy.count(), 4);
5346     QCOMPARE(dataChangedSpy.count(), 3);
5347     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5348     QCOMPARE(newEntryInListSpy.count(), 4);
5349 
5350     QCOMPARE(dataChangedSpy.wait(), true);
5351 
5352     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5353     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5354     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5355     QCOMPARE(rowsRemovedSpy.count(), 0);
5356     QCOMPARE(rowsMovedSpy.count(), 0);
5357     QCOMPARE(rowsInsertedSpy.count(), 4);
5358     QCOMPARE(persistentStateChangedSpy.count(), 4);
5359     QCOMPARE(dataChangedSpy.count(), 4);
5360     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5361     QCOMPARE(newEntryInListSpy.count(), 4);
5362 
5363     myPlayListProxyModel.removeRow(2);
5364 
5365     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
5366     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5367     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5368     QCOMPARE(rowsRemovedSpy.count(), 1);
5369     QCOMPARE(rowsMovedSpy.count(), 0);
5370     QCOMPARE(rowsInsertedSpy.count(), 4);
5371     QCOMPARE(persistentStateChangedSpy.count(), 5);
5372     QCOMPARE(dataChangedSpy.count(), 4);
5373     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5374     QCOMPARE(newEntryInListSpy.count(), 4);
5375 }
5376 
5377 void MediaPlayListProxyModelTest::testHasHeaderWithRemove()
5378 {
5379     MediaPlayList myPlayList;
5380     QAbstractItemModelTester testModel(&myPlayList);
5381     MediaPlayListProxyModel myPlayListProxyModel;
5382     myPlayListProxyModel.setPlayListModel(&myPlayList);
5383     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5384     DatabaseInterface myDatabaseContent;
5385     TracksListener myListener(&myDatabaseContent);
5386 
5387     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5388     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5389     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5390     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5391     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5392     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5393     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5394     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
5395     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5396     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5397     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5398 
5399     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5400     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5401     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5402     QCOMPARE(rowsRemovedSpy.count(), 0);
5403     QCOMPARE(rowsMovedSpy.count(), 0);
5404     QCOMPARE(rowsInsertedSpy.count(), 0);
5405     QCOMPARE(persistentStateChangedSpy.count(), 0);
5406     QCOMPARE(dataChangedSpy.count(), 0);
5407     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5408     QCOMPARE(newEntryInListSpy.count(), 0);
5409 
5410     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5411 
5412     connect(&myListener, &TracksListener::trackHasChanged,
5413             &myPlayList, &MediaPlayList::trackChanged,
5414             Qt::QueuedConnection);
5415     connect(&myListener, &TracksListener::tracksListAdded,
5416             &myPlayList, &MediaPlayList::tracksListAdded,
5417             Qt::QueuedConnection);
5418     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5419             &myListener, &TracksListener::trackByNameInList,
5420             Qt::QueuedConnection);
5421     connect(&myPlayList, &MediaPlayList::newEntryInList,
5422             &myListener, &TracksListener::newEntryInList,
5423             Qt::QueuedConnection);
5424     connect(&myPlayList, &MediaPlayList::newUrlInList,
5425             &myListener, &TracksListener::newUrlInList,
5426             Qt::QueuedConnection);
5427     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5428             &myListener, &TracksListener::tracksAdded);
5429 
5430     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5431 
5432     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5433     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5434     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5435     QCOMPARE(rowsRemovedSpy.count(), 0);
5436     QCOMPARE(rowsMovedSpy.count(), 0);
5437     QCOMPARE(rowsInsertedSpy.count(), 0);
5438     QCOMPARE(persistentStateChangedSpy.count(), 0);
5439     QCOMPARE(dataChangedSpy.count(), 0);
5440     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5441     QCOMPARE(newEntryInListSpy.count(), 0);
5442 
5443     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5444     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5445                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5446 
5447     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5448     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5449     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5450     QCOMPARE(rowsRemovedSpy.count(), 0);
5451     QCOMPARE(rowsMovedSpy.count(), 0);
5452     QCOMPARE(rowsInsertedSpy.count(), 1);
5453     QCOMPARE(persistentStateChangedSpy.count(), 1);
5454     QCOMPARE(dataChangedSpy.count(), 0);
5455     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5456     QCOMPARE(newEntryInListSpy.count(), 1);
5457 
5458     QCOMPARE(dataChangedSpy.wait(), true);
5459 
5460     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5461     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5462     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5463     QCOMPARE(rowsRemovedSpy.count(), 0);
5464     QCOMPARE(rowsMovedSpy.count(), 0);
5465     QCOMPARE(rowsInsertedSpy.count(), 1);
5466     QCOMPARE(persistentStateChangedSpy.count(), 1);
5467     QCOMPARE(dataChangedSpy.count(), 1);
5468     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5469     QCOMPARE(newEntryInListSpy.count(), 1);
5470 
5471     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5472     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5473                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5474 
5475     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5476     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5477     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5478     QCOMPARE(rowsRemovedSpy.count(), 0);
5479     QCOMPARE(rowsMovedSpy.count(), 0);
5480     QCOMPARE(rowsInsertedSpy.count(), 2);
5481     QCOMPARE(persistentStateChangedSpy.count(), 2);
5482     QCOMPARE(dataChangedSpy.count(), 1);
5483     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5484     QCOMPARE(newEntryInListSpy.count(), 2);
5485 
5486     QCOMPARE(dataChangedSpy.wait(), true);
5487 
5488     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5489     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5490     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5491     QCOMPARE(rowsRemovedSpy.count(), 0);
5492     QCOMPARE(rowsMovedSpy.count(), 0);
5493     QCOMPARE(rowsInsertedSpy.count(), 2);
5494     QCOMPARE(persistentStateChangedSpy.count(), 2);
5495     QCOMPARE(dataChangedSpy.count(), 2);
5496     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5497     QCOMPARE(newEntryInListSpy.count(), 2);
5498 
5499     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
5500     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5501                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5502 
5503     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5504     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5505     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5506     QCOMPARE(rowsRemovedSpy.count(), 0);
5507     QCOMPARE(rowsMovedSpy.count(), 0);
5508     QCOMPARE(rowsInsertedSpy.count(), 3);
5509     QCOMPARE(persistentStateChangedSpy.count(), 3);
5510     QCOMPARE(dataChangedSpy.count(), 2);
5511     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5512     QCOMPARE(newEntryInListSpy.count(), 3);
5513 
5514     QCOMPARE(dataChangedSpy.wait(), true);
5515 
5516     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5517     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5518     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5519     QCOMPARE(rowsRemovedSpy.count(), 0);
5520     QCOMPARE(rowsMovedSpy.count(), 0);
5521     QCOMPARE(rowsInsertedSpy.count(), 3);
5522     QCOMPARE(persistentStateChangedSpy.count(), 3);
5523     QCOMPARE(dataChangedSpy.count(), 3);
5524     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5525     QCOMPARE(newEntryInListSpy.count(), 3);
5526 
5527     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5528     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5529                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5530 
5531     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5532     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5533     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5534     QCOMPARE(rowsRemovedSpy.count(), 0);
5535     QCOMPARE(rowsMovedSpy.count(), 0);
5536     QCOMPARE(rowsInsertedSpy.count(), 4);
5537     QCOMPARE(persistentStateChangedSpy.count(), 4);
5538     QCOMPARE(dataChangedSpy.count(), 3);
5539     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5540     QCOMPARE(newEntryInListSpy.count(), 4);
5541 
5542     QCOMPARE(dataChangedSpy.wait(), true);
5543 
5544     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5545     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5546     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5547     QCOMPARE(rowsRemovedSpy.count(), 0);
5548     QCOMPARE(rowsMovedSpy.count(), 0);
5549     QCOMPARE(rowsInsertedSpy.count(), 4);
5550     QCOMPARE(persistentStateChangedSpy.count(), 4);
5551     QCOMPARE(dataChangedSpy.count(), 4);
5552     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5553     QCOMPARE(newEntryInListSpy.count(), 4);
5554 
5555     myPlayListProxyModel.removeRow(2);
5556 
5557     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
5558     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5559     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5560     QCOMPARE(rowsRemovedSpy.count(), 1);
5561     QCOMPARE(rowsMovedSpy.count(), 0);
5562     QCOMPARE(rowsInsertedSpy.count(), 4);
5563     QCOMPARE(persistentStateChangedSpy.count(), 5);
5564     QCOMPARE(dataChangedSpy.count(), 4);
5565     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5566     QCOMPARE(newEntryInListSpy.count(), 4);
5567 
5568     myPlayListProxyModel.removeRow(0);
5569 
5570     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
5571     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5572     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5573     QCOMPARE(rowsRemovedSpy.count(), 2);
5574     QCOMPARE(rowsMovedSpy.count(), 0);
5575     QCOMPARE(rowsInsertedSpy.count(), 4);
5576     QCOMPARE(persistentStateChangedSpy.count(), 6);
5577     QCOMPARE(dataChangedSpy.count(), 4);
5578     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5579     QCOMPARE(newEntryInListSpy.count(), 4);
5580 }
5581 
5582 void MediaPlayListProxyModelTest::testHasHeaderMoveFirst()
5583 {
5584     MediaPlayList myPlayList;
5585     QAbstractItemModelTester testModel(&myPlayList);
5586     MediaPlayListProxyModel myPlayListProxyModel;
5587     myPlayListProxyModel.setPlayListModel(&myPlayList);
5588     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5589     DatabaseInterface myDatabaseContent;
5590     TracksListener myListener(&myDatabaseContent);
5591 
5592     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5593     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5594     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5595     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5596     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5597     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5598     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5599     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5600     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5601     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5602     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5603 
5604     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5605     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5606     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5607     QCOMPARE(rowsRemovedSpy.count(), 0);
5608     QCOMPARE(rowsMovedSpy.count(), 0);
5609     QCOMPARE(rowsInsertedSpy.count(), 0);
5610     QCOMPARE(persistentStateChangedSpy.count(), 0);
5611     QCOMPARE(dataChangedSpy.count(), 0);
5612     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5613     QCOMPARE(newEntryInListSpy.count(), 0);
5614 
5615     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5616 
5617     connect(&myListener, &TracksListener::trackHasChanged,
5618             &myPlayList, &MediaPlayList::trackChanged,
5619             Qt::QueuedConnection);
5620     connect(&myListener, &TracksListener::tracksListAdded,
5621             &myPlayList, &MediaPlayList::tracksListAdded,
5622             Qt::QueuedConnection);
5623     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5624             &myListener, &TracksListener::trackByNameInList,
5625             Qt::QueuedConnection);
5626     connect(&myPlayList, &MediaPlayList::newEntryInList,
5627             &myListener, &TracksListener::newEntryInList,
5628             Qt::QueuedConnection);
5629     connect(&myPlayList, &MediaPlayList::newUrlInList,
5630             &myListener, &TracksListener::newUrlInList,
5631             Qt::QueuedConnection);
5632     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5633             &myListener, &TracksListener::tracksAdded);
5634 
5635     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5636 
5637     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5638     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5639     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5640     QCOMPARE(rowsRemovedSpy.count(), 0);
5641     QCOMPARE(rowsMovedSpy.count(), 0);
5642     QCOMPARE(rowsInsertedSpy.count(), 0);
5643     QCOMPARE(persistentStateChangedSpy.count(), 0);
5644     QCOMPARE(dataChangedSpy.count(), 0);
5645     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5646     QCOMPARE(newEntryInListSpy.count(), 0);
5647 
5648     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5649     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5650                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5651 
5652     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5653     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5654     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5655     QCOMPARE(rowsRemovedSpy.count(), 0);
5656     QCOMPARE(rowsMovedSpy.count(), 0);
5657     QCOMPARE(rowsInsertedSpy.count(), 1);
5658     QCOMPARE(persistentStateChangedSpy.count(), 1);
5659     QCOMPARE(dataChangedSpy.count(), 0);
5660     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5661     QCOMPARE(newEntryInListSpy.count(), 1);
5662 
5663     QCOMPARE(dataChangedSpy.wait(), true);
5664 
5665     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5666     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5667     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5668     QCOMPARE(rowsRemovedSpy.count(), 0);
5669     QCOMPARE(rowsMovedSpy.count(), 0);
5670     QCOMPARE(rowsInsertedSpy.count(), 1);
5671     QCOMPARE(persistentStateChangedSpy.count(), 1);
5672     QCOMPARE(dataChangedSpy.count(), 1);
5673     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5674     QCOMPARE(newEntryInListSpy.count(), 1);
5675 
5676     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5677     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5678                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5679 
5680     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5681     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5682     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5683     QCOMPARE(rowsRemovedSpy.count(), 0);
5684     QCOMPARE(rowsMovedSpy.count(), 0);
5685     QCOMPARE(rowsInsertedSpy.count(), 2);
5686     QCOMPARE(persistentStateChangedSpy.count(), 2);
5687     QCOMPARE(dataChangedSpy.count(), 1);
5688     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5689     QCOMPARE(newEntryInListSpy.count(), 2);
5690 
5691     QCOMPARE(dataChangedSpy.wait(), true);
5692 
5693     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5694     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5695     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5696     QCOMPARE(rowsRemovedSpy.count(), 0);
5697     QCOMPARE(rowsMovedSpy.count(), 0);
5698     QCOMPARE(rowsInsertedSpy.count(), 2);
5699     QCOMPARE(persistentStateChangedSpy.count(), 2);
5700     QCOMPARE(dataChangedSpy.count(), 2);
5701     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5702     QCOMPARE(newEntryInListSpy.count(), 2);
5703 
5704     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5705     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5706                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5707 
5708     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5709     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5710     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5711     QCOMPARE(rowsRemovedSpy.count(), 0);
5712     QCOMPARE(rowsMovedSpy.count(), 0);
5713     QCOMPARE(rowsInsertedSpy.count(), 3);
5714     QCOMPARE(persistentStateChangedSpy.count(), 3);
5715     QCOMPARE(dataChangedSpy.count(), 2);
5716     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5717     QCOMPARE(newEntryInListSpy.count(), 3);
5718 
5719     QCOMPARE(dataChangedSpy.wait(), true);
5720 
5721     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5722     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5723     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5724     QCOMPARE(rowsRemovedSpy.count(), 0);
5725     QCOMPARE(rowsMovedSpy.count(), 0);
5726     QCOMPARE(rowsInsertedSpy.count(), 3);
5727     QCOMPARE(persistentStateChangedSpy.count(), 3);
5728     QCOMPARE(dataChangedSpy.count(), 3);
5729     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5730     QCOMPARE(newEntryInListSpy.count(), 3);
5731 
5732     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
5733     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5734                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5735 
5736     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5737     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5738     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5739     QCOMPARE(rowsRemovedSpy.count(), 0);
5740     QCOMPARE(rowsMovedSpy.count(), 0);
5741     QCOMPARE(rowsInsertedSpy.count(), 4);
5742     QCOMPARE(persistentStateChangedSpy.count(), 4);
5743     QCOMPARE(dataChangedSpy.count(), 3);
5744     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5745     QCOMPARE(newEntryInListSpy.count(), 4);
5746 
5747     QCOMPARE(dataChangedSpy.wait(), true);
5748 
5749     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5750     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5751     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5752     QCOMPARE(rowsRemovedSpy.count(), 0);
5753     QCOMPARE(rowsMovedSpy.count(), 0);
5754     QCOMPARE(rowsInsertedSpy.count(), 4);
5755     QCOMPARE(persistentStateChangedSpy.count(), 4);
5756     QCOMPARE(dataChangedSpy.count(), 4);
5757     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5758     QCOMPARE(newEntryInListSpy.count(), 4);
5759 
5760     myPlayListProxyModel.moveRow(0, 3);
5761 
5762     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5763     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
5764     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5765     QCOMPARE(rowsRemovedSpy.count(), 0);
5766     QCOMPARE(rowsMovedSpy.count(), 1);
5767     QCOMPARE(rowsInsertedSpy.count(), 4);
5768     QCOMPARE(persistentStateChangedSpy.count(), 5);
5769     QCOMPARE(dataChangedSpy.count(), 4);
5770     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5771     QCOMPARE(newEntryInListSpy.count(), 4);
5772 }
5773 
5774 void MediaPlayListProxyModelTest::testHasHeaderMoveAnother()
5775 {
5776     MediaPlayList myPlayList;
5777     QAbstractItemModelTester testModel(&myPlayList);
5778     MediaPlayListProxyModel myPlayListProxyModel;
5779     myPlayListProxyModel.setPlayListModel(&myPlayList);
5780     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5781     DatabaseInterface myDatabaseContent;
5782     TracksListener myListener(&myDatabaseContent);
5783 
5784     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5785     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5786     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5787     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5788     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5789     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5790     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5791     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5792     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5793     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5794     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5795 
5796     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5797     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5798     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5799     QCOMPARE(rowsRemovedSpy.count(), 0);
5800     QCOMPARE(rowsMovedSpy.count(), 0);
5801     QCOMPARE(rowsInsertedSpy.count(), 0);
5802     QCOMPARE(persistentStateChangedSpy.count(), 0);
5803     QCOMPARE(dataChangedSpy.count(), 0);
5804     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5805     QCOMPARE(newEntryInListSpy.count(), 0);
5806 
5807     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5808 
5809     connect(&myListener, &TracksListener::trackHasChanged,
5810             &myPlayList, &MediaPlayList::trackChanged,
5811             Qt::QueuedConnection);
5812     connect(&myListener, &TracksListener::tracksListAdded,
5813             &myPlayList, &MediaPlayList::tracksListAdded,
5814             Qt::QueuedConnection);
5815     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5816             &myListener, &TracksListener::trackByNameInList,
5817             Qt::QueuedConnection);
5818     connect(&myPlayList, &MediaPlayList::newEntryInList,
5819             &myListener, &TracksListener::newEntryInList,
5820             Qt::QueuedConnection);
5821     connect(&myPlayList, &MediaPlayList::newUrlInList,
5822             &myListener, &TracksListener::newUrlInList,
5823             Qt::QueuedConnection);
5824     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5825             &myListener, &TracksListener::tracksAdded);
5826 
5827     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5828 
5829     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5830     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5831     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5832     QCOMPARE(rowsRemovedSpy.count(), 0);
5833     QCOMPARE(rowsMovedSpy.count(), 0);
5834     QCOMPARE(rowsInsertedSpy.count(), 0);
5835     QCOMPARE(persistentStateChangedSpy.count(), 0);
5836     QCOMPARE(dataChangedSpy.count(), 0);
5837     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5838     QCOMPARE(newEntryInListSpy.count(), 0);
5839 
5840     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5841     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5842                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5843 
5844     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5845     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5846     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5847     QCOMPARE(rowsRemovedSpy.count(), 0);
5848     QCOMPARE(rowsMovedSpy.count(), 0);
5849     QCOMPARE(rowsInsertedSpy.count(), 1);
5850     QCOMPARE(persistentStateChangedSpy.count(), 1);
5851     QCOMPARE(dataChangedSpy.count(), 0);
5852     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5853     QCOMPARE(newEntryInListSpy.count(), 1);
5854 
5855     QCOMPARE(dataChangedSpy.wait(), true);
5856 
5857     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5858     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5859     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5860     QCOMPARE(rowsRemovedSpy.count(), 0);
5861     QCOMPARE(rowsMovedSpy.count(), 0);
5862     QCOMPARE(rowsInsertedSpy.count(), 1);
5863     QCOMPARE(persistentStateChangedSpy.count(), 1);
5864     QCOMPARE(dataChangedSpy.count(), 1);
5865     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5866     QCOMPARE(newEntryInListSpy.count(), 1);
5867 
5868     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5869     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5870                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5871 
5872     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5873     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5874     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5875     QCOMPARE(rowsRemovedSpy.count(), 0);
5876     QCOMPARE(rowsMovedSpy.count(), 0);
5877     QCOMPARE(rowsInsertedSpy.count(), 2);
5878     QCOMPARE(persistentStateChangedSpy.count(), 2);
5879     QCOMPARE(dataChangedSpy.count(), 1);
5880     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5881     QCOMPARE(newEntryInListSpy.count(), 2);
5882 
5883     QCOMPARE(dataChangedSpy.wait(), true);
5884 
5885     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5886     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5887     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5888     QCOMPARE(rowsRemovedSpy.count(), 0);
5889     QCOMPARE(rowsMovedSpy.count(), 0);
5890     QCOMPARE(rowsInsertedSpy.count(), 2);
5891     QCOMPARE(persistentStateChangedSpy.count(), 2);
5892     QCOMPARE(dataChangedSpy.count(), 2);
5893     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5894     QCOMPARE(newEntryInListSpy.count(), 2);
5895 
5896     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5897     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5898                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5899 
5900     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5901     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5902     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5903     QCOMPARE(rowsRemovedSpy.count(), 0);
5904     QCOMPARE(rowsMovedSpy.count(), 0);
5905     QCOMPARE(rowsInsertedSpy.count(), 3);
5906     QCOMPARE(persistentStateChangedSpy.count(), 3);
5907     QCOMPARE(dataChangedSpy.count(), 2);
5908     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5909     QCOMPARE(newEntryInListSpy.count(), 3);
5910 
5911     QCOMPARE(dataChangedSpy.wait(), true);
5912 
5913     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5914     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5915     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5916     QCOMPARE(rowsRemovedSpy.count(), 0);
5917     QCOMPARE(rowsMovedSpy.count(), 0);
5918     QCOMPARE(rowsInsertedSpy.count(), 3);
5919     QCOMPARE(persistentStateChangedSpy.count(), 3);
5920     QCOMPARE(dataChangedSpy.count(), 3);
5921     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5922     QCOMPARE(newEntryInListSpy.count(), 3);
5923 
5924     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
5925     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5926                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5927 
5928     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5929     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5930     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5931     QCOMPARE(rowsRemovedSpy.count(), 0);
5932     QCOMPARE(rowsMovedSpy.count(), 0);
5933     QCOMPARE(rowsInsertedSpy.count(), 4);
5934     QCOMPARE(persistentStateChangedSpy.count(), 4);
5935     QCOMPARE(dataChangedSpy.count(), 3);
5936     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5937     QCOMPARE(newEntryInListSpy.count(), 4);
5938 
5939     QCOMPARE(dataChangedSpy.wait(), true);
5940 
5941     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5942     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5943     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5944     QCOMPARE(rowsRemovedSpy.count(), 0);
5945     QCOMPARE(rowsMovedSpy.count(), 0);
5946     QCOMPARE(rowsInsertedSpy.count(), 4);
5947     QCOMPARE(persistentStateChangedSpy.count(), 4);
5948     QCOMPARE(dataChangedSpy.count(), 4);
5949     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5950     QCOMPARE(newEntryInListSpy.count(), 4);
5951 
5952     myPlayListProxyModel.moveRow(3, 0);
5953 
5954     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5955     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
5956     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5957     QCOMPARE(rowsRemovedSpy.count(), 0);
5958     QCOMPARE(rowsMovedSpy.count(), 1);
5959     QCOMPARE(rowsInsertedSpy.count(), 4);
5960     QCOMPARE(persistentStateChangedSpy.count(), 5);
5961     QCOMPARE(dataChangedSpy.count(), 4);
5962     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5963     QCOMPARE(newEntryInListSpy.count(), 4);
5964 }
5965 
5966 void MediaPlayListProxyModelTest::testHasHeaderAlbumWithSameTitle()
5967 {
5968     MediaPlayList myPlayList;
5969     QAbstractItemModelTester testModel(&myPlayList);
5970     MediaPlayListProxyModel myPlayListProxyModel;
5971     myPlayListProxyModel.setPlayListModel(&myPlayList);
5972     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5973     DatabaseInterface myDatabaseContent;
5974     TracksListener myListener(&myDatabaseContent);
5975 
5976     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5977     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5978     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5979     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5980     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5981     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5982     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5983     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5984     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5985     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5986     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5987 
5988     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5989     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5990     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5991     QCOMPARE(rowsRemovedSpy.count(), 0);
5992     QCOMPARE(rowsMovedSpy.count(), 0);
5993     QCOMPARE(rowsInsertedSpy.count(), 0);
5994     QCOMPARE(persistentStateChangedSpy.count(), 0);
5995     QCOMPARE(dataChangedSpy.count(), 0);
5996     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5997     QCOMPARE(newEntryInListSpy.count(), 0);
5998 
5999     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6000 
6001     connect(&myListener, &TracksListener::trackHasChanged,
6002             &myPlayList, &MediaPlayList::trackChanged,
6003             Qt::QueuedConnection);
6004     connect(&myListener, &TracksListener::tracksListAdded,
6005             &myPlayList, &MediaPlayList::tracksListAdded,
6006             Qt::QueuedConnection);
6007     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6008             &myListener, &TracksListener::trackByNameInList,
6009             Qt::QueuedConnection);
6010     connect(&myPlayList, &MediaPlayList::newEntryInList,
6011             &myListener, &TracksListener::newEntryInList,
6012             Qt::QueuedConnection);
6013     connect(&myPlayList, &MediaPlayList::newUrlInList,
6014             &myListener, &TracksListener::newUrlInList,
6015             Qt::QueuedConnection);
6016     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6017             &myListener, &TracksListener::tracksAdded);
6018 
6019     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6020 
6021     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6022     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6023     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6024     QCOMPARE(rowsRemovedSpy.count(), 0);
6025     QCOMPARE(rowsMovedSpy.count(), 0);
6026     QCOMPARE(rowsInsertedSpy.count(), 0);
6027     QCOMPARE(persistentStateChangedSpy.count(), 0);
6028     QCOMPARE(dataChangedSpy.count(), 0);
6029     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6030     QCOMPARE(newEntryInListSpy.count(), 0);
6031 
6032     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
6033                                                                                QStringLiteral("album3"), 1, 1);
6034     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6035                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6036 
6037     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6038     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6039     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6040     QCOMPARE(rowsRemovedSpy.count(), 0);
6041     QCOMPARE(rowsMovedSpy.count(), 0);
6042     QCOMPARE(rowsInsertedSpy.count(), 1);
6043     QCOMPARE(persistentStateChangedSpy.count(), 1);
6044     QCOMPARE(dataChangedSpy.count(), 0);
6045     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6046     QCOMPARE(newEntryInListSpy.count(), 1);
6047 
6048     QCOMPARE(dataChangedSpy.wait(), true);
6049 
6050     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6051     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6052     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6053     QCOMPARE(rowsRemovedSpy.count(), 0);
6054     QCOMPARE(rowsMovedSpy.count(), 0);
6055     QCOMPARE(rowsInsertedSpy.count(), 1);
6056     QCOMPARE(persistentStateChangedSpy.count(), 1);
6057     QCOMPARE(dataChangedSpy.count(), 1);
6058     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6059     QCOMPARE(newEntryInListSpy.count(), 1);
6060 
6061     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
6062                                                                                 QStringLiteral("album1"), 1, 1);
6063     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6064                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6065 
6066     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6067     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6068     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6069     QCOMPARE(rowsRemovedSpy.count(), 0);
6070     QCOMPARE(rowsMovedSpy.count(), 0);
6071     QCOMPARE(rowsInsertedSpy.count(), 2);
6072     QCOMPARE(persistentStateChangedSpy.count(), 2);
6073     QCOMPARE(dataChangedSpy.count(), 1);
6074     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6075     QCOMPARE(newEntryInListSpy.count(), 2);
6076 
6077     QCOMPARE(dataChangedSpy.wait(), true);
6078 
6079     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6080     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6081     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6082     QCOMPARE(rowsRemovedSpy.count(), 0);
6083     QCOMPARE(rowsMovedSpy.count(), 0);
6084     QCOMPARE(rowsInsertedSpy.count(), 2);
6085     QCOMPARE(persistentStateChangedSpy.count(), 2);
6086     QCOMPARE(dataChangedSpy.count(), 2);
6087     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6088     QCOMPARE(newEntryInListSpy.count(), 2);
6089 
6090     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
6091                                                                                QStringLiteral("album3"), 2, 1);
6092     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6093                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6094 
6095     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6096     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6097     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6098     QCOMPARE(rowsRemovedSpy.count(), 0);
6099     QCOMPARE(rowsMovedSpy.count(), 0);
6100     QCOMPARE(rowsInsertedSpy.count(), 3);
6101     QCOMPARE(persistentStateChangedSpy.count(), 3);
6102     QCOMPARE(dataChangedSpy.count(), 2);
6103     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6104     QCOMPARE(newEntryInListSpy.count(), 3);
6105 
6106     QCOMPARE(dataChangedSpy.wait(), true);
6107 
6108     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6109     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6110     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6111     QCOMPARE(rowsRemovedSpy.count(), 0);
6112     QCOMPARE(rowsMovedSpy.count(), 0);
6113     QCOMPARE(rowsInsertedSpy.count(), 3);
6114     QCOMPARE(persistentStateChangedSpy.count(), 3);
6115     QCOMPARE(dataChangedSpy.count(), 3);
6116     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6117     QCOMPARE(newEntryInListSpy.count(), 3);
6118 
6119     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
6120                                                                                 QStringLiteral("album3"), 3, 1);
6121     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6122                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6123 
6124     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6125     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6126     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6127     QCOMPARE(rowsRemovedSpy.count(), 0);
6128     QCOMPARE(rowsMovedSpy.count(), 0);
6129     QCOMPARE(rowsInsertedSpy.count(), 4);
6130     QCOMPARE(persistentStateChangedSpy.count(), 4);
6131     QCOMPARE(dataChangedSpy.count(), 3);
6132     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6133     QCOMPARE(newEntryInListSpy.count(), 4);
6134 
6135     QCOMPARE(dataChangedSpy.wait(), true);
6136 
6137     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6138     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6139     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6140     QCOMPARE(rowsRemovedSpy.count(), 0);
6141     QCOMPARE(rowsMovedSpy.count(), 0);
6142     QCOMPARE(rowsInsertedSpy.count(), 4);
6143     QCOMPARE(persistentStateChangedSpy.count(), 4);
6144     QCOMPARE(dataChangedSpy.count(), 4);
6145     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6146     QCOMPARE(newEntryInListSpy.count(), 4);
6147 
6148     auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"),
6149                                                                               QStringLiteral("album3"), 9, 1);
6150     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6151                                     {DataTypes::DatabaseIdRole, fithTrackId}}, {}, {}}}, {}, {});
6152 
6153     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6154     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6155     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
6156     QCOMPARE(rowsRemovedSpy.count(), 0);
6157     QCOMPARE(rowsMovedSpy.count(), 0);
6158     QCOMPARE(rowsInsertedSpy.count(), 5);
6159     QCOMPARE(persistentStateChangedSpy.count(), 5);
6160     QCOMPARE(dataChangedSpy.count(), 4);
6161     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6162     QCOMPARE(newEntryInListSpy.count(), 5);
6163 
6164     QCOMPARE(dataChangedSpy.wait(), true);
6165 
6166     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6167     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6168     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
6169     QCOMPARE(rowsRemovedSpy.count(), 0);
6170     QCOMPARE(rowsMovedSpy.count(), 0);
6171     QCOMPARE(rowsInsertedSpy.count(), 5);
6172     QCOMPARE(persistentStateChangedSpy.count(), 5);
6173     QCOMPARE(dataChangedSpy.count(), 5);
6174     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6175     QCOMPARE(newEntryInListSpy.count(), 5);
6176 
6177     auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"),
6178                                                                                QStringLiteral("album3"), 1, 1);
6179     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6180                                     {DataTypes::DatabaseIdRole, sixthTrackId}}, {}, {}}}, {}, {});
6181 
6182     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6183     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6184     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
6185     QCOMPARE(rowsRemovedSpy.count(), 0);
6186     QCOMPARE(rowsMovedSpy.count(), 0);
6187     QCOMPARE(rowsInsertedSpy.count(), 6);
6188     QCOMPARE(persistentStateChangedSpy.count(), 6);
6189     QCOMPARE(dataChangedSpy.count(), 5);
6190     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6191     QCOMPARE(newEntryInListSpy.count(), 6);
6192 
6193     QCOMPARE(dataChangedSpy.wait(), true);
6194 
6195     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6196     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6197     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
6198     QCOMPARE(rowsRemovedSpy.count(), 0);
6199     QCOMPARE(rowsMovedSpy.count(), 0);
6200     QCOMPARE(rowsInsertedSpy.count(), 6);
6201     QCOMPARE(persistentStateChangedSpy.count(), 6);
6202     QCOMPARE(dataChangedSpy.count(), 6);
6203     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6204     QCOMPARE(newEntryInListSpy.count(), 6);
6205 }
6206 
6207 void MediaPlayListProxyModelTest::testHasHeaderMoveFirstLikeQml()
6208 {
6209     MediaPlayList myPlayList;
6210     QAbstractItemModelTester testModel(&myPlayList);
6211     MediaPlayListProxyModel myPlayListProxyModel;
6212     myPlayListProxyModel.setPlayListModel(&myPlayList);
6213     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6214     DatabaseInterface myDatabaseContent;
6215     TracksListener myListener(&myDatabaseContent);
6216 
6217     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6218     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6219     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6220     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6221     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6222     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6223     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6224     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6225     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6226     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6227     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6228 
6229     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6230     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6231     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6232     QCOMPARE(rowsRemovedSpy.count(), 0);
6233     QCOMPARE(rowsMovedSpy.count(), 0);
6234     QCOMPARE(rowsInsertedSpy.count(), 0);
6235     QCOMPARE(persistentStateChangedSpy.count(), 0);
6236     QCOMPARE(dataChangedSpy.count(), 0);
6237     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6238     QCOMPARE(newEntryInListSpy.count(), 0);
6239 
6240     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6241 
6242     connect(&myListener, &TracksListener::trackHasChanged,
6243             &myPlayList, &MediaPlayList::trackChanged,
6244             Qt::QueuedConnection);
6245     connect(&myListener, &TracksListener::tracksListAdded,
6246             &myPlayList, &MediaPlayList::tracksListAdded,
6247             Qt::QueuedConnection);
6248     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6249             &myListener, &TracksListener::trackByNameInList,
6250             Qt::QueuedConnection);
6251     connect(&myPlayList, &MediaPlayList::newEntryInList,
6252             &myListener, &TracksListener::newEntryInList,
6253             Qt::QueuedConnection);
6254     connect(&myPlayList, &MediaPlayList::newUrlInList,
6255             &myListener, &TracksListener::newUrlInList,
6256             Qt::QueuedConnection);
6257     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6258             &myListener, &TracksListener::tracksAdded);
6259 
6260     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6261 
6262     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6263     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6264     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6265     QCOMPARE(rowsRemovedSpy.count(), 0);
6266     QCOMPARE(rowsMovedSpy.count(), 0);
6267     QCOMPARE(rowsInsertedSpy.count(), 0);
6268     QCOMPARE(persistentStateChangedSpy.count(), 0);
6269     QCOMPARE(dataChangedSpy.count(), 0);
6270     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6271     QCOMPARE(newEntryInListSpy.count(), 0);
6272 
6273     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6274     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6275                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6276 
6277     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6278     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6279     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6280     QCOMPARE(rowsRemovedSpy.count(), 0);
6281     QCOMPARE(rowsMovedSpy.count(), 0);
6282     QCOMPARE(rowsInsertedSpy.count(), 1);
6283     QCOMPARE(persistentStateChangedSpy.count(), 1);
6284     QCOMPARE(dataChangedSpy.count(), 0);
6285     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6286     QCOMPARE(newEntryInListSpy.count(), 1);
6287 
6288     QCOMPARE(dataChangedSpy.wait(), true);
6289 
6290     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6291     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6292     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6293     QCOMPARE(rowsRemovedSpy.count(), 0);
6294     QCOMPARE(rowsMovedSpy.count(), 0);
6295     QCOMPARE(rowsInsertedSpy.count(), 1);
6296     QCOMPARE(persistentStateChangedSpy.count(), 1);
6297     QCOMPARE(dataChangedSpy.count(), 1);
6298     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6299     QCOMPARE(newEntryInListSpy.count(), 1);
6300 
6301     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6302     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6303                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6304 
6305     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6306     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6307     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6308     QCOMPARE(rowsRemovedSpy.count(), 0);
6309     QCOMPARE(rowsMovedSpy.count(), 0);
6310     QCOMPARE(rowsInsertedSpy.count(), 2);
6311     QCOMPARE(persistentStateChangedSpy.count(), 2);
6312     QCOMPARE(dataChangedSpy.count(), 1);
6313     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6314     QCOMPARE(newEntryInListSpy.count(), 2);
6315 
6316     QCOMPARE(dataChangedSpy.wait(), true);
6317 
6318     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6319     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6320     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6321     QCOMPARE(rowsRemovedSpy.count(), 0);
6322     QCOMPARE(rowsMovedSpy.count(), 0);
6323     QCOMPARE(rowsInsertedSpy.count(), 2);
6324     QCOMPARE(persistentStateChangedSpy.count(), 2);
6325     QCOMPARE(dataChangedSpy.count(), 2);
6326     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6327     QCOMPARE(newEntryInListSpy.count(), 2);
6328 
6329     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
6330     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6331                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6332 
6333     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6334     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6335     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6336     QCOMPARE(rowsRemovedSpy.count(), 0);
6337     QCOMPARE(rowsMovedSpy.count(), 0);
6338     QCOMPARE(rowsInsertedSpy.count(), 3);
6339     QCOMPARE(persistentStateChangedSpy.count(), 3);
6340     QCOMPARE(dataChangedSpy.count(), 2);
6341     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6342     QCOMPARE(newEntryInListSpy.count(), 3);
6343 
6344     QCOMPARE(dataChangedSpy.wait(), true);
6345 
6346     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6347     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6348     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6349     QCOMPARE(rowsRemovedSpy.count(), 0);
6350     QCOMPARE(rowsMovedSpy.count(), 0);
6351     QCOMPARE(rowsInsertedSpy.count(), 3);
6352     QCOMPARE(persistentStateChangedSpy.count(), 3);
6353     QCOMPARE(dataChangedSpy.count(), 3);
6354     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6355     QCOMPARE(newEntryInListSpy.count(), 3);
6356 
6357     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6358     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6359                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6360 
6361     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6362     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6363     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6364     QCOMPARE(rowsRemovedSpy.count(), 0);
6365     QCOMPARE(rowsMovedSpy.count(), 0);
6366     QCOMPARE(rowsInsertedSpy.count(), 4);
6367     QCOMPARE(persistentStateChangedSpy.count(), 4);
6368     QCOMPARE(dataChangedSpy.count(), 3);
6369     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6370     QCOMPARE(newEntryInListSpy.count(), 4);
6371 
6372     QCOMPARE(dataChangedSpy.wait(), true);
6373 
6374     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6375     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6376     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6377     QCOMPARE(rowsRemovedSpy.count(), 0);
6378     QCOMPARE(rowsMovedSpy.count(), 0);
6379     QCOMPARE(rowsInsertedSpy.count(), 4);
6380     QCOMPARE(persistentStateChangedSpy.count(), 4);
6381     QCOMPARE(dataChangedSpy.count(), 4);
6382     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6383     QCOMPARE(newEntryInListSpy.count(), 4);
6384 
6385     myPlayListProxyModel.moveRow(0, 3);
6386 
6387     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6388     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6389     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6390     QCOMPARE(rowsRemovedSpy.count(), 0);
6391     QCOMPARE(rowsMovedSpy.count(), 1);
6392     QCOMPARE(rowsInsertedSpy.count(), 4);
6393     QCOMPARE(persistentStateChangedSpy.count(), 5);
6394     QCOMPARE(dataChangedSpy.count(), 4);
6395     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6396     QCOMPARE(newEntryInListSpy.count(), 4);
6397 }
6398 
6399 void MediaPlayListProxyModelTest::testHasHeaderMoveAnotherLikeQml()
6400 {
6401     MediaPlayList myPlayList;
6402     QAbstractItemModelTester testModel(&myPlayList);
6403     MediaPlayListProxyModel myPlayListProxyModel;
6404     myPlayListProxyModel.setPlayListModel(&myPlayList);
6405     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6406     DatabaseInterface myDatabaseContent;
6407     TracksListener myListener(&myDatabaseContent);
6408 
6409     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6410     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6411     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6412     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6413     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6414     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6415     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6416     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6417     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6418     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6419     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6420 
6421     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6422     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6423     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6424     QCOMPARE(rowsRemovedSpy.count(), 0);
6425     QCOMPARE(rowsMovedSpy.count(), 0);
6426     QCOMPARE(rowsInsertedSpy.count(), 0);
6427     QCOMPARE(persistentStateChangedSpy.count(), 0);
6428     QCOMPARE(dataChangedSpy.count(), 0);
6429     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6430     QCOMPARE(newEntryInListSpy.count(), 0);
6431 
6432     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6433 
6434     connect(&myListener, &TracksListener::trackHasChanged,
6435             &myPlayList, &MediaPlayList::trackChanged,
6436             Qt::QueuedConnection);
6437     connect(&myListener, &TracksListener::tracksListAdded,
6438             &myPlayList, &MediaPlayList::tracksListAdded,
6439             Qt::QueuedConnection);
6440     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6441             &myListener, &TracksListener::trackByNameInList,
6442             Qt::QueuedConnection);
6443     connect(&myPlayList, &MediaPlayList::newEntryInList,
6444             &myListener, &TracksListener::newEntryInList,
6445             Qt::QueuedConnection);
6446     connect(&myPlayList, &MediaPlayList::newUrlInList,
6447             &myListener, &TracksListener::newUrlInList,
6448             Qt::QueuedConnection);
6449     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6450             &myListener, &TracksListener::tracksAdded);
6451 
6452     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6453 
6454     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6455     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6456     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6457     QCOMPARE(rowsRemovedSpy.count(), 0);
6458     QCOMPARE(rowsMovedSpy.count(), 0);
6459     QCOMPARE(rowsInsertedSpy.count(), 0);
6460     QCOMPARE(persistentStateChangedSpy.count(), 0);
6461     QCOMPARE(dataChangedSpy.count(), 0);
6462     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6463     QCOMPARE(newEntryInListSpy.count(), 0);
6464 
6465     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6466     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6467                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6468 
6469     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6470     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6471     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6472     QCOMPARE(rowsRemovedSpy.count(), 0);
6473     QCOMPARE(rowsMovedSpy.count(), 0);
6474     QCOMPARE(rowsInsertedSpy.count(), 1);
6475     QCOMPARE(persistentStateChangedSpy.count(), 1);
6476     QCOMPARE(dataChangedSpy.count(), 0);
6477     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6478     QCOMPARE(newEntryInListSpy.count(), 1);
6479 
6480     QCOMPARE(dataChangedSpy.wait(), true);
6481 
6482     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6483     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6484     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6485     QCOMPARE(rowsRemovedSpy.count(), 0);
6486     QCOMPARE(rowsMovedSpy.count(), 0);
6487     QCOMPARE(rowsInsertedSpy.count(), 1);
6488     QCOMPARE(persistentStateChangedSpy.count(), 1);
6489     QCOMPARE(dataChangedSpy.count(), 1);
6490     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6491     QCOMPARE(newEntryInListSpy.count(), 1);
6492 
6493     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6494     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6495                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6496 
6497     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6498     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6499     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6500     QCOMPARE(rowsRemovedSpy.count(), 0);
6501     QCOMPARE(rowsMovedSpy.count(), 0);
6502     QCOMPARE(rowsInsertedSpy.count(), 2);
6503     QCOMPARE(persistentStateChangedSpy.count(), 2);
6504     QCOMPARE(dataChangedSpy.count(), 1);
6505     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6506     QCOMPARE(newEntryInListSpy.count(), 2);
6507 
6508     QCOMPARE(dataChangedSpy.wait(), true);
6509 
6510     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6511     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6512     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6513     QCOMPARE(rowsRemovedSpy.count(), 0);
6514     QCOMPARE(rowsMovedSpy.count(), 0);
6515     QCOMPARE(rowsInsertedSpy.count(), 2);
6516     QCOMPARE(persistentStateChangedSpy.count(), 2);
6517     QCOMPARE(dataChangedSpy.count(), 2);
6518     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6519     QCOMPARE(newEntryInListSpy.count(), 2);
6520 
6521     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
6522     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6523                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6524 
6525     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6526     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6527     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6528     QCOMPARE(rowsRemovedSpy.count(), 0);
6529     QCOMPARE(rowsMovedSpy.count(), 0);
6530     QCOMPARE(rowsInsertedSpy.count(), 3);
6531     QCOMPARE(persistentStateChangedSpy.count(), 3);
6532     QCOMPARE(dataChangedSpy.count(), 2);
6533     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6534     QCOMPARE(newEntryInListSpy.count(), 3);
6535 
6536     QCOMPARE(dataChangedSpy.wait(), true);
6537 
6538     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6539     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6540     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6541     QCOMPARE(rowsRemovedSpy.count(), 0);
6542     QCOMPARE(rowsMovedSpy.count(), 0);
6543     QCOMPARE(rowsInsertedSpy.count(), 3);
6544     QCOMPARE(persistentStateChangedSpy.count(), 3);
6545     QCOMPARE(dataChangedSpy.count(), 3);
6546     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6547     QCOMPARE(newEntryInListSpy.count(), 3);
6548 
6549     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6550     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6551                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6552 
6553     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6554     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6555     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6556     QCOMPARE(rowsRemovedSpy.count(), 0);
6557     QCOMPARE(rowsMovedSpy.count(), 0);
6558     QCOMPARE(rowsInsertedSpy.count(), 4);
6559     QCOMPARE(persistentStateChangedSpy.count(), 4);
6560     QCOMPARE(dataChangedSpy.count(), 3);
6561     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6562     QCOMPARE(newEntryInListSpy.count(), 4);
6563 
6564     QCOMPARE(dataChangedSpy.wait(), true);
6565 
6566     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6567     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6568     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6569     QCOMPARE(rowsRemovedSpy.count(), 0);
6570     QCOMPARE(rowsMovedSpy.count(), 0);
6571     QCOMPARE(rowsInsertedSpy.count(), 4);
6572     QCOMPARE(persistentStateChangedSpy.count(), 4);
6573     QCOMPARE(dataChangedSpy.count(), 4);
6574     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6575     QCOMPARE(newEntryInListSpy.count(), 4);
6576 
6577     myPlayListProxyModel.moveRow(3, 0);
6578 
6579     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6580     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6581     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6582     QCOMPARE(rowsRemovedSpy.count(), 0);
6583     QCOMPARE(rowsMovedSpy.count(), 1);
6584     QCOMPARE(rowsInsertedSpy.count(), 4);
6585     QCOMPARE(persistentStateChangedSpy.count(), 5);
6586     QCOMPARE(dataChangedSpy.count(), 4);
6587     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6588     QCOMPARE(newEntryInListSpy.count(), 4);
6589 }
6590 
6591 void MediaPlayListProxyModelTest::testHasHeaderYetAnotherMoveLikeQml()
6592 {
6593     MediaPlayList myPlayList;
6594     QAbstractItemModelTester testModel(&myPlayList);
6595     MediaPlayListProxyModel myPlayListProxyModel;
6596     myPlayListProxyModel.setPlayListModel(&myPlayList);
6597     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6598     DatabaseInterface myDatabaseContent;
6599     TracksListener myListener(&myDatabaseContent);
6600 
6601     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6602     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6603     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6604     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6605     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6606     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6607     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6608     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6609     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6610     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6611     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6612 
6613     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6614     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6615     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6616     QCOMPARE(rowsRemovedSpy.count(), 0);
6617     QCOMPARE(rowsMovedSpy.count(), 0);
6618     QCOMPARE(rowsInsertedSpy.count(), 0);
6619     QCOMPARE(persistentStateChangedSpy.count(), 0);
6620     QCOMPARE(dataChangedSpy.count(), 0);
6621     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6622     QCOMPARE(newEntryInListSpy.count(), 0);
6623 
6624     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6625 
6626     connect(&myListener, &TracksListener::trackHasChanged,
6627             &myPlayList, &MediaPlayList::trackChanged,
6628             Qt::QueuedConnection);
6629     connect(&myListener, &TracksListener::tracksListAdded,
6630             &myPlayList, &MediaPlayList::tracksListAdded,
6631             Qt::QueuedConnection);
6632     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6633             &myListener, &TracksListener::trackByNameInList,
6634             Qt::QueuedConnection);
6635     connect(&myPlayList, &MediaPlayList::newEntryInList,
6636             &myListener, &TracksListener::newEntryInList,
6637             Qt::QueuedConnection);
6638     connect(&myPlayList, &MediaPlayList::newUrlInList,
6639             &myListener, &TracksListener::newUrlInList,
6640             Qt::QueuedConnection);
6641     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6642             &myListener, &TracksListener::tracksAdded);
6643 
6644     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6645 
6646     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6647     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6648     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6649     QCOMPARE(rowsRemovedSpy.count(), 0);
6650     QCOMPARE(rowsMovedSpy.count(), 0);
6651     QCOMPARE(rowsInsertedSpy.count(), 0);
6652     QCOMPARE(persistentStateChangedSpy.count(), 0);
6653     QCOMPARE(dataChangedSpy.count(), 0);
6654     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6655     QCOMPARE(newEntryInListSpy.count(), 0);
6656 
6657     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6658     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6659                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6660 
6661     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6662     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6663     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6664     QCOMPARE(rowsRemovedSpy.count(), 0);
6665     QCOMPARE(rowsMovedSpy.count(), 0);
6666     QCOMPARE(rowsInsertedSpy.count(), 1);
6667     QCOMPARE(persistentStateChangedSpy.count(), 1);
6668     QCOMPARE(dataChangedSpy.count(), 0);
6669     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6670     QCOMPARE(newEntryInListSpy.count(), 1);
6671 
6672     QCOMPARE(dataChangedSpy.wait(), true);
6673 
6674     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6675     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6676     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6677     QCOMPARE(rowsRemovedSpy.count(), 0);
6678     QCOMPARE(rowsMovedSpy.count(), 0);
6679     QCOMPARE(rowsInsertedSpy.count(), 1);
6680     QCOMPARE(persistentStateChangedSpy.count(), 1);
6681     QCOMPARE(dataChangedSpy.count(), 1);
6682     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6683     QCOMPARE(newEntryInListSpy.count(), 1);
6684 
6685     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6686     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6687                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6688 
6689     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6690     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6691     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6692     QCOMPARE(rowsRemovedSpy.count(), 0);
6693     QCOMPARE(rowsMovedSpy.count(), 0);
6694     QCOMPARE(rowsInsertedSpy.count(), 2);
6695     QCOMPARE(persistentStateChangedSpy.count(), 2);
6696     QCOMPARE(dataChangedSpy.count(), 1);
6697     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6698     QCOMPARE(newEntryInListSpy.count(), 2);
6699 
6700     QCOMPARE(dataChangedSpy.wait(), true);
6701 
6702     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6703     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6704     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6705     QCOMPARE(rowsRemovedSpy.count(), 0);
6706     QCOMPARE(rowsMovedSpy.count(), 0);
6707     QCOMPARE(rowsInsertedSpy.count(), 2);
6708     QCOMPARE(persistentStateChangedSpy.count(), 2);
6709     QCOMPARE(dataChangedSpy.count(), 2);
6710     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6711     QCOMPARE(newEntryInListSpy.count(), 2);
6712 
6713     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
6714     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6715                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6716 
6717     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6718     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6719     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6720     QCOMPARE(rowsRemovedSpy.count(), 0);
6721     QCOMPARE(rowsMovedSpy.count(), 0);
6722     QCOMPARE(rowsInsertedSpy.count(), 3);
6723     QCOMPARE(persistentStateChangedSpy.count(), 3);
6724     QCOMPARE(dataChangedSpy.count(), 2);
6725     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6726     QCOMPARE(newEntryInListSpy.count(), 3);
6727 
6728     QCOMPARE(dataChangedSpy.wait(), true);
6729 
6730     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6731     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6732     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6733     QCOMPARE(rowsRemovedSpy.count(), 0);
6734     QCOMPARE(rowsMovedSpy.count(), 0);
6735     QCOMPARE(rowsInsertedSpy.count(), 3);
6736     QCOMPARE(persistentStateChangedSpy.count(), 3);
6737     QCOMPARE(dataChangedSpy.count(), 3);
6738     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6739     QCOMPARE(newEntryInListSpy.count(), 3);
6740 
6741     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6742     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6743                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6744 
6745     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6746     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6747     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6748     QCOMPARE(rowsRemovedSpy.count(), 0);
6749     QCOMPARE(rowsMovedSpy.count(), 0);
6750     QCOMPARE(rowsInsertedSpy.count(), 4);
6751     QCOMPARE(persistentStateChangedSpy.count(), 4);
6752     QCOMPARE(dataChangedSpy.count(), 3);
6753     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6754     QCOMPARE(newEntryInListSpy.count(), 4);
6755 
6756     QCOMPARE(dataChangedSpy.wait(), true);
6757 
6758     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6759     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6760     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6761     QCOMPARE(rowsRemovedSpy.count(), 0);
6762     QCOMPARE(rowsMovedSpy.count(), 0);
6763     QCOMPARE(rowsInsertedSpy.count(), 4);
6764     QCOMPARE(persistentStateChangedSpy.count(), 4);
6765     QCOMPARE(dataChangedSpy.count(), 4);
6766     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6767     QCOMPARE(newEntryInListSpy.count(), 4);
6768 
6769     myPlayListProxyModel.moveRow(0, 2);
6770 
6771     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6772     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6773     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6774     QCOMPARE(rowsRemovedSpy.count(), 0);
6775     QCOMPARE(rowsMovedSpy.count(), 1);
6776     QCOMPARE(rowsInsertedSpy.count(), 4);
6777     QCOMPARE(persistentStateChangedSpy.count(), 5);
6778     QCOMPARE(dataChangedSpy.count(), 4);
6779     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6780     QCOMPARE(newEntryInListSpy.count(), 4);
6781 
6782     myPlayListProxyModel.moveRow(2, 0);
6783 
6784     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6785     QCOMPARE(rowsAboutToBeMovedSpy.count(), 2);
6786     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6787     QCOMPARE(rowsRemovedSpy.count(), 0);
6788     QCOMPARE(rowsMovedSpy.count(), 2);
6789     QCOMPARE(rowsInsertedSpy.count(), 4);
6790     QCOMPARE(persistentStateChangedSpy.count(), 6);
6791     QCOMPARE(dataChangedSpy.count(), 4);
6792     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6793     QCOMPARE(newEntryInListSpy.count(), 4);
6794 }
6795 
6796 void MediaPlayListProxyModelTest::enqueueFiles()
6797 {
6798     MediaPlayList myPlayList;
6799     QAbstractItemModelTester testModel(&myPlayList);
6800     MediaPlayListProxyModel myPlayListProxyModel;
6801     myPlayListProxyModel.setPlayListModel(&myPlayList);
6802     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6803     DatabaseInterface myDatabaseContent;
6804     TracksListener myListener(&myDatabaseContent);
6805 
6806     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6807     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6808     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6809     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6810     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6811     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6812     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6813     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
6814     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6815     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6816     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6817 
6818     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6819     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6820     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6821     QCOMPARE(rowsRemovedSpy.count(), 0);
6822     QCOMPARE(rowsMovedSpy.count(), 0);
6823     QCOMPARE(rowsInsertedSpy.count(), 0);
6824     QCOMPARE(persistentStateChangedSpy.count(), 0);
6825     QCOMPARE(dataChangedSpy.count(), 0);
6826     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6827     QCOMPARE(newEntryInListSpy.count(), 0);
6828     QCOMPARE(newUrlInListSpy.count(), 0);
6829 
6830     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6831 
6832     connect(&myListener, &TracksListener::trackHasChanged,
6833             &myPlayList, &MediaPlayList::trackChanged,
6834             Qt::QueuedConnection);
6835     connect(&myListener, &TracksListener::tracksListAdded,
6836             &myPlayList, &MediaPlayList::tracksListAdded,
6837             Qt::QueuedConnection);
6838     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6839             &myListener, &TracksListener::trackByNameInList,
6840             Qt::QueuedConnection);
6841     connect(&myPlayList, &MediaPlayList::newEntryInList,
6842             &myListener, &TracksListener::newEntryInList,
6843             Qt::QueuedConnection);
6844     connect(&myPlayList, &MediaPlayList::newUrlInList,
6845             &myListener, &TracksListener::newUrlInList,
6846             Qt::QueuedConnection);
6847     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6848             &myListener, &TracksListener::tracksAdded);
6849 
6850     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6851 
6852     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6853     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6854     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6855     QCOMPARE(rowsRemovedSpy.count(), 0);
6856     QCOMPARE(rowsMovedSpy.count(), 0);
6857     QCOMPARE(rowsInsertedSpy.count(), 0);
6858     QCOMPARE(persistentStateChangedSpy.count(), 0);
6859     QCOMPARE(dataChangedSpy.count(), 0);
6860     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6861     QCOMPARE(newEntryInListSpy.count(), 0);
6862     QCOMPARE(newUrlInListSpy.count(), 0);
6863 
6864     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6865                                     {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral("/$1"))}}, {}, {}},
6866                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6867                                     {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral("/$2"))}}, {}, {}}}, {}, {});
6868 
6869     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6870     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6871     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6872     QCOMPARE(rowsRemovedSpy.count(), 0);
6873     QCOMPARE(rowsMovedSpy.count(), 0);
6874     QCOMPARE(rowsInsertedSpy.count(), 1);
6875     QCOMPARE(persistentStateChangedSpy.count(), 1);
6876     QCOMPARE(dataChangedSpy.count(), 0);
6877     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6878     QCOMPARE(newEntryInListSpy.count(), 0);
6879     QCOMPARE(newUrlInListSpy.count(), 2);
6880 
6881     QCOMPARE(myPlayListProxyModel.rowCount(), 2);
6882 
6883     QCOMPARE(dataChangedSpy.wait(300), true);
6884 
6885     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6886     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6887     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6888     QCOMPARE(rowsRemovedSpy.count(), 0);
6889     QCOMPARE(rowsMovedSpy.count(), 0);
6890     QCOMPARE(rowsInsertedSpy.count(), 1);
6891     QCOMPARE(persistentStateChangedSpy.count(), 1);
6892     QCOMPARE(dataChangedSpy.count(), 2);
6893     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6894     QCOMPARE(newEntryInListSpy.count(), 0);
6895     QCOMPARE(newUrlInListSpy.count(), 2);
6896 
6897     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
6898     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
6899     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
6900     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
6901     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
6902     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
6903     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
6904     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
6905     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
6906     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
6907     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
6908     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
6909 }
6910 
6911 void MediaPlayListProxyModelTest::enqueueSampleFiles()
6912 {
6913     MediaPlayList myPlayList;
6914     QAbstractItemModelTester testModel(&myPlayList);
6915     MediaPlayListProxyModel myPlayListProxyModel;
6916     myPlayListProxyModel.setPlayListModel(&myPlayList);
6917     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6918     DatabaseInterface myDatabaseContent;
6919     TracksListener myListener(&myDatabaseContent);
6920 
6921     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6922     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6923     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6924     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6925     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6926     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6927     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6928     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
6929     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6930     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6931     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6932 
6933     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6934     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6935     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6936     QCOMPARE(rowsRemovedSpy.count(), 0);
6937     QCOMPARE(rowsMovedSpy.count(), 0);
6938     QCOMPARE(rowsInsertedSpy.count(), 0);
6939     QCOMPARE(persistentStateChangedSpy.count(), 0);
6940     QCOMPARE(dataChangedSpy.count(), 0);
6941     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6942     QCOMPARE(newEntryInListSpy.count(), 0);
6943     QCOMPARE(newUrlInListSpy.count(), 0);
6944 
6945     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6946 
6947     connect(&myListener, &TracksListener::trackHasChanged,
6948             &myPlayList, &MediaPlayList::trackChanged,
6949             Qt::QueuedConnection);
6950     connect(&myListener, &TracksListener::tracksListAdded,
6951             &myPlayList, &MediaPlayList::tracksListAdded,
6952             Qt::QueuedConnection);
6953     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6954             &myListener, &TracksListener::trackByNameInList,
6955             Qt::QueuedConnection);
6956     connect(&myPlayList, &MediaPlayList::newEntryInList,
6957             &myListener, &TracksListener::newEntryInList,
6958             Qt::QueuedConnection);
6959     connect(&myPlayList, &MediaPlayList::newUrlInList,
6960             &myListener, &TracksListener::newUrlInList,
6961             Qt::QueuedConnection);
6962     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6963             &myListener, &TracksListener::tracksAdded);
6964 
6965     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6966 
6967     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6968     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6969     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6970     QCOMPARE(rowsRemovedSpy.count(), 0);
6971     QCOMPARE(rowsMovedSpy.count(), 0);
6972     QCOMPARE(rowsInsertedSpy.count(), 0);
6973     QCOMPARE(persistentStateChangedSpy.count(), 0);
6974     QCOMPARE(dataChangedSpy.count(), 0);
6975     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6976     QCOMPARE(newEntryInListSpy.count(), 0);
6977     QCOMPARE(newUrlInListSpy.count(), 0);
6978 
6979     myPlayListProxyModel.enqueue({
6980                                      {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6981                                        {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}}, {}, {}},
6982                                      {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6983                                        {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}, {}, {}}},
6984                                  {}, {});
6985 
6986     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6987     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6988     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6989     QCOMPARE(rowsRemovedSpy.count(), 0);
6990     QCOMPARE(rowsMovedSpy.count(), 0);
6991     QCOMPARE(rowsInsertedSpy.count(), 1);
6992     QCOMPARE(persistentStateChangedSpy.count(), 1);
6993     QCOMPARE(dataChangedSpy.count(), 0);
6994     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6995     QCOMPARE(newEntryInListSpy.count(), 0);
6996     QCOMPARE(newUrlInListSpy.count(), 2);
6997 
6998     QCOMPARE(myPlayListProxyModel.rowCount(), 2);
6999 
7000     while (dataChangedSpy.count() < 2) {
7001         QCOMPARE(dataChangedSpy.wait(), true);
7002     }
7003 
7004     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7005     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7006     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
7007     QCOMPARE(rowsRemovedSpy.count(), 0);
7008     QCOMPARE(rowsMovedSpy.count(), 0);
7009     QCOMPARE(rowsInsertedSpy.count(), 1);
7010     QCOMPARE(persistentStateChangedSpy.count(), 1);
7011     QCOMPARE(dataChangedSpy.count(), 2);
7012     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7013     QCOMPARE(newEntryInListSpy.count(), 0);
7014     QCOMPARE(newUrlInListSpy.count(), 2);
7015 
7016 #if KFFileMetaData_FOUND
7017     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
7018     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
7019     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
7020     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
7021     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
7022     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
7023     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2"));
7024     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2"));
7025     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2"));
7026     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
7027     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
7028     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
7029 #else
7030     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg"));
7031     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
7032     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
7033     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
7034     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
7035     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
7036     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg"));
7037     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
7038     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
7039     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
7040     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
7041     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
7042 #endif
7043 }
7044 
7045 void MediaPlayListProxyModelTest::enqueueEmpty()
7046 {
7047     MediaPlayList myPlayList;
7048     QAbstractItemModelTester testModel(&myPlayList);
7049     MediaPlayListProxyModel myPlayListProxyModel;
7050     myPlayListProxyModel.setPlayListModel(&myPlayList);
7051     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
7052     DatabaseInterface myDatabaseContent;
7053     TracksListener myListener(&myDatabaseContent);
7054 
7055     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
7056     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
7057     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
7058     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
7059     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
7060     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
7061     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
7062     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
7063     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
7064     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
7065     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
7066 
7067     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7068     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7069     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7070     QCOMPARE(rowsRemovedSpy.count(), 0);
7071     QCOMPARE(rowsMovedSpy.count(), 0);
7072     QCOMPARE(rowsInsertedSpy.count(), 0);
7073     QCOMPARE(persistentStateChangedSpy.count(), 0);
7074     QCOMPARE(dataChangedSpy.count(), 0);
7075     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7076     QCOMPARE(newEntryInListSpy.count(), 0);
7077 
7078     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
7079 
7080     connect(&myListener, &TracksListener::trackHasChanged,
7081             &myPlayList, &MediaPlayList::trackChanged,
7082             Qt::QueuedConnection);
7083     connect(&myListener, &TracksListener::tracksListAdded,
7084             &myPlayList, &MediaPlayList::tracksListAdded,
7085             Qt::QueuedConnection);
7086     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
7087             &myListener, &TracksListener::trackByNameInList,
7088             Qt::QueuedConnection);
7089     connect(&myPlayList, &MediaPlayList::newEntryInList,
7090             &myListener, &TracksListener::newEntryInList,
7091             Qt::QueuedConnection);
7092     connect(&myPlayList, &MediaPlayList::newUrlInList,
7093             &myListener, &TracksListener::newUrlInList,
7094             Qt::QueuedConnection);
7095     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
7096             &myListener, &TracksListener::tracksAdded);
7097 
7098     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
7099 
7100     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7101     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7102     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7103     QCOMPARE(rowsRemovedSpy.count(), 0);
7104     QCOMPARE(rowsMovedSpy.count(), 0);
7105     QCOMPARE(rowsInsertedSpy.count(), 0);
7106     QCOMPARE(persistentStateChangedSpy.count(), 0);
7107     QCOMPARE(dataChangedSpy.count(), 0);
7108     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7109     QCOMPARE(newEntryInListSpy.count(), 0);
7110 
7111     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {});
7112 
7113     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7114     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7115     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7116     QCOMPARE(rowsRemovedSpy.count(), 0);
7117     QCOMPARE(rowsMovedSpy.count(), 0);
7118     QCOMPARE(rowsInsertedSpy.count(), 0);
7119     QCOMPARE(persistentStateChangedSpy.count(), 0);
7120     QCOMPARE(dataChangedSpy.count(), 0);
7121     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7122     QCOMPARE(newEntryInListSpy.count(), 0);
7123 
7124     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {});
7125 
7126     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7127     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7128     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7129     QCOMPARE(rowsRemovedSpy.count(), 0);
7130     QCOMPARE(rowsMovedSpy.count(), 0);
7131     QCOMPARE(rowsInsertedSpy.count(), 0);
7132     QCOMPARE(persistentStateChangedSpy.count(), 0);
7133     QCOMPARE(dataChangedSpy.count(), 0);
7134     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7135     QCOMPARE(newEntryInListSpy.count(), 0);
7136 
7137     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay);
7138 
7139     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7140     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7141     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7142     QCOMPARE(rowsRemovedSpy.count(), 0);
7143     QCOMPARE(rowsMovedSpy.count(), 0);
7144     QCOMPARE(rowsInsertedSpy.count(), 0);
7145     QCOMPARE(persistentStateChangedSpy.count(), 0);
7146     QCOMPARE(dataChangedSpy.count(), 0);
7147     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7148     QCOMPARE(newEntryInListSpy.count(), 0);
7149 
7150     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay);
7151 
7152     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7153     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7154     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7155     QCOMPARE(rowsRemovedSpy.count(), 0);
7156     QCOMPARE(rowsMovedSpy.count(), 0);
7157     QCOMPARE(rowsInsertedSpy.count(), 0);
7158     QCOMPARE(persistentStateChangedSpy.count(), 0);
7159     QCOMPARE(dataChangedSpy.count(), 0);
7160     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7161     QCOMPARE(newEntryInListSpy.count(), 0);
7162 
7163     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{},
7164                                  ElisaUtils::AppendPlayList,
7165                                  ElisaUtils::DoNotTriggerPlay);
7166 
7167     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7168     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7169     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7170     QCOMPARE(rowsRemovedSpy.count(), 0);
7171     QCOMPARE(rowsMovedSpy.count(), 0);
7172     QCOMPARE(rowsInsertedSpy.count(), 0);
7173     QCOMPARE(persistentStateChangedSpy.count(), 0);
7174     QCOMPARE(dataChangedSpy.count(), 0);
7175     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7176     QCOMPARE(newEntryInListSpy.count(), 0);
7177 }
7178 
7179 void MediaPlayListProxyModelTest::testMoveAndShuffle()
7180 {
7181     MediaPlayList myPlayList;
7182     QAbstractItemModelTester testModel(&myPlayList);
7183     MediaPlayListProxyModel myPlayListProxyModel;
7184     myPlayListProxyModel.setPlayListModel(&myPlayList);
7185     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
7186     DatabaseInterface myDatabaseContent;
7187     TracksListener myListener(&myDatabaseContent);
7188 
7189     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
7190     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
7191     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
7192     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
7193     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
7194     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
7195     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
7196     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
7197     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
7198     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
7199     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
7200 
7201     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7202     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7203     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7204     QCOMPARE(rowsRemovedSpy.count(), 0);
7205     QCOMPARE(rowsMovedSpy.count(), 0);
7206     QCOMPARE(rowsInsertedSpy.count(), 0);
7207     QCOMPARE(persistentStateChangedSpy.count(), 0);
7208     QCOMPARE(dataChangedSpy.count(), 0);
7209     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7210     QCOMPARE(newEntryInListSpy.count(), 0);
7211 
7212     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
7213 
7214     connect(&myListener, &TracksListener::trackHasChanged,
7215             &myPlayList, &MediaPlayList::trackChanged,
7216             Qt::QueuedConnection);
7217     connect(&myListener, &TracksListener::tracksListAdded,
7218             &myPlayList, &MediaPlayList::tracksListAdded,
7219             Qt::QueuedConnection);
7220     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
7221             &myListener, &TracksListener::trackByNameInList,
7222             Qt::QueuedConnection);
7223     connect(&myPlayList, &MediaPlayList::newEntryInList,
7224             &myListener, &TracksListener::newEntryInList,
7225             Qt::QueuedConnection);
7226     connect(&myPlayList, &MediaPlayList::newUrlInList,
7227             &myListener, &TracksListener::newUrlInList,
7228             Qt::QueuedConnection);
7229     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
7230             &myListener, &TracksListener::tracksAdded);
7231 
7232     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
7233 
7234     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7235     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7236     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7237     QCOMPARE(rowsRemovedSpy.count(), 0);
7238     QCOMPARE(rowsMovedSpy.count(), 0);
7239     QCOMPARE(rowsInsertedSpy.count(), 0);
7240     QCOMPARE(persistentStateChangedSpy.count(), 0);
7241     QCOMPARE(dataChangedSpy.count(), 0);
7242     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7243     QCOMPARE(newEntryInListSpy.count(), 0);
7244 
7245     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
7246     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7247                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
7248 
7249     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7250     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7251     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
7252     QCOMPARE(rowsRemovedSpy.count(), 0);
7253     QCOMPARE(rowsMovedSpy.count(), 0);
7254     QCOMPARE(rowsInsertedSpy.count(), 1);
7255     QCOMPARE(persistentStateChangedSpy.count(), 1);
7256     QCOMPARE(dataChangedSpy.count(), 0);
7257     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7258     QCOMPARE(newEntryInListSpy.count(), 1);
7259 
7260     QCOMPARE(dataChangedSpy.wait(), true);
7261 
7262     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7263     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7264     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
7265     QCOMPARE(rowsRemovedSpy.count(), 0);
7266     QCOMPARE(rowsMovedSpy.count(), 0);
7267     QCOMPARE(rowsInsertedSpy.count(), 1);
7268     QCOMPARE(persistentStateChangedSpy.count(), 1);
7269     QCOMPARE(dataChangedSpy.count(), 1);
7270     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7271     QCOMPARE(newEntryInListSpy.count(), 1);
7272 
7273     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
7274     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7275                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
7276 
7277     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7278     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7279     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
7280     QCOMPARE(rowsRemovedSpy.count(), 0);
7281     QCOMPARE(rowsMovedSpy.count(), 0);
7282     QCOMPARE(rowsInsertedSpy.count(), 2);
7283     QCOMPARE(persistentStateChangedSpy.count(), 2);
7284     QCOMPARE(dataChangedSpy.count(), 1);
7285     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7286     QCOMPARE(newEntryInListSpy.count(), 2);
7287 
7288     QCOMPARE(dataChangedSpy.wait(), true);
7289 
7290     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7291     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7292     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
7293     QCOMPARE(rowsRemovedSpy.count(), 0);
7294     QCOMPARE(rowsMovedSpy.count(), 0);
7295     QCOMPARE(rowsInsertedSpy.count(), 2);
7296     QCOMPARE(persistentStateChangedSpy.count(), 2);
7297     QCOMPARE(dataChangedSpy.count(), 2);
7298     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7299     QCOMPARE(newEntryInListSpy.count(), 2);
7300 
7301     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
7302     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7303                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
7304 
7305     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7306     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7307     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7308     QCOMPARE(rowsRemovedSpy.count(), 0);
7309     QCOMPARE(rowsMovedSpy.count(), 0);
7310     QCOMPARE(rowsInsertedSpy.count(), 3);
7311     QCOMPARE(persistentStateChangedSpy.count(), 3);
7312     QCOMPARE(dataChangedSpy.count(), 2);
7313     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7314     QCOMPARE(newEntryInListSpy.count(), 3);
7315 
7316     QCOMPARE(dataChangedSpy.wait(), true);
7317 
7318     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7319     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7320     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7321     QCOMPARE(rowsRemovedSpy.count(), 0);
7322     QCOMPARE(rowsMovedSpy.count(), 0);
7323     QCOMPARE(rowsInsertedSpy.count(), 3);
7324     QCOMPARE(persistentStateChangedSpy.count(), 3);
7325     QCOMPARE(dataChangedSpy.count(), 3);
7326     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7327     QCOMPARE(newEntryInListSpy.count(), 3);
7328 
7329     myPlayListProxyModel.setShufflePlayList(true);
7330 
7331     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7332     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7333     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7334     QCOMPARE(rowsRemovedSpy.count(), 0);
7335     QCOMPARE(rowsMovedSpy.count(), 0);
7336     QCOMPARE(rowsInsertedSpy.count(), 3);
7337     QCOMPARE(persistentStateChangedSpy.count(), 4);
7338     QCOMPARE(dataChangedSpy.count(), 3);
7339     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7340     QCOMPARE(newEntryInListSpy.count(), 3);
7341 
7342     myPlayListProxyModel.moveRow(2, 0);
7343 
7344     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7345     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
7346     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7347     QCOMPARE(rowsRemovedSpy.count(), 0);
7348     QCOMPARE(rowsMovedSpy.count(), 1);
7349     QCOMPARE(rowsInsertedSpy.count(), 3);
7350     QCOMPARE(persistentStateChangedSpy.count(), 4);
7351     QCOMPARE(dataChangedSpy.count(), 3);
7352     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7353     QCOMPARE(newEntryInListSpy.count(), 3);
7354 }
7355 
7356 void MediaPlayListProxyModelTest::testMoveCurrentTrack()
7357 {
7358     MediaPlayList myPlayList;
7359     QAbstractItemModelTester testModel(&myPlayList);
7360     MediaPlayListProxyModel myPlayListProxyModel;
7361     myPlayListProxyModel.setPlayListModel(&myPlayList);
7362     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
7363     DatabaseInterface myDatabaseContent;
7364     TracksListener myListener(&myDatabaseContent);
7365 
7366     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
7367     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
7368 
7369     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
7370 
7371     connect(&myListener, &TracksListener::trackHasChanged,
7372             &myPlayList, &MediaPlayList::trackChanged,
7373             Qt::QueuedConnection);
7374     connect(&myListener, &TracksListener::tracksListAdded,
7375             &myPlayList, &MediaPlayList::tracksListAdded,
7376             Qt::QueuedConnection);
7377     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
7378             &myListener, &TracksListener::trackByNameInList,
7379             Qt::QueuedConnection);
7380     connect(&myPlayList, &MediaPlayList::newEntryInList,
7381             &myListener, &TracksListener::newEntryInList,
7382             Qt::QueuedConnection);
7383     connect(&myPlayList, &MediaPlayList::newUrlInList,
7384             &myListener, &TracksListener::newUrlInList,
7385             Qt::QueuedConnection);
7386     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
7387             &myListener, &TracksListener::tracksAdded);
7388 
7389     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
7390 
7391     const auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
7392     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7393                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
7394 
7395     const auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
7396     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7397                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
7398 
7399     const auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
7400     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7401                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
7402 
7403     const auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
7404     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7405                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
7406 
7407     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7408     QCOMPARE(rowsMovedSpy.count(), 0);
7409 
7410     // Set current track index
7411     myPlayListProxyModel.switchTo(1);
7412 
7413     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7414     QCOMPARE(rowsMovedSpy.count(), 0);
7415     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 0);
7416     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 1);
7417     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 2);
7418 
7419     // Move current track
7420     myPlayListProxyModel.moveRow(1, 2);
7421 
7422     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
7423     QCOMPARE(rowsMovedSpy.count(), 1);
7424     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 1);
7425     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 2);
7426     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 3);
7427 
7428     // Move previous track to after current track
7429     myPlayListProxyModel.moveRow(1, 3);
7430 
7431     QCOMPARE(rowsAboutToBeMovedSpy.count(), 2);
7432     QCOMPARE(rowsMovedSpy.count(), 2);
7433     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 0);
7434     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 1);
7435     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 2);
7436 
7437     // Move next track to before current track
7438     myPlayListProxyModel.moveRow(2, 0);
7439 
7440     QCOMPARE(rowsAboutToBeMovedSpy.count(), 3);
7441     QCOMPARE(rowsMovedSpy.count(), 3);
7442     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 1);
7443     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 2);
7444     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 3);
7445 
7446     // Move into position of current track (from below)
7447     myPlayListProxyModel.moveRow(0, 2);
7448 
7449     QCOMPARE(rowsAboutToBeMovedSpy.count(), 4);
7450     QCOMPARE(rowsMovedSpy.count(), 4);
7451     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 0);
7452     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 1);
7453     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 2);
7454 
7455     // Move into position of current track (from above)
7456     myPlayListProxyModel.moveRow(3, 1);
7457 
7458     QCOMPARE(rowsAboutToBeMovedSpy.count(), 5);
7459     QCOMPARE(rowsMovedSpy.count(), 5);
7460     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 1);
7461     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 2);
7462     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 3);
7463 
7464     // Move current track to start
7465     myPlayListProxyModel.moveRow(2, 0);
7466 
7467     QCOMPARE(rowsAboutToBeMovedSpy.count(), 6);
7468     QCOMPARE(rowsMovedSpy.count(), 6);
7469     QCOMPARE(myPlayListProxyModel.previousTrack().isValid(), false);
7470     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 0);
7471     QCOMPARE(myPlayListProxyModel.nextTrack().row(), 1);
7472 
7473     // Move current track to end
7474     myPlayListProxyModel.moveRow(0, 3);
7475 
7476     QCOMPARE(rowsAboutToBeMovedSpy.count(), 7);
7477     QCOMPARE(rowsMovedSpy.count(), 7);
7478     QCOMPARE(myPlayListProxyModel.previousTrack().row(), 2);
7479     QCOMPARE(myPlayListProxyModel.currentTrack().row(), 3);
7480     QCOMPARE(myPlayListProxyModel.nextTrack().isValid(), false);
7481 }
7482 
7483 QTEST_GUILESS_MAIN(MediaPlayListProxyModelTest)
7484 
7485 
7486 #include "moc_mediaplaylistproxymodeltest.cpp"