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

0001 /*
0002    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #include "mediaplaylisttest.h"
0008 #include "mediaplaylisttestconfig.h"
0009 
0010 #include "mediaplaylist.h"
0011 #include "databaseinterface.h"
0012 #include "trackslistener.h"
0013 
0014 #include "config-upnp-qt.h"
0015 
0016 #include <QSignalSpy>
0017 #include <QTest>
0018 #include <QUrl>
0019 #include <QTime>
0020 #include <QTemporaryFile>
0021 #include <QAbstractItemModelTester>
0022 
0023 MediaPlayListTest::MediaPlayListTest(QObject *parent) : QObject(parent)
0024 {
0025 }
0026 
0027 void MediaPlayListTest::initTestCase()
0028 {
0029     qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
0030     qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
0031     qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
0032     qRegisterMetaType<ElisaUtils::PlayListEntryType>("PlayListEntryType");
0033 }
0034 
0035 void MediaPlayListTest::simpleInitialCase()
0036 {
0037     MediaPlayList myPlayList;
0038     QAbstractItemModelTester testModel(&myPlayList);
0039     DatabaseInterface myDatabaseContent;
0040     TracksListener myListener(&myDatabaseContent);
0041 
0042     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0043     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0044     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0045     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0046     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0047     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0048     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0049     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0050     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0051     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0052 
0053     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0054     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0055     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0056     QCOMPARE(rowsRemovedSpy.count(), 0);
0057     QCOMPARE(rowsMovedSpy.count(), 0);
0058     QCOMPARE(rowsInsertedSpy.count(), 0);
0059     QCOMPARE(dataChangedSpy.count(), 0);
0060     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0061     QCOMPARE(newEntryInListSpy.count(), 0);
0062 
0063     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0064 
0065     connect(&myListener, &TracksListener::trackHasChanged,
0066             &myPlayList, &MediaPlayList::trackChanged,
0067             Qt::QueuedConnection);
0068     connect(&myListener, &TracksListener::tracksListAdded,
0069             &myPlayList, &MediaPlayList::tracksListAdded,
0070             Qt::QueuedConnection);
0071     connect(&myPlayList, &MediaPlayList::newEntryInList,
0072             &myListener, &TracksListener::newEntryInList,
0073             Qt::QueuedConnection);
0074     connect(&myPlayList, &MediaPlayList::newUrlInList,
0075             &myListener, &TracksListener::newUrlInList,
0076             Qt::QueuedConnection);
0077     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0078             &myListener, &TracksListener::trackByNameInList,
0079             Qt::QueuedConnection);
0080     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0081             &myListener, &TracksListener::tracksAdded);
0082 
0083     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0084 
0085     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0086     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0087     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0088     QCOMPARE(rowsRemovedSpy.count(), 0);
0089     QCOMPARE(rowsMovedSpy.count(), 0);
0090     QCOMPARE(rowsInsertedSpy.count(), 0);
0091     QCOMPARE(dataChangedSpy.count(), 0);
0092     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0093     QCOMPARE(newEntryInListSpy.count(), 0);
0094 
0095     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0096     auto newTrackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
0097     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
0098 
0099     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0100     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0101     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0102     QCOMPARE(rowsRemovedSpy.count(), 0);
0103     QCOMPARE(rowsMovedSpy.count(), 0);
0104     QCOMPARE(rowsInsertedSpy.count(), 1);
0105     QCOMPARE(dataChangedSpy.count(), 0);
0106     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0107     QCOMPARE(newEntryInListSpy.count(), 1);
0108 
0109     QCOMPARE(dataChangedSpy.wait(), true);
0110 
0111     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0112     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0113     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0114     QCOMPARE(rowsRemovedSpy.count(), 0);
0115     QCOMPARE(rowsMovedSpy.count(), 0);
0116     QCOMPARE(rowsInsertedSpy.count(), 1);
0117     QCOMPARE(dataChangedSpy.count(), 1);
0118     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0119     QCOMPARE(newEntryInListSpy.count(), 1);
0120 }
0121 
0122 void MediaPlayListTest::enqueueAlbumCase()
0123 {
0124     MediaPlayList myPlayList;
0125     QAbstractItemModelTester testModel(&myPlayList);
0126     DatabaseInterface myDatabaseContent;
0127     TracksListener myListener(&myDatabaseContent);
0128 
0129     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0130     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0131     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0132     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0133     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0134     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0135     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0136     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0137     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0138     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0139 
0140     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0141     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0142     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0143     QCOMPARE(rowsRemovedSpy.count(), 0);
0144     QCOMPARE(rowsMovedSpy.count(), 0);
0145     QCOMPARE(rowsInsertedSpy.count(), 0);
0146     QCOMPARE(dataChangedSpy.count(), 0);
0147     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0148     QCOMPARE(newEntryInListSpy.count(), 0);
0149 
0150     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0151 
0152     connect(&myListener, &TracksListener::trackHasChanged,
0153             &myPlayList, &MediaPlayList::trackChanged,
0154             Qt::QueuedConnection);
0155     connect(&myListener, &TracksListener::tracksListAdded,
0156             &myPlayList, &MediaPlayList::tracksListAdded,
0157             Qt::QueuedConnection);
0158     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0159             &myListener, &TracksListener::trackByNameInList,
0160             Qt::QueuedConnection);
0161     connect(&myPlayList, &MediaPlayList::newEntryInList,
0162             &myListener, &TracksListener::newEntryInList,
0163             Qt::QueuedConnection);
0164     connect(&myPlayList, &MediaPlayList::newUrlInList,
0165             &myListener, &TracksListener::newUrlInList,
0166             Qt::QueuedConnection);
0167     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0168             &myListener, &TracksListener::tracksAdded);
0169 
0170     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0171 
0172     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0173     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0174     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0175     QCOMPARE(rowsRemovedSpy.count(), 0);
0176     QCOMPARE(rowsMovedSpy.count(), 0);
0177     QCOMPARE(rowsInsertedSpy.count(), 0);
0178     QCOMPARE(dataChangedSpy.count(), 0);
0179     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0180     QCOMPARE(newEntryInListSpy.count(), 0);
0181 
0182     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
0183                         QStringLiteral("album2"), {}});
0184 
0185     QVERIFY(rowsAboutToBeRemovedSpy.wait());
0186 
0187     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
0188     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0189     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0190     QCOMPARE(rowsRemovedSpy.count(), 1);
0191     QCOMPARE(rowsMovedSpy.count(), 0);
0192     QCOMPARE(rowsInsertedSpy.count(), 2);
0193     QCOMPARE(dataChangedSpy.count(), 0);
0194     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0195     QCOMPARE(newEntryInListSpy.count(), 1);
0196 
0197     QCOMPARE(myPlayList.rowCount(), 6);
0198 
0199     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0200     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0201     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0202     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0203     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0204     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
0205     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0206     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0207     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0208     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0209     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0210     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0211     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
0212     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0213     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0214     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0215     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0216     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0217     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0218     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
0219     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0220     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0221     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0222     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0223     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0224     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0225     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
0226     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0227     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
0228     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0229     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0230     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
0231     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0232     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
0233     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0234     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
0235     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0236     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
0237     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
0238     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0239     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
0240     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0241 }
0242 
0243 void MediaPlayListTest::enqueueArtistCase()
0244 {
0245     MediaPlayList myPlayList;
0246     QAbstractItemModelTester testModel(&myPlayList);
0247     DatabaseInterface myDatabaseContent;
0248     TracksListener myListener(&myDatabaseContent);
0249 
0250     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0251     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0252     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0253     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0254     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0255     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0256     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0257     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0258     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0259     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0260 
0261     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0262     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0263     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0264     QCOMPARE(rowsRemovedSpy.count(), 0);
0265     QCOMPARE(rowsMovedSpy.count(), 0);
0266     QCOMPARE(rowsInsertedSpy.count(), 0);
0267     QCOMPARE(dataChangedSpy.count(), 0);
0268     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0269     QCOMPARE(newEntryInListSpy.count(), 0);
0270 
0271     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0272 
0273     connect(&myListener, &TracksListener::trackHasChanged,
0274             &myPlayList, &MediaPlayList::trackChanged,
0275             Qt::QueuedConnection);
0276     connect(&myListener, &TracksListener::tracksListAdded,
0277             &myPlayList, &MediaPlayList::tracksListAdded,
0278             Qt::QueuedConnection);
0279     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0280             &myListener, &TracksListener::trackByNameInList,
0281             Qt::QueuedConnection);
0282     connect(&myPlayList, &MediaPlayList::newEntryInList,
0283             &myListener, &TracksListener::newEntryInList,
0284             Qt::QueuedConnection);
0285     connect(&myPlayList, &MediaPlayList::newUrlInList,
0286             &myListener, &TracksListener::newUrlInList,
0287             Qt::QueuedConnection);
0288     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0289             &myListener, &TracksListener::tracksAdded);
0290 
0291     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0292 
0293     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0294     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0295     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0296     QCOMPARE(rowsRemovedSpy.count(), 0);
0297     QCOMPARE(rowsMovedSpy.count(), 0);
0298     QCOMPARE(rowsInsertedSpy.count(), 0);
0299     QCOMPARE(dataChangedSpy.count(), 0);
0300     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0301     QCOMPARE(newEntryInListSpy.count(), 0);
0302 
0303     myPlayList.enqueueOneEntry({{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}});
0304 
0305     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0306     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0307     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0308     QCOMPARE(rowsRemovedSpy.count(), 0);
0309     QCOMPARE(rowsMovedSpy.count(), 0);
0310     QCOMPARE(rowsInsertedSpy.count(), 1);
0311     QCOMPARE(dataChangedSpy.count(), 0);
0312     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0313     QCOMPARE(newEntryInListSpy.count(), 1);
0314 
0315     QCOMPARE(myPlayList.rowCount(), 1);
0316 
0317     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
0318 
0319     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
0320     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0321     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0322     QCOMPARE(rowsRemovedSpy.count(), 1);
0323     QCOMPARE(rowsMovedSpy.count(), 0);
0324     QCOMPARE(rowsInsertedSpy.count(), 2);
0325     QCOMPARE(dataChangedSpy.count(), 0);
0326     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0327     QCOMPARE(newEntryInListSpy.count(), 1);
0328 
0329     QCOMPARE(myPlayList.rowCount(), 6);
0330 
0331     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0332     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0333     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0334     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0335     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0336     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
0337     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1);
0338     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0339     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0340     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0341     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0342     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0343     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
0344     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0345     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0346     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0347     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0348     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0349     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0350     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
0351     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0352     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
0353     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0354     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0355     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
0356     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0357     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
0358     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0359     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
0360     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0361     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0362     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
0363     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0364     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
0365     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0366     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
0367     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
0368     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0369     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
0370     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0371     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
0372     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
0373 }
0374 
0375 void MediaPlayListTest::enqueueTrackByUrl()
0376 {
0377     MediaPlayList myPlayList;
0378     QAbstractItemModelTester testModel(&myPlayList);
0379     DatabaseInterface myDatabaseContent;
0380     TracksListener myListener(&myDatabaseContent);
0381 
0382     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0383     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0384     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0385     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0386     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0387     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0388     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0389     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0390     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0391     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0392 
0393     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0394     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0395     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0396     QCOMPARE(rowsRemovedSpy.count(), 0);
0397     QCOMPARE(rowsMovedSpy.count(), 0);
0398     QCOMPARE(rowsInsertedSpy.count(), 0);
0399     QCOMPARE(dataChangedSpy.count(), 0);
0400     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0401     QCOMPARE(newEntryInListSpy.count(), 0);
0402     QCOMPARE(newUrlInListSpy.count(), 0);
0403 
0404     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0405 
0406     connect(&myListener, &TracksListener::trackHasChanged,
0407             &myPlayList, &MediaPlayList::trackChanged,
0408             Qt::QueuedConnection);
0409     connect(&myListener, &TracksListener::tracksListAdded,
0410             &myPlayList, &MediaPlayList::tracksListAdded,
0411             Qt::QueuedConnection);
0412     connect(&myPlayList, &MediaPlayList::newEntryInList,
0413             &myListener, &TracksListener::newEntryInList,
0414             Qt::QueuedConnection);
0415     connect(&myPlayList, &MediaPlayList::newUrlInList,
0416             &myListener, &TracksListener::newUrlInList,
0417             Qt::QueuedConnection);
0418     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0419             &myListener, &TracksListener::trackByNameInList,
0420             Qt::QueuedConnection);
0421     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0422             &myListener, &TracksListener::tracksAdded);
0423 
0424     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0425 
0426     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0427     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0428     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0429     QCOMPARE(rowsRemovedSpy.count(), 0);
0430     QCOMPARE(rowsMovedSpy.count(), 0);
0431     QCOMPARE(rowsInsertedSpy.count(), 0);
0432     QCOMPARE(dataChangedSpy.count(), 0);
0433     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0434     QCOMPARE(newEntryInListSpy.count(), 0);
0435     QCOMPARE(newUrlInListSpy.count(), 0);
0436 
0437     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0438     auto trackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
0439     myPlayList.enqueueFilesList({{{}, {}, trackData.resourceURI()}});
0440 
0441     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0442     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0443     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0444     QCOMPARE(rowsRemovedSpy.count(), 0);
0445     QCOMPARE(rowsMovedSpy.count(), 0);
0446     QCOMPARE(rowsInsertedSpy.count(), 1);
0447     QCOMPARE(dataChangedSpy.count(), 0);
0448     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0449     QCOMPARE(newEntryInListSpy.count(), 0);
0450     QCOMPARE(newUrlInListSpy.count(), 1);
0451 
0452     QCOMPARE(dataChangedSpy.wait(), true);
0453 
0454     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0455     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0456     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0457     QCOMPARE(rowsRemovedSpy.count(), 0);
0458     QCOMPARE(rowsMovedSpy.count(), 0);
0459     QCOMPARE(rowsInsertedSpy.count(), 1);
0460     QCOMPARE(dataChangedSpy.count(), 1);
0461     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0462     QCOMPARE(newEntryInListSpy.count(), 0);
0463     QCOMPARE(newUrlInListSpy.count(), 1);
0464 }
0465 
0466 void MediaPlayListTest::enqueueTracksByUrl()
0467 {
0468     MediaPlayList myPlayList;
0469     QAbstractItemModelTester testModel(&myPlayList);
0470     DatabaseInterface myDatabaseContent;
0471     TracksListener myListener(&myDatabaseContent);
0472 
0473     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0474     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0475     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0476     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0477     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0478     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0479     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0480     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0481     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0482     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0483 
0484     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0485     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0486     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0487     QCOMPARE(rowsRemovedSpy.count(), 0);
0488     QCOMPARE(rowsMovedSpy.count(), 0);
0489     QCOMPARE(rowsInsertedSpy.count(), 0);
0490    QCOMPARE(dataChangedSpy.count(), 0);
0491     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0492     QCOMPARE(newEntryInListSpy.count(), 0);
0493     QCOMPARE(newUrlInListSpy.count(), 0);
0494 
0495     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0496 
0497     connect(&myListener, &TracksListener::trackHasChanged,
0498             &myPlayList, &MediaPlayList::trackChanged,
0499             Qt::QueuedConnection);
0500     connect(&myListener, &TracksListener::tracksListAdded,
0501             &myPlayList, &MediaPlayList::tracksListAdded,
0502             Qt::QueuedConnection);
0503     connect(&myPlayList, &MediaPlayList::newEntryInList,
0504             &myListener, &TracksListener::newEntryInList,
0505             Qt::QueuedConnection);
0506     connect(&myPlayList, &MediaPlayList::newUrlInList,
0507             &myListener, &TracksListener::newUrlInList,
0508             Qt::QueuedConnection);
0509     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0510             &myListener, &TracksListener::trackByNameInList,
0511             Qt::QueuedConnection);
0512     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0513             &myListener, &TracksListener::tracksAdded);
0514 
0515     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0516 
0517     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0518     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0519     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0520     QCOMPARE(rowsRemovedSpy.count(), 0);
0521     QCOMPARE(rowsMovedSpy.count(), 0);
0522     QCOMPARE(rowsInsertedSpy.count(), 0);
0523     QCOMPARE(dataChangedSpy.count(), 0);
0524     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0525     QCOMPARE(newEntryInListSpy.count(), 0);
0526     QCOMPARE(newUrlInListSpy.count(), 0);
0527 
0528     auto firstNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
0529     auto firstTrackData = myDatabaseContent.trackDataFromDatabaseId(firstNewTrackID);
0530     auto secondNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
0531     auto secondTrackData = myDatabaseContent.trackDataFromDatabaseId(secondNewTrackID);
0532     myPlayList.enqueueFilesList({{{}, {}, firstTrackData.resourceURI()}, {{}, {}, secondTrackData.resourceURI()}});
0533 
0534     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0535     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0536     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0537     QCOMPARE(rowsRemovedSpy.count(), 0);
0538     QCOMPARE(rowsMovedSpy.count(), 0);
0539     QCOMPARE(rowsInsertedSpy.count(), 1);
0540     QCOMPARE(dataChangedSpy.count(), 0);
0541     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0542     QCOMPARE(newEntryInListSpy.count(), 0);
0543     QCOMPARE(newUrlInListSpy.count(), 2);
0544 
0545     QCOMPARE(dataChangedSpy.wait(), true);
0546 
0547     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0548     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0549     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0550     QCOMPARE(rowsRemovedSpy.count(), 0);
0551     QCOMPARE(rowsMovedSpy.count(), 0);
0552     QCOMPARE(rowsInsertedSpy.count(), 1);
0553     QCOMPARE(dataChangedSpy.count(), 2);
0554     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0555     QCOMPARE(newEntryInListSpy.count(), 0);
0556     QCOMPARE(newUrlInListSpy.count(), 2);
0557 }
0558 
0559 void MediaPlayListTest::enqueueFiles()
0560 {
0561     MediaPlayList myPlayList;
0562     QAbstractItemModelTester testModel(&myPlayList);
0563     DatabaseInterface myDatabaseContent;
0564     TracksListener myListener(&myDatabaseContent);
0565 
0566     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0567     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0568     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0569     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0570     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0571     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0572     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0573     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0574     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0575     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0576 
0577     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0578     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0579     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0580     QCOMPARE(rowsRemovedSpy.count(), 0);
0581     QCOMPARE(rowsMovedSpy.count(), 0);
0582     QCOMPARE(rowsInsertedSpy.count(), 0);
0583     QCOMPARE(dataChangedSpy.count(), 0);
0584     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0585     QCOMPARE(newEntryInListSpy.count(), 0);
0586     QCOMPARE(newUrlInListSpy.count(), 0);
0587 
0588     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0589 
0590     connect(&myListener, &TracksListener::trackHasChanged,
0591             &myPlayList, &MediaPlayList::trackChanged,
0592             Qt::QueuedConnection);
0593     connect(&myListener, &TracksListener::tracksListAdded,
0594             &myPlayList, &MediaPlayList::tracksListAdded,
0595             Qt::QueuedConnection);
0596     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0597             &myListener, &TracksListener::trackByNameInList,
0598             Qt::QueuedConnection);
0599     connect(&myPlayList, &MediaPlayList::newEntryInList,
0600             &myListener, &TracksListener::newEntryInList,
0601             Qt::QueuedConnection);
0602     connect(&myPlayList, &MediaPlayList::newUrlInList,
0603             &myListener, &TracksListener::newUrlInList,
0604             Qt::QueuedConnection);
0605     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0606             &myListener, &TracksListener::tracksAdded);
0607 
0608     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0609 
0610     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0611     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0612     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0613     QCOMPARE(rowsRemovedSpy.count(), 0);
0614     QCOMPARE(rowsMovedSpy.count(), 0);
0615     QCOMPARE(rowsInsertedSpy.count(), 0);
0616     QCOMPARE(dataChangedSpy.count(), 0);
0617     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0618     QCOMPARE(newEntryInListSpy.count(), 0);
0619     QCOMPARE(newUrlInListSpy.count(), 0);
0620 
0621     myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral("/$1"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}});
0622 
0623     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0624     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0625     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0626     QCOMPARE(rowsRemovedSpy.count(), 0);
0627     QCOMPARE(rowsMovedSpy.count(), 0);
0628     QCOMPARE(rowsInsertedSpy.count(), 1);
0629     QCOMPARE(dataChangedSpy.count(), 0);
0630     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0631     QCOMPARE(newEntryInListSpy.count(), 0);
0632     QCOMPARE(newUrlInListSpy.count(), 2);
0633 
0634     QCOMPARE(myPlayList.rowCount(), 2);
0635 
0636     QCOMPARE(dataChangedSpy.wait(300), true);
0637 
0638     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0639     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0640     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0641     QCOMPARE(rowsRemovedSpy.count(), 0);
0642     QCOMPARE(rowsMovedSpy.count(), 0);
0643     QCOMPARE(rowsInsertedSpy.count(), 1);
0644     QCOMPARE(dataChangedSpy.count(), 2);
0645     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0646     QCOMPARE(newEntryInListSpy.count(), 0);
0647     QCOMPARE(newUrlInListSpy.count(), 2);
0648 
0649     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
0650     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0651     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
0652     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0653     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0654     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
0655     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
0656     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
0657     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
0658     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
0659     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
0660     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
0661 }
0662 
0663 void MediaPlayListTest::enqueueSampleFiles()
0664 {
0665     MediaPlayList myPlayList;
0666     QAbstractItemModelTester testModel(&myPlayList);
0667     DatabaseInterface myDatabaseContent;
0668     TracksListener myListener(&myDatabaseContent);
0669 
0670     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0671     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0672     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0673     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0674     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0675     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0676     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0677     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0678     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0679     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0680 
0681     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0682     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0683     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0684     QCOMPARE(rowsRemovedSpy.count(), 0);
0685     QCOMPARE(rowsMovedSpy.count(), 0);
0686     QCOMPARE(rowsInsertedSpy.count(), 0);
0687     QCOMPARE(dataChangedSpy.count(), 0);
0688     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0689     QCOMPARE(newEntryInListSpy.count(), 0);
0690     QCOMPARE(newUrlInListSpy.count(), 0);
0691 
0692     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0693 
0694     connect(&myListener, &TracksListener::trackHasChanged,
0695             &myPlayList, &MediaPlayList::trackChanged,
0696             Qt::QueuedConnection);
0697     connect(&myListener, &TracksListener::tracksListAdded,
0698             &myPlayList, &MediaPlayList::tracksListAdded,
0699             Qt::QueuedConnection);
0700     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0701             &myListener, &TracksListener::trackByNameInList,
0702             Qt::QueuedConnection);
0703     connect(&myPlayList, &MediaPlayList::newEntryInList,
0704             &myListener, &TracksListener::newEntryInList,
0705             Qt::QueuedConnection);
0706     connect(&myPlayList, &MediaPlayList::newUrlInList,
0707             &myListener, &TracksListener::newUrlInList,
0708             Qt::QueuedConnection);
0709     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0710             &myListener, &TracksListener::tracksAdded);
0711 
0712     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0713 
0714     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0715     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0716     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0717     QCOMPARE(rowsRemovedSpy.count(), 0);
0718     QCOMPARE(rowsMovedSpy.count(), 0);
0719     QCOMPARE(rowsInsertedSpy.count(), 0);
0720     QCOMPARE(dataChangedSpy.count(), 0);
0721     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0722     QCOMPARE(newEntryInListSpy.count(), 0);
0723     QCOMPARE(newUrlInListSpy.count(), 0);
0724 
0725     myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))},
0726                         {{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}});
0727 
0728     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0729     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0730     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0731     QCOMPARE(rowsRemovedSpy.count(), 0);
0732     QCOMPARE(rowsMovedSpy.count(), 0);
0733     QCOMPARE(rowsInsertedSpy.count(), 1);
0734     QCOMPARE(dataChangedSpy.count(), 0);
0735     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0736     QCOMPARE(newEntryInListSpy.count(), 0);
0737     QCOMPARE(newUrlInListSpy.count(), 2);
0738 
0739     QCOMPARE(myPlayList.rowCount(), 2);
0740 
0741     while (dataChangedSpy.count() < 2) {
0742         QCOMPARE(dataChangedSpy.wait(), true);
0743     }
0744 
0745     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0746     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0747     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
0748     QCOMPARE(rowsRemovedSpy.count(), 0);
0749     QCOMPARE(rowsMovedSpy.count(), 0);
0750     QCOMPARE(rowsInsertedSpy.count(), 1);
0751     QCOMPARE(dataChangedSpy.count(), 2);
0752     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0753     QCOMPARE(newEntryInListSpy.count(), 0);
0754     QCOMPARE(newUrlInListSpy.count(), 2);
0755 
0756 #if KFFileMetaData_FOUND
0757     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
0758     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
0759     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
0760     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0761     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0762     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
0763     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2"));
0764     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2"));
0765     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2"));
0766     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
0767     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
0768     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
0769 #else
0770     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg"));
0771     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
0772     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
0773     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
0774     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
0775     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
0776     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg"));
0777     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
0778     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
0779     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
0780     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
0781     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
0782 #endif
0783 }
0784 
0785 void MediaPlayListTest::enqueueEmpty()
0786 {
0787     MediaPlayList myPlayList;
0788     QAbstractItemModelTester testModel(&myPlayList);
0789     DatabaseInterface myDatabaseContent;
0790     TracksListener myListener(&myDatabaseContent);
0791 
0792     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0793     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0794     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0795     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0796     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0797     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0798     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0799     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0800     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0801     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0802 
0803     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0804     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0805     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0806     QCOMPARE(rowsRemovedSpy.count(), 0);
0807     QCOMPARE(rowsMovedSpy.count(), 0);
0808     QCOMPARE(rowsInsertedSpy.count(), 0);
0809     QCOMPARE(dataChangedSpy.count(), 0);
0810     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0811     QCOMPARE(newEntryInListSpy.count(), 0);
0812 
0813     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0814 
0815     connect(&myListener, &TracksListener::trackHasChanged,
0816             &myPlayList, &MediaPlayList::trackChanged,
0817             Qt::QueuedConnection);
0818     connect(&myListener, &TracksListener::tracksListAdded,
0819             &myPlayList, &MediaPlayList::tracksListAdded,
0820             Qt::QueuedConnection);
0821     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0822             &myListener, &TracksListener::trackByNameInList,
0823             Qt::QueuedConnection);
0824     connect(&myPlayList, &MediaPlayList::newEntryInList,
0825             &myListener, &TracksListener::newEntryInList,
0826             Qt::QueuedConnection);
0827     connect(&myPlayList, &MediaPlayList::newUrlInList,
0828             &myListener, &TracksListener::newUrlInList,
0829             Qt::QueuedConnection);
0830     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0831             &myListener, &TracksListener::tracksAdded);
0832 
0833     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0834 
0835     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0836     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0837     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0838     QCOMPARE(rowsRemovedSpy.count(), 0);
0839     QCOMPARE(rowsMovedSpy.count(), 0);
0840     QCOMPARE(rowsInsertedSpy.count(), 0);
0841     QCOMPARE(dataChangedSpy.count(), 0);
0842     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0843     QCOMPARE(newEntryInListSpy.count(), 0);
0844 
0845     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
0846 
0847     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0848     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0849     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0850     QCOMPARE(rowsRemovedSpy.count(), 0);
0851     QCOMPARE(rowsMovedSpy.count(), 0);
0852     QCOMPARE(rowsInsertedSpy.count(), 0);
0853     QCOMPARE(dataChangedSpy.count(), 0);
0854     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0855     QCOMPARE(newEntryInListSpy.count(), 0);
0856 
0857     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
0858 
0859     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0860     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0861     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0862     QCOMPARE(rowsRemovedSpy.count(), 0);
0863     QCOMPARE(rowsMovedSpy.count(), 0);
0864     QCOMPARE(rowsInsertedSpy.count(), 0);
0865     QCOMPARE(dataChangedSpy.count(), 0);
0866     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0867     QCOMPARE(newEntryInListSpy.count(), 0);
0868 
0869     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
0870 
0871     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0872     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0873     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0874     QCOMPARE(rowsRemovedSpy.count(), 0);
0875     QCOMPARE(rowsMovedSpy.count(), 0);
0876     QCOMPARE(rowsInsertedSpy.count(), 0);
0877     QCOMPARE(dataChangedSpy.count(), 0);
0878     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0879     QCOMPARE(newEntryInListSpy.count(), 0);
0880 
0881     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
0882 
0883     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0884     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0885     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0886     QCOMPARE(rowsRemovedSpy.count(), 0);
0887     QCOMPARE(rowsMovedSpy.count(), 0);
0888     QCOMPARE(rowsInsertedSpy.count(), 0);
0889     QCOMPARE(dataChangedSpy.count(), 0);
0890     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0891     QCOMPARE(newEntryInListSpy.count(), 0);
0892 
0893     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
0894 
0895     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0896     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0897     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0898     QCOMPARE(rowsRemovedSpy.count(), 0);
0899     QCOMPARE(rowsMovedSpy.count(), 0);
0900     QCOMPARE(rowsInsertedSpy.count(), 0);
0901     QCOMPARE(dataChangedSpy.count(), 0);
0902     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0903     QCOMPARE(newEntryInListSpy.count(), 0);
0904 }
0905 
0906 void MediaPlayListTest::removeFirstTrackOfAlbum()
0907 {
0908     MediaPlayList myPlayList;
0909     QAbstractItemModelTester testModel(&myPlayList);
0910     DatabaseInterface myDatabaseContent;
0911     TracksListener myListener(&myDatabaseContent);
0912 
0913     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
0914     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
0915     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
0916     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
0917     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
0918     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
0919     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
0920     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
0921     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
0922     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
0923 
0924     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0925     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0926     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0927     QCOMPARE(rowsRemovedSpy.count(), 0);
0928     QCOMPARE(rowsMovedSpy.count(), 0);
0929     QCOMPARE(rowsInsertedSpy.count(), 0);
0930     QCOMPARE(dataChangedSpy.count(), 0);
0931     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0932     QCOMPARE(newEntryInListSpy.count(), 0);
0933 
0934     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
0935 
0936     connect(&myListener, &TracksListener::trackHasChanged,
0937             &myPlayList, &MediaPlayList::trackChanged,
0938             Qt::QueuedConnection);
0939     connect(&myListener, &TracksListener::tracksListAdded,
0940             &myPlayList, &MediaPlayList::tracksListAdded,
0941             Qt::QueuedConnection);
0942     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
0943             &myListener, &TracksListener::trackByNameInList,
0944             Qt::QueuedConnection);
0945     connect(&myPlayList, &MediaPlayList::newEntryInList,
0946             &myListener, &TracksListener::newEntryInList,
0947             Qt::QueuedConnection);
0948     connect(&myPlayList, &MediaPlayList::newUrlInList,
0949             &myListener, &TracksListener::newUrlInList,
0950             Qt::QueuedConnection);
0951     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
0952             &myListener, &TracksListener::tracksAdded);
0953 
0954     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
0955 
0956     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
0957     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0958     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
0959     QCOMPARE(rowsRemovedSpy.count(), 0);
0960     QCOMPARE(rowsMovedSpy.count(), 0);
0961     QCOMPARE(rowsInsertedSpy.count(), 0);
0962     QCOMPARE(dataChangedSpy.count(), 0);
0963     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0964     QCOMPARE(newEntryInListSpy.count(), 0);
0965 
0966     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
0967                         QStringLiteral("album2"), {}});
0968 
0969     QVERIFY(rowsAboutToBeRemovedSpy.wait());
0970 
0971     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
0972     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0973     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0974     QCOMPARE(rowsRemovedSpy.count(), 1);
0975     QCOMPARE(rowsMovedSpy.count(), 0);
0976     QCOMPARE(rowsInsertedSpy.count(), 2);
0977     QCOMPARE(dataChangedSpy.count(), 0);
0978     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0979     QCOMPARE(newEntryInListSpy.count(), 1);
0980 
0981     myPlayList.removeRows(0, 1);
0982 
0983     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
0984     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
0985     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
0986     QCOMPARE(rowsRemovedSpy.count(), 2);
0987     QCOMPARE(rowsMovedSpy.count(), 0);
0988     QCOMPARE(rowsInsertedSpy.count(), 2);
0989     QCOMPARE(dataChangedSpy.count(), 0);
0990     QCOMPARE(newTrackByNameInListSpy.count(), 0);
0991     QCOMPARE(newEntryInListSpy.count(), 1);
0992 }
0993 
0994 void MediaPlayListTest::testTrackBeenRemoved()
0995 {
0996     MediaPlayList myPlayList;
0997     QAbstractItemModelTester testModel(&myPlayList);
0998     DatabaseInterface myDatabaseContent;
0999     TracksListener myListener(&myDatabaseContent);
1000 
1001     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1002     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1003     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1004     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1005     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1006     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1007     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1008     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1009     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1010     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1011 
1012     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1013     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1014     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1015     QCOMPARE(rowsRemovedSpy.count(), 0);
1016     QCOMPARE(rowsMovedSpy.count(), 0);
1017     QCOMPARE(rowsInsertedSpy.count(), 0);
1018     QCOMPARE(dataChangedSpy.count(), 0);
1019     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1020     QCOMPARE(newEntryInListSpy.count(), 0);
1021 
1022     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1023 
1024     connect(&myListener, &TracksListener::trackHasChanged,
1025             &myPlayList, &MediaPlayList::trackChanged,
1026             Qt::QueuedConnection);
1027     connect(&myListener, &TracksListener::tracksListAdded,
1028             &myPlayList, &MediaPlayList::tracksListAdded,
1029             Qt::QueuedConnection);
1030     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1031             &myListener, &TracksListener::trackByNameInList,
1032             Qt::QueuedConnection);
1033     connect(&myPlayList, &MediaPlayList::newEntryInList,
1034             &myListener, &TracksListener::newEntryInList,
1035             Qt::QueuedConnection);
1036     connect(&myPlayList, &MediaPlayList::newUrlInList,
1037             &myListener, &TracksListener::newUrlInList,
1038             Qt::QueuedConnection);
1039     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1040             &myListener, &TracksListener::tracksAdded);
1041 
1042     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1043 
1044     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1045     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1046     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1047     QCOMPARE(rowsRemovedSpy.count(), 0);
1048     QCOMPARE(rowsMovedSpy.count(), 0);
1049     QCOMPARE(rowsInsertedSpy.count(), 0);
1050     QCOMPARE(dataChangedSpy.count(), 0);
1051     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1052     QCOMPARE(newEntryInListSpy.count(), 0);
1053 
1054     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}});
1055 
1056     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1057     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1058     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1059     QCOMPARE(rowsRemovedSpy.count(), 0);
1060     QCOMPARE(rowsMovedSpy.count(), 0);
1061     QCOMPARE(rowsInsertedSpy.count(), 1);
1062     QCOMPARE(dataChangedSpy.count(), 0);
1063     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1064     QCOMPARE(newEntryInListSpy.count(), 1);
1065 
1066     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
1067 
1068     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1069     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1070     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1071     QCOMPARE(rowsRemovedSpy.count(), 1);
1072     QCOMPARE(rowsMovedSpy.count(), 0);
1073     QCOMPARE(rowsInsertedSpy.count(), 2);
1074     QCOMPARE(dataChangedSpy.count(), 0);
1075     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1076     QCOMPARE(newEntryInListSpy.count(), 1);
1077 
1078     QCOMPARE(myPlayList.rowCount(), 6);
1079 
1080     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1081     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1082     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1083     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1084     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1085     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1086     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1087     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1088     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1089     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1090     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1091     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1092     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1093     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1094     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1095     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1096     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1097     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1098     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1099     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1100     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1101     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1102     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
1103     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1104     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1105     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1106     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
1107     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1108     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1109     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
1110     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1111     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1112     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1113     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
1114     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1115     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1116     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
1117     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1118     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1119     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1120     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
1121     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1122 
1123     auto removedTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"),
1124                                                                                  QStringLiteral("album2"), 2, 1);
1125 
1126     QCOMPARE(removedTrackId != 0, true);
1127 
1128     auto removedTrack = myDatabaseContent.trackDataFromDatabaseId(removedTrackId);
1129 
1130     QVERIFY(!removedTrack.isEmpty());
1131 
1132     myPlayList.trackRemoved(removedTrack[DataTypes::DatabaseIdRole].toULongLong());
1133 
1134     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1135     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1136     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1137     QCOMPARE(rowsRemovedSpy.count(), 1);
1138     QCOMPARE(rowsMovedSpy.count(), 0);
1139     QCOMPARE(rowsInsertedSpy.count(), 2);
1140     QCOMPARE(dataChangedSpy.count(), 1);
1141     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1142     QCOMPARE(newEntryInListSpy.count(), 1);
1143 
1144     QCOMPARE(myPlayList.rowCount(), 6);
1145 
1146     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1147     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1148     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1149     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1150     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1151     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1152     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1153     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1154     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1155     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1156     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1157     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1158     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1159     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1160     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false);
1161     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1162     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1163     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1164     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1165     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1);
1166     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0);
1167     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1168     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
1169     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1170     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1171     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1172     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
1173     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1174     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1175     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
1176     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1177     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1178     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1179     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
1180     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1181     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1182     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
1183     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1184     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1185     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1186     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
1187     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1188 }
1189 
1190 void MediaPlayListTest::testSetData()
1191 {
1192     MediaPlayList myPlayList;
1193     QAbstractItemModelTester testModel(&myPlayList);
1194     DatabaseInterface myDatabaseContent;
1195     TracksListener myListener(&myDatabaseContent);
1196 
1197     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1198     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1199     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1200     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1201     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1202     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1203     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1204     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1205     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1206     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1207 
1208     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1209     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1210     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1211     QCOMPARE(rowsRemovedSpy.count(), 0);
1212     QCOMPARE(rowsMovedSpy.count(), 0);
1213     QCOMPARE(rowsInsertedSpy.count(), 0);
1214     QCOMPARE(dataChangedSpy.count(), 0);
1215     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1216     QCOMPARE(newEntryInListSpy.count(), 0);
1217 
1218     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1219 
1220     connect(&myListener, &TracksListener::trackHasChanged,
1221             &myPlayList, &MediaPlayList::trackChanged,
1222             Qt::QueuedConnection);
1223     connect(&myListener, &TracksListener::tracksListAdded,
1224             &myPlayList, &MediaPlayList::tracksListAdded,
1225             Qt::QueuedConnection);
1226     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1227             &myListener, &TracksListener::trackByNameInList,
1228             Qt::QueuedConnection);
1229     connect(&myPlayList, &MediaPlayList::newEntryInList,
1230             &myListener, &TracksListener::newEntryInList,
1231             Qt::QueuedConnection);
1232     connect(&myPlayList, &MediaPlayList::newUrlInList,
1233             &myListener, &TracksListener::newUrlInList,
1234             Qt::QueuedConnection);
1235     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1236             &myListener, &TracksListener::tracksAdded);
1237 
1238     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1239 
1240     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1241     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1242     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1243     QCOMPARE(rowsRemovedSpy.count(), 0);
1244     QCOMPARE(rowsMovedSpy.count(), 0);
1245     QCOMPARE(rowsInsertedSpy.count(), 0);
1246     QCOMPARE(dataChangedSpy.count(), 0);
1247     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1248     QCOMPARE(newEntryInListSpy.count(), 0);
1249 
1250     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
1251                                                                                QStringLiteral("album3"), 1, 1);
1252     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1253 
1254     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1255     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1256     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1257     QCOMPARE(rowsRemovedSpy.count(), 0);
1258     QCOMPARE(rowsMovedSpy.count(), 0);
1259     QCOMPARE(rowsInsertedSpy.count(), 1);
1260     QCOMPARE(dataChangedSpy.count(), 0);
1261     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1262     QCOMPARE(newEntryInListSpy.count(), 1);
1263 
1264     QCOMPARE(dataChangedSpy.wait(), true);
1265 
1266     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1267     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1268     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1269     QCOMPARE(rowsRemovedSpy.count(), 0);
1270     QCOMPARE(rowsMovedSpy.count(), 0);
1271     QCOMPARE(rowsInsertedSpy.count(), 1);
1272     QCOMPARE(dataChangedSpy.count(), 1);
1273     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1274     QCOMPARE(newEntryInListSpy.count(), 1);
1275 
1276     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1277 
1278     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1279                                                                                 QStringLiteral("album1"), 1, 1);
1280     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1281 
1282     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1283     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1284     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1285     QCOMPARE(rowsRemovedSpy.count(), 0);
1286     QCOMPARE(rowsMovedSpy.count(), 0);
1287     QCOMPARE(rowsInsertedSpy.count(), 2);
1288     QCOMPARE(dataChangedSpy.count(), 1);
1289     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1290     QCOMPARE(newEntryInListSpy.count(), 2);
1291 
1292     QCOMPARE(dataChangedSpy.wait(), true);
1293 
1294     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1295     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1296     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1297     QCOMPARE(rowsRemovedSpy.count(), 0);
1298     QCOMPARE(rowsMovedSpy.count(), 0);
1299     QCOMPARE(rowsInsertedSpy.count(), 2);
1300     QCOMPARE(dataChangedSpy.count(), 2);
1301     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1302     QCOMPARE(newEntryInListSpy.count(), 2);
1303 
1304     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1305     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1306 
1307     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1308                                                                                QStringLiteral("album3"), 2, 1);
1309     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1310 
1311     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1312     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1313     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1314     QCOMPARE(rowsRemovedSpy.count(), 0);
1315     QCOMPARE(rowsMovedSpy.count(), 0);
1316     QCOMPARE(rowsInsertedSpy.count(), 3);
1317     QCOMPARE(dataChangedSpy.count(), 2);
1318     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1319     QCOMPARE(newEntryInListSpy.count(), 3);
1320 
1321     QCOMPARE(dataChangedSpy.wait(), true);
1322 
1323     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1324     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1325     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1326     QCOMPARE(rowsRemovedSpy.count(), 0);
1327     QCOMPARE(rowsMovedSpy.count(), 0);
1328     QCOMPARE(rowsInsertedSpy.count(), 3);
1329     QCOMPARE(dataChangedSpy.count(), 3);
1330     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1331     QCOMPARE(newEntryInListSpy.count(), 3);
1332 
1333     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1334     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1335     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1336 
1337     QCOMPARE(myPlayList.setData(myPlayList.index(2, 0), true, MediaPlayList::ColumnsRoles::IsPlayingRole), true);
1338 
1339     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1340     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1341     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1342     QCOMPARE(rowsRemovedSpy.count(), 0);
1343     QCOMPARE(rowsMovedSpy.count(), 0);
1344     QCOMPARE(rowsInsertedSpy.count(), 3);
1345     QCOMPARE(dataChangedSpy.count(), 4);
1346     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1347     QCOMPARE(newEntryInListSpy.count(), 3);
1348 
1349     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1350     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1351     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true);
1352 
1353     QCOMPARE(myPlayList.setData(myPlayList.index(2, 0), true, MediaPlayList::ColumnsRoles::SecondaryTextRole), false);
1354 
1355     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1356     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1357     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1358     QCOMPARE(rowsRemovedSpy.count(), 0);
1359     QCOMPARE(rowsMovedSpy.count(), 0);
1360     QCOMPARE(rowsInsertedSpy.count(), 3);
1361     QCOMPARE(dataChangedSpy.count(), 4);
1362     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1363     QCOMPARE(newEntryInListSpy.count(), 3);
1364 
1365     QCOMPARE(myPlayList.setData(myPlayList.index(4, 0), true, MediaPlayList::ColumnsRoles::TitleRole), false);
1366 
1367     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1368     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1369     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1370     QCOMPARE(rowsRemovedSpy.count(), 0);
1371     QCOMPARE(rowsMovedSpy.count(), 0);
1372     QCOMPARE(rowsInsertedSpy.count(), 3);
1373     QCOMPARE(dataChangedSpy.count(), 4);
1374     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1375     QCOMPARE(newEntryInListSpy.count(), 3);
1376 
1377     QCOMPARE(myPlayList.setData({}, true, MediaPlayList::ColumnsRoles::TitleRole), false);
1378 
1379     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1380     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1381     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1382     QCOMPARE(rowsRemovedSpy.count(), 0);
1383     QCOMPARE(rowsMovedSpy.count(), 0);
1384     QCOMPARE(rowsInsertedSpy.count(), 3);
1385     QCOMPARE(dataChangedSpy.count(), 4);
1386     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1387     QCOMPARE(newEntryInListSpy.count(), 3);
1388 }
1389 
1390 void MediaPlayListTest::testHasHeader()
1391 {
1392     MediaPlayList myPlayList;
1393     QAbstractItemModelTester testModel(&myPlayList);
1394     DatabaseInterface myDatabaseContent;
1395     TracksListener myListener(&myDatabaseContent);
1396 
1397     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1398     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1399     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1400     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1401     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1402     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1403     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1404     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1405     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1406     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1407 
1408     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1409     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1410     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1411     QCOMPARE(rowsRemovedSpy.count(), 0);
1412     QCOMPARE(rowsMovedSpy.count(), 0);
1413     QCOMPARE(rowsInsertedSpy.count(), 0);
1414     QCOMPARE(dataChangedSpy.count(), 0);
1415     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1416     QCOMPARE(newEntryInListSpy.count(), 0);
1417 
1418     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1419 
1420     connect(&myListener, &TracksListener::trackHasChanged,
1421             &myPlayList, &MediaPlayList::trackChanged,
1422             Qt::QueuedConnection);
1423     connect(&myListener, &TracksListener::tracksListAdded,
1424             &myPlayList, &MediaPlayList::tracksListAdded,
1425             Qt::QueuedConnection);
1426     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1427             &myListener, &TracksListener::trackByNameInList,
1428             Qt::QueuedConnection);
1429     connect(&myPlayList, &MediaPlayList::newEntryInList,
1430             &myListener, &TracksListener::newEntryInList,
1431             Qt::QueuedConnection);
1432     connect(&myPlayList, &MediaPlayList::newUrlInList,
1433             &myListener, &TracksListener::newUrlInList,
1434             Qt::QueuedConnection);
1435     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1436             &myListener, &TracksListener::tracksAdded);
1437 
1438     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1439 
1440     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1441     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1442     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1443     QCOMPARE(rowsRemovedSpy.count(), 0);
1444     QCOMPARE(rowsMovedSpy.count(), 0);
1445     QCOMPARE(rowsInsertedSpy.count(), 0);
1446     QCOMPARE(dataChangedSpy.count(), 0);
1447     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1448     QCOMPARE(newEntryInListSpy.count(), 0);
1449 
1450     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1451     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1452 
1453     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1454     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1455     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1456     QCOMPARE(rowsRemovedSpy.count(), 0);
1457     QCOMPARE(rowsMovedSpy.count(), 0);
1458     QCOMPARE(rowsInsertedSpy.count(), 1);
1459     QCOMPARE(dataChangedSpy.count(), 0);
1460     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1461     QCOMPARE(newEntryInListSpy.count(), 1);
1462 
1463     QCOMPARE(dataChangedSpy.wait(), true);
1464 
1465     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1466     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1467     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1468     QCOMPARE(rowsRemovedSpy.count(), 0);
1469     QCOMPARE(rowsMovedSpy.count(), 0);
1470     QCOMPARE(rowsInsertedSpy.count(), 1);
1471     QCOMPARE(dataChangedSpy.count(), 1);
1472     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1473     QCOMPARE(newEntryInListSpy.count(), 1);
1474 
1475     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1476     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1477 
1478     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1479     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1480     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1481     QCOMPARE(rowsRemovedSpy.count(), 0);
1482     QCOMPARE(rowsMovedSpy.count(), 0);
1483     QCOMPARE(rowsInsertedSpy.count(), 2);
1484     QCOMPARE(dataChangedSpy.count(), 1);
1485     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1486     QCOMPARE(newEntryInListSpy.count(), 2);
1487 
1488     QCOMPARE(dataChangedSpy.wait(), true);
1489 
1490     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1491     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1492     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1493     QCOMPARE(rowsRemovedSpy.count(), 0);
1494     QCOMPARE(rowsMovedSpy.count(), 0);
1495     QCOMPARE(rowsInsertedSpy.count(), 2);
1496     QCOMPARE(dataChangedSpy.count(), 2);
1497     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1498     QCOMPARE(newEntryInListSpy.count(), 2);
1499 
1500     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1501     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1502 
1503     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1504     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1505     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1506     QCOMPARE(rowsRemovedSpy.count(), 0);
1507     QCOMPARE(rowsMovedSpy.count(), 0);
1508     QCOMPARE(rowsInsertedSpy.count(), 3);
1509     QCOMPARE(dataChangedSpy.count(), 2);
1510     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1511     QCOMPARE(newEntryInListSpy.count(), 3);
1512 
1513     QCOMPARE(dataChangedSpy.wait(), true);
1514 
1515     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1516     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1517     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1518     QCOMPARE(rowsRemovedSpy.count(), 0);
1519     QCOMPARE(rowsMovedSpy.count(), 0);
1520     QCOMPARE(rowsInsertedSpy.count(), 3);
1521     QCOMPARE(dataChangedSpy.count(), 3);
1522     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1523     QCOMPARE(newEntryInListSpy.count(), 3);
1524 
1525     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1526     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1527 
1528     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1529     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1530     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1531     QCOMPARE(rowsRemovedSpy.count(), 0);
1532     QCOMPARE(rowsMovedSpy.count(), 0);
1533     QCOMPARE(rowsInsertedSpy.count(), 4);
1534     QCOMPARE(dataChangedSpy.count(), 3);
1535     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1536     QCOMPARE(newEntryInListSpy.count(), 4);
1537 
1538     QCOMPARE(dataChangedSpy.wait(), true);
1539 
1540     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1541     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1542     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1543     QCOMPARE(rowsRemovedSpy.count(), 0);
1544     QCOMPARE(rowsMovedSpy.count(), 0);
1545     QCOMPARE(rowsInsertedSpy.count(), 4);
1546     QCOMPARE(dataChangedSpy.count(), 4);
1547     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1548     QCOMPARE(newEntryInListSpy.count(), 4);
1549 
1550     myPlayList.removeRows(2, 1);
1551 
1552     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1553     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1554     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1555     QCOMPARE(rowsRemovedSpy.count(), 1);
1556     QCOMPARE(rowsMovedSpy.count(), 0);
1557     QCOMPARE(rowsInsertedSpy.count(), 4);
1558     QCOMPARE(dataChangedSpy.count(), 4);
1559     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1560     QCOMPARE(newEntryInListSpy.count(), 4);
1561 }
1562 
1563 void MediaPlayListTest::testHasHeaderWithRemove()
1564 {
1565     MediaPlayList myPlayList;
1566     QAbstractItemModelTester testModel(&myPlayList);
1567     DatabaseInterface myDatabaseContent;
1568     TracksListener myListener(&myDatabaseContent);
1569 
1570     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1571     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1572     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1573     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1574     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1575     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1576     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1577     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1578     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1579     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1580 
1581     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1582     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1583     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1584     QCOMPARE(rowsRemovedSpy.count(), 0);
1585     QCOMPARE(rowsMovedSpy.count(), 0);
1586     QCOMPARE(rowsInsertedSpy.count(), 0);
1587     QCOMPARE(dataChangedSpy.count(), 0);
1588     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1589     QCOMPARE(newEntryInListSpy.count(), 0);
1590 
1591     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1592 
1593     connect(&myListener, &TracksListener::trackHasChanged,
1594             &myPlayList, &MediaPlayList::trackChanged,
1595             Qt::QueuedConnection);
1596     connect(&myListener, &TracksListener::tracksListAdded,
1597             &myPlayList, &MediaPlayList::tracksListAdded,
1598             Qt::QueuedConnection);
1599     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1600             &myListener, &TracksListener::trackByNameInList,
1601             Qt::QueuedConnection);
1602     connect(&myPlayList, &MediaPlayList::newEntryInList,
1603             &myListener, &TracksListener::newEntryInList,
1604             Qt::QueuedConnection);
1605     connect(&myPlayList, &MediaPlayList::newUrlInList,
1606             &myListener, &TracksListener::newUrlInList,
1607             Qt::QueuedConnection);
1608     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1609             &myListener, &TracksListener::tracksAdded);
1610 
1611     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1612 
1613     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1614     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1615     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1616     QCOMPARE(rowsRemovedSpy.count(), 0);
1617     QCOMPARE(rowsMovedSpy.count(), 0);
1618     QCOMPARE(rowsInsertedSpy.count(), 0);
1619     QCOMPARE(dataChangedSpy.count(), 0);
1620     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1621     QCOMPARE(newEntryInListSpy.count(), 0);
1622 
1623     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1624     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1625 
1626     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1627     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1628     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1629     QCOMPARE(rowsRemovedSpy.count(), 0);
1630     QCOMPARE(rowsMovedSpy.count(), 0);
1631     QCOMPARE(rowsInsertedSpy.count(), 1);
1632     QCOMPARE(dataChangedSpy.count(), 0);
1633     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1634     QCOMPARE(newEntryInListSpy.count(), 1);
1635 
1636     QCOMPARE(dataChangedSpy.wait(), true);
1637 
1638     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1639     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1640     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1641     QCOMPARE(rowsRemovedSpy.count(), 0);
1642     QCOMPARE(rowsMovedSpy.count(), 0);
1643     QCOMPARE(rowsInsertedSpy.count(), 1);
1644     QCOMPARE(dataChangedSpy.count(), 1);
1645     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1646     QCOMPARE(newEntryInListSpy.count(), 1);
1647 
1648     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1649     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1650 
1651     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1652     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1653     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1654     QCOMPARE(rowsRemovedSpy.count(), 0);
1655     QCOMPARE(rowsMovedSpy.count(), 0);
1656     QCOMPARE(rowsInsertedSpy.count(), 2);
1657     QCOMPARE(dataChangedSpy.count(), 1);
1658     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1659     QCOMPARE(newEntryInListSpy.count(), 2);
1660 
1661     QCOMPARE(dataChangedSpy.wait(), true);
1662 
1663     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1664     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1665     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1666     QCOMPARE(rowsRemovedSpy.count(), 0);
1667     QCOMPARE(rowsMovedSpy.count(), 0);
1668     QCOMPARE(rowsInsertedSpy.count(), 2);
1669     QCOMPARE(dataChangedSpy.count(), 2);
1670     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1671     QCOMPARE(newEntryInListSpy.count(), 2);
1672 
1673     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1674     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1675 
1676     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1677     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1678     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1679     QCOMPARE(rowsRemovedSpy.count(), 0);
1680     QCOMPARE(rowsMovedSpy.count(), 0);
1681     QCOMPARE(rowsInsertedSpy.count(), 3);
1682     QCOMPARE(dataChangedSpy.count(), 2);
1683     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1684     QCOMPARE(newEntryInListSpy.count(), 3);
1685 
1686     QCOMPARE(dataChangedSpy.wait(), true);
1687 
1688     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1689     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1690     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1691     QCOMPARE(rowsRemovedSpy.count(), 0);
1692     QCOMPARE(rowsMovedSpy.count(), 0);
1693     QCOMPARE(rowsInsertedSpy.count(), 3);
1694     QCOMPARE(dataChangedSpy.count(), 3);
1695     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1696     QCOMPARE(newEntryInListSpy.count(), 3);
1697 
1698     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1699     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1700 
1701     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1702     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1703     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1704     QCOMPARE(rowsRemovedSpy.count(), 0);
1705     QCOMPARE(rowsMovedSpy.count(), 0);
1706     QCOMPARE(rowsInsertedSpy.count(), 4);
1707     QCOMPARE(dataChangedSpy.count(), 3);
1708     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1709     QCOMPARE(newEntryInListSpy.count(), 4);
1710 
1711     QCOMPARE(dataChangedSpy.wait(), true);
1712 
1713     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1714     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1715     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1716     QCOMPARE(rowsRemovedSpy.count(), 0);
1717     QCOMPARE(rowsMovedSpy.count(), 0);
1718     QCOMPARE(rowsInsertedSpy.count(), 4);
1719     QCOMPARE(dataChangedSpy.count(), 4);
1720     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1721     QCOMPARE(newEntryInListSpy.count(), 4);
1722 
1723     myPlayList.removeRows(2, 1);
1724 
1725     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1726     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1727     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1728     QCOMPARE(rowsRemovedSpy.count(), 1);
1729     QCOMPARE(rowsMovedSpy.count(), 0);
1730     QCOMPARE(rowsInsertedSpy.count(), 4);
1731     QCOMPARE(dataChangedSpy.count(), 4);
1732     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1733     QCOMPARE(newEntryInListSpy.count(), 4);
1734 
1735     myPlayList.removeRows(0, 1);
1736 
1737     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
1738     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1739     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1740     QCOMPARE(rowsRemovedSpy.count(), 2);
1741     QCOMPARE(rowsMovedSpy.count(), 0);
1742     QCOMPARE(rowsInsertedSpy.count(), 4);
1743     QCOMPARE(dataChangedSpy.count(), 4);
1744     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1745     QCOMPARE(newEntryInListSpy.count(), 4);
1746 }
1747 
1748 void MediaPlayListTest::testHasHeaderWithRestore()
1749 {
1750     MediaPlayList myPlayList;
1751     QAbstractItemModelTester testModel(&myPlayList);
1752     DatabaseInterface myDatabaseContent;
1753     TracksListener myListener(&myDatabaseContent);
1754 
1755     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1756     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1757     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1758     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1759     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1760     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1761     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1762     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1763     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1764     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1765 
1766     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1767     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1768     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1769     QCOMPARE(rowsRemovedSpy.count(), 0);
1770     QCOMPARE(rowsMovedSpy.count(), 0);
1771     QCOMPARE(rowsInsertedSpy.count(), 0);
1772     QCOMPARE(dataChangedSpy.count(), 0);
1773     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1774     QCOMPARE(newEntryInListSpy.count(), 0);
1775 
1776     myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore"));
1777 
1778     connect(&myListener, &TracksListener::trackHasChanged,
1779             &myPlayList, &MediaPlayList::trackChanged,
1780             Qt::QueuedConnection);
1781     connect(&myListener, &TracksListener::tracksListAdded,
1782             &myPlayList, &MediaPlayList::tracksListAdded,
1783             Qt::QueuedConnection);
1784     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1785             &myListener, &TracksListener::trackByNameInList,
1786             Qt::QueuedConnection);
1787     connect(&myPlayList, &MediaPlayList::newEntryInList,
1788             &myListener, &TracksListener::newEntryInList,
1789             Qt::QueuedConnection);
1790     connect(&myPlayList, &MediaPlayList::newUrlInList,
1791             &myListener, &TracksListener::newUrlInList,
1792             Qt::QueuedConnection);
1793     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1794             &myListener, &TracksListener::tracksAdded);
1795 
1796     myPlayList.enqueueRestoredEntries(
1797                 QVariantList({QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("1"), QStringLiteral("1"),{}}),
1798                               QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("1"), QStringLiteral("1"),{}}),
1799                               QStringList({{},QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("2"), QStringLiteral("1"),{}}),
1800                               QStringList({{},QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("3"), QStringLiteral("1"),{}})
1801                              }));
1802 
1803     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1804     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1805     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1806     QCOMPARE(rowsRemovedSpy.count(), 0);
1807     QCOMPARE(rowsMovedSpy.count(), 0);
1808     QCOMPARE(rowsInsertedSpy.count(), 1);
1809     QCOMPARE(dataChangedSpy.count(), 0);
1810     QCOMPARE(newTrackByNameInListSpy.count(), 4);
1811     QCOMPARE(newEntryInListSpy.count(), 0);
1812 
1813     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1814 
1815     while (dataChangedSpy.count() < 4) {
1816         QCOMPARE(dataChangedSpy.wait(), true);
1817     }
1818 
1819     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1820     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1821     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1822     QCOMPARE(rowsRemovedSpy.count(), 0);
1823     QCOMPARE(rowsMovedSpy.count(), 0);
1824     QCOMPARE(rowsInsertedSpy.count(), 1);
1825     QCOMPARE(dataChangedSpy.count(), 4);
1826     QCOMPARE(newTrackByNameInListSpy.count(), 4);
1827     QCOMPARE(newEntryInListSpy.count(), 0);
1828 
1829     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
1830     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1831     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1832     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
1833     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1834     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
1835     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
1836     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
1837     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1838     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
1839     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1840     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1841     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
1842     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1843     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1844     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
1845     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1846     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
1847     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
1848     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1849     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1850     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
1851     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1852     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
1853 }
1854 
1855 void MediaPlayListTest::testHasHeaderMoveFirst()
1856 {
1857     MediaPlayList myPlayList;
1858     QAbstractItemModelTester testModel(&myPlayList);
1859 
1860     DatabaseInterface myDatabaseContent;
1861     TracksListener myListener(&myDatabaseContent);
1862 
1863     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1864     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1865     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1866     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1867     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1868     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1869     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1870     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1871     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1872     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1873 
1874     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1875     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1876     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1877     QCOMPARE(rowsRemovedSpy.count(), 0);
1878     QCOMPARE(rowsMovedSpy.count(), 0);
1879     QCOMPARE(rowsInsertedSpy.count(), 0);
1880     QCOMPARE(dataChangedSpy.count(), 0);
1881     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1882     QCOMPARE(newEntryInListSpy.count(), 0);
1883 
1884     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1885 
1886     connect(&myListener, &TracksListener::trackHasChanged,
1887             &myPlayList, &MediaPlayList::trackChanged,
1888             Qt::QueuedConnection);
1889     connect(&myListener, &TracksListener::tracksListAdded,
1890             &myPlayList, &MediaPlayList::tracksListAdded,
1891             Qt::QueuedConnection);
1892     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1893             &myListener, &TracksListener::trackByNameInList,
1894             Qt::QueuedConnection);
1895     connect(&myPlayList, &MediaPlayList::newEntryInList,
1896             &myListener, &TracksListener::newEntryInList,
1897             Qt::QueuedConnection);
1898     connect(&myPlayList, &MediaPlayList::newUrlInList,
1899             &myListener, &TracksListener::newUrlInList,
1900             Qt::QueuedConnection);
1901     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1902             &myListener, &TracksListener::tracksAdded);
1903 
1904     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1905 
1906     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1907     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1908     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1909     QCOMPARE(rowsRemovedSpy.count(), 0);
1910     QCOMPARE(rowsMovedSpy.count(), 0);
1911     QCOMPARE(rowsInsertedSpy.count(), 0);
1912     QCOMPARE(dataChangedSpy.count(), 0);
1913     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1914     QCOMPARE(newEntryInListSpy.count(), 0);
1915 
1916     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1917     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1918 
1919     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1920     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1921     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1922     QCOMPARE(rowsRemovedSpy.count(), 0);
1923     QCOMPARE(rowsMovedSpy.count(), 0);
1924     QCOMPARE(rowsInsertedSpy.count(), 1);
1925     QCOMPARE(dataChangedSpy.count(), 0);
1926     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1927     QCOMPARE(newEntryInListSpy.count(), 1);
1928 
1929     QCOMPARE(dataChangedSpy.wait(), true);
1930 
1931     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1932     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1933     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1934     QCOMPARE(rowsRemovedSpy.count(), 0);
1935     QCOMPARE(rowsMovedSpy.count(), 0);
1936     QCOMPARE(rowsInsertedSpy.count(), 1);
1937     QCOMPARE(dataChangedSpy.count(), 1);
1938     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1939     QCOMPARE(newEntryInListSpy.count(), 1);
1940 
1941     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1942     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1943 
1944     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1945     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1946     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1947     QCOMPARE(rowsRemovedSpy.count(), 0);
1948     QCOMPARE(rowsMovedSpy.count(), 0);
1949     QCOMPARE(rowsInsertedSpy.count(), 2);
1950     QCOMPARE(dataChangedSpy.count(), 1);
1951     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1952     QCOMPARE(newEntryInListSpy.count(), 2);
1953 
1954     QCOMPARE(dataChangedSpy.wait(), true);
1955 
1956     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1957     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1958     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1959     QCOMPARE(rowsRemovedSpy.count(), 0);
1960     QCOMPARE(rowsMovedSpy.count(), 0);
1961     QCOMPARE(rowsInsertedSpy.count(), 2);
1962     QCOMPARE(dataChangedSpy.count(), 2);
1963     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1964     QCOMPARE(newEntryInListSpy.count(), 2);
1965 
1966     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1967     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1968 
1969     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1970     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1971     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1972     QCOMPARE(rowsRemovedSpy.count(), 0);
1973     QCOMPARE(rowsMovedSpy.count(), 0);
1974     QCOMPARE(rowsInsertedSpy.count(), 3);
1975     QCOMPARE(dataChangedSpy.count(), 2);
1976     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1977     QCOMPARE(newEntryInListSpy.count(), 3);
1978 
1979     QCOMPARE(dataChangedSpy.wait(), true);
1980 
1981     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1982     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1983     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1984     QCOMPARE(rowsRemovedSpy.count(), 0);
1985     QCOMPARE(rowsMovedSpy.count(), 0);
1986     QCOMPARE(rowsInsertedSpy.count(), 3);
1987     QCOMPARE(dataChangedSpy.count(), 3);
1988     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1989     QCOMPARE(newEntryInListSpy.count(), 3);
1990 
1991     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
1992     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1993 
1994     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1995     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1996     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1997     QCOMPARE(rowsRemovedSpy.count(), 0);
1998     QCOMPARE(rowsMovedSpy.count(), 0);
1999     QCOMPARE(rowsInsertedSpy.count(), 4);
2000     QCOMPARE(dataChangedSpy.count(), 3);
2001     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2002     QCOMPARE(newEntryInListSpy.count(), 4);
2003 
2004     QCOMPARE(dataChangedSpy.wait(), true);
2005 
2006     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2007     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2008     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2009     QCOMPARE(rowsRemovedSpy.count(), 0);
2010     QCOMPARE(rowsMovedSpy.count(), 0);
2011     QCOMPARE(rowsInsertedSpy.count(), 4);
2012     QCOMPARE(dataChangedSpy.count(), 4);
2013     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2014     QCOMPARE(newEntryInListSpy.count(), 4);
2015 
2016     myPlayList.moveRows({}, 0, 1, {}, 3);
2017 
2018     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2019     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2020     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2021     QCOMPARE(rowsRemovedSpy.count(), 0);
2022     QCOMPARE(rowsMovedSpy.count(), 1);
2023     QCOMPARE(rowsInsertedSpy.count(), 4);
2024     QCOMPARE(dataChangedSpy.count(), 4);
2025     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2026     QCOMPARE(newEntryInListSpy.count(), 4);
2027 }
2028 
2029 void MediaPlayListTest::testHasHeaderMoveAnother()
2030 {
2031     MediaPlayList myPlayList;
2032     QAbstractItemModelTester testModel(&myPlayList);
2033     DatabaseInterface myDatabaseContent;
2034     TracksListener myListener(&myDatabaseContent);
2035 
2036     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2037     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2038     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2039     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2040     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2041     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2042     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2043     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2044     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2045     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2046 
2047     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2048     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2049     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2050     QCOMPARE(rowsRemovedSpy.count(), 0);
2051     QCOMPARE(rowsMovedSpy.count(), 0);
2052     QCOMPARE(rowsInsertedSpy.count(), 0);
2053     QCOMPARE(dataChangedSpy.count(), 0);
2054     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2055     QCOMPARE(newEntryInListSpy.count(), 0);
2056 
2057     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2058 
2059     connect(&myListener, &TracksListener::trackHasChanged,
2060             &myPlayList, &MediaPlayList::trackChanged,
2061             Qt::QueuedConnection);
2062     connect(&myListener, &TracksListener::tracksListAdded,
2063             &myPlayList, &MediaPlayList::tracksListAdded,
2064             Qt::QueuedConnection);
2065     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2066             &myListener, &TracksListener::trackByNameInList,
2067             Qt::QueuedConnection);
2068     connect(&myPlayList, &MediaPlayList::newEntryInList,
2069             &myListener, &TracksListener::newEntryInList,
2070             Qt::QueuedConnection);
2071     connect(&myPlayList, &MediaPlayList::newUrlInList,
2072             &myListener, &TracksListener::newUrlInList,
2073             Qt::QueuedConnection);
2074     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2075             &myListener, &TracksListener::tracksAdded);
2076 
2077     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2078 
2079     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2080     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2081     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2082     QCOMPARE(rowsRemovedSpy.count(), 0);
2083     QCOMPARE(rowsMovedSpy.count(), 0);
2084     QCOMPARE(rowsInsertedSpy.count(), 0);
2085     QCOMPARE(dataChangedSpy.count(), 0);
2086     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2087     QCOMPARE(newEntryInListSpy.count(), 0);
2088 
2089     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
2090     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2091 
2092     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2093     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2094     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2095     QCOMPARE(rowsRemovedSpy.count(), 0);
2096     QCOMPARE(rowsMovedSpy.count(), 0);
2097     QCOMPARE(rowsInsertedSpy.count(), 1);
2098     QCOMPARE(dataChangedSpy.count(), 0);
2099     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2100     QCOMPARE(newEntryInListSpy.count(), 1);
2101 
2102     QCOMPARE(dataChangedSpy.wait(), true);
2103 
2104     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2105     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2106     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2107     QCOMPARE(rowsRemovedSpy.count(), 0);
2108     QCOMPARE(rowsMovedSpy.count(), 0);
2109     QCOMPARE(rowsInsertedSpy.count(), 1);
2110     QCOMPARE(dataChangedSpy.count(), 1);
2111     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2112     QCOMPARE(newEntryInListSpy.count(), 1);
2113 
2114     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
2115     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2116 
2117     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2118     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2119     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2120     QCOMPARE(rowsRemovedSpy.count(), 0);
2121     QCOMPARE(rowsMovedSpy.count(), 0);
2122     QCOMPARE(rowsInsertedSpy.count(), 2);
2123     QCOMPARE(dataChangedSpy.count(), 1);
2124     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2125     QCOMPARE(newEntryInListSpy.count(), 2);
2126 
2127     QCOMPARE(dataChangedSpy.wait(), true);
2128 
2129     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2130     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2131     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2132     QCOMPARE(rowsRemovedSpy.count(), 0);
2133     QCOMPARE(rowsMovedSpy.count(), 0);
2134     QCOMPARE(rowsInsertedSpy.count(), 2);
2135     QCOMPARE(dataChangedSpy.count(), 2);
2136     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2137     QCOMPARE(newEntryInListSpy.count(), 2);
2138 
2139     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
2140     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2141 
2142     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2143     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2144     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2145     QCOMPARE(rowsRemovedSpy.count(), 0);
2146     QCOMPARE(rowsMovedSpy.count(), 0);
2147     QCOMPARE(rowsInsertedSpy.count(), 3);
2148     QCOMPARE(dataChangedSpy.count(), 2);
2149     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2150     QCOMPARE(newEntryInListSpy.count(), 3);
2151 
2152     QCOMPARE(dataChangedSpy.wait(), true);
2153 
2154     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2155     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2156     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2157     QCOMPARE(rowsRemovedSpy.count(), 0);
2158     QCOMPARE(rowsMovedSpy.count(), 0);
2159     QCOMPARE(rowsInsertedSpy.count(), 3);
2160     QCOMPARE(dataChangedSpy.count(), 3);
2161     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2162     QCOMPARE(newEntryInListSpy.count(), 3);
2163 
2164     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
2165     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2166 
2167     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2168     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2169     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2170     QCOMPARE(rowsRemovedSpy.count(), 0);
2171     QCOMPARE(rowsMovedSpy.count(), 0);
2172     QCOMPARE(rowsInsertedSpy.count(), 4);
2173     QCOMPARE(dataChangedSpy.count(), 3);
2174     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2175     QCOMPARE(newEntryInListSpy.count(), 4);
2176 
2177     QCOMPARE(dataChangedSpy.wait(), true);
2178 
2179     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2180     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2181     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2182     QCOMPARE(rowsRemovedSpy.count(), 0);
2183     QCOMPARE(rowsMovedSpy.count(), 0);
2184     QCOMPARE(rowsInsertedSpy.count(), 4);
2185     QCOMPARE(dataChangedSpy.count(), 4);
2186     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2187     QCOMPARE(newEntryInListSpy.count(), 4);
2188 
2189     myPlayList.moveRows({}, 3, 1, {}, 0);
2190 
2191     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2192     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2193     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2194     QCOMPARE(rowsRemovedSpy.count(), 0);
2195     QCOMPARE(rowsMovedSpy.count(), 1);
2196     QCOMPARE(rowsInsertedSpy.count(), 4);
2197     QCOMPARE(dataChangedSpy.count(), 4);
2198     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2199     QCOMPARE(newEntryInListSpy.count(), 4);
2200 }
2201 
2202 void MediaPlayListTest::restoreMultipleIdenticalTracks()
2203 {
2204     MediaPlayList myPlayList;
2205     QAbstractItemModelTester testModel(&myPlayList);
2206     DatabaseInterface myDatabaseContent;
2207     TracksListener myListener(&myDatabaseContent);
2208 
2209     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2210     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2211     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2212     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2213     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2214     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2215     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2216     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2217     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2218     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2219 
2220     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2221     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2222     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2223     QCOMPARE(rowsRemovedSpy.count(), 0);
2224     QCOMPARE(rowsMovedSpy.count(), 0);
2225     QCOMPARE(rowsInsertedSpy.count(), 0);
2226     QCOMPARE(dataChangedSpy.count(), 0);
2227     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2228     QCOMPARE(newEntryInListSpy.count(), 0);
2229 
2230     myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore"));
2231 
2232     connect(&myListener, &TracksListener::trackHasChanged,
2233             &myPlayList, &MediaPlayList::trackChanged,
2234             Qt::QueuedConnection);
2235     connect(&myListener, &TracksListener::tracksListAdded,
2236             &myPlayList, &MediaPlayList::tracksListAdded,
2237             Qt::QueuedConnection);
2238     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2239             &myListener, &TracksListener::trackByNameInList,
2240             Qt::QueuedConnection);
2241     connect(&myPlayList, &MediaPlayList::newEntryInList,
2242             &myListener, &TracksListener::newEntryInList,
2243             Qt::QueuedConnection);
2244     connect(&myPlayList, &MediaPlayList::newUrlInList,
2245             &myListener, &TracksListener::newUrlInList,
2246             Qt::QueuedConnection);
2247     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2248             &myListener, &TracksListener::tracksAdded);
2249 
2250     myPlayList.enqueueRestoredEntries(
2251                 QVariantList({QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}),
2252                               QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}),
2253                               QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}),
2254                               QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}})
2255                              }));
2256 
2257     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2258     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2259     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2260     QCOMPARE(rowsRemovedSpy.count(), 0);
2261     QCOMPARE(rowsMovedSpy.count(), 0);
2262     QCOMPARE(rowsInsertedSpy.count(), 1);
2263     QCOMPARE(dataChangedSpy.count(), 0);
2264     QCOMPARE(newTrackByNameInListSpy.count(), 4);
2265     QCOMPARE(newEntryInListSpy.count(), 0);
2266 
2267     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2268 
2269     QCOMPARE(dataChangedSpy.wait(), true);
2270 
2271     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2272     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2273     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2274     QCOMPARE(rowsRemovedSpy.count(), 0);
2275     QCOMPARE(rowsMovedSpy.count(), 0);
2276     QCOMPARE(rowsInsertedSpy.count(), 1);
2277     QCOMPARE(dataChangedSpy.count(), 4);
2278     QCOMPARE(newTrackByNameInListSpy.count(), 4);
2279     QCOMPARE(newEntryInListSpy.count(), 0);
2280 
2281     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2282     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2283     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2284     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2285     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2286     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2287     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2288     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2289     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2290     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2291     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2292     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2293     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2294     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2295     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2296     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2297     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2298     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2299     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2300     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2301     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2302     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2303     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2304     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2305 }
2306 
2307 void MediaPlayListTest::restoreTrackWithoutAlbum()
2308 {
2309     QTemporaryFile databaseFile;
2310     databaseFile.open();
2311 
2312     qDebug() << "restoreTrackWithoutAlbum" << databaseFile.fileName();
2313 
2314     MediaPlayList myPlayList;
2315     QAbstractItemModelTester testModel(&myPlayList);
2316     DatabaseInterface myDatabaseContent;
2317     TracksListener myListener(&myDatabaseContent);
2318 
2319     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2320     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2321     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2322     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2323     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2324     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2325     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2326     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2327     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2328     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2329 
2330     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2331     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2332     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2333     QCOMPARE(rowsRemovedSpy.count(), 0);
2334     QCOMPARE(rowsMovedSpy.count(), 0);
2335     QCOMPARE(rowsInsertedSpy.count(), 0);
2336     QCOMPARE(dataChangedSpy.count(), 0);
2337     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2338     QCOMPARE(newEntryInListSpy.count(), 0);
2339 
2340     myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), databaseFile.fileName());
2341 
2342     connect(&myListener, &TracksListener::trackHasChanged,
2343             &myPlayList, &MediaPlayList::trackChanged,
2344             Qt::QueuedConnection);
2345     connect(&myListener, &TracksListener::tracksListAdded,
2346             &myPlayList, &MediaPlayList::tracksListAdded,
2347             Qt::QueuedConnection);
2348     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2349             &myListener, &TracksListener::trackByNameInList,
2350             Qt::QueuedConnection);
2351     connect(&myPlayList, &MediaPlayList::newEntryInList,
2352             &myListener, &TracksListener::newEntryInList,
2353             Qt::QueuedConnection);
2354     connect(&myPlayList, &MediaPlayList::newUrlInList,
2355             &myListener, &TracksListener::newUrlInList,
2356             Qt::QueuedConnection);
2357     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2358             &myListener, &TracksListener::tracksAdded);
2359 
2360     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2361 
2362     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2363     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2364     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2365     QCOMPARE(rowsRemovedSpy.count(), 0);
2366     QCOMPARE(rowsMovedSpy.count(), 0);
2367     QCOMPARE(rowsInsertedSpy.count(), 0);
2368     QCOMPARE(dataChangedSpy.count(), 0);
2369     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2370     QCOMPARE(newEntryInListSpy.count(), 0);
2371 
2372     auto newTrack = DataTypes::TrackDataType{};
2373 
2374     newTrack[DataTypes::IdRole] = QStringLiteral("$29");
2375     newTrack[DataTypes::ParentIdRole] = QStringLiteral("0");
2376     newTrack[DataTypes::TitleRole] = QStringLiteral("track19");
2377     newTrack[DataTypes::ArtistRole] = QStringLiteral("artist2");
2378     newTrack[DataTypes::DurationRole] = QTime::fromMSecsSinceStartOfDay(29);
2379     newTrack[DataTypes::ResourceRole] = QUrl::fromLocalFile(QStringLiteral("/$29"));
2380     newTrack[DataTypes::FileModificationTime] = QDateTime::fromMSecsSinceEpoch(29);
2381     newTrack[DataTypes::ImageUrlRole] = QUrl::fromLocalFile(QStringLiteral("withoutAlbum"));
2382     newTrack[DataTypes::RatingRole] = 9;
2383     newTrack[DataTypes::IsSingleDiscAlbumRole] = true;
2384     newTrack[DataTypes::GenreRole] = QStringLiteral("genre1");
2385     newTrack[DataTypes::ComposerRole] = QStringLiteral("composer1");
2386     newTrack[DataTypes::LyricistRole] = QStringLiteral("lyricist1");
2387     newTrack[DataTypes::HasEmbeddedCover] = false;
2388     newTrack[DataTypes::ElementTypeRole] = ElisaUtils::Track;
2389 
2390     myDatabaseContent.insertTracksList({newTrack}, mNewCovers);
2391 
2392     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2393     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2394     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2395     QCOMPARE(rowsRemovedSpy.count(), 0);
2396     QCOMPARE(rowsMovedSpy.count(), 0);
2397     QCOMPARE(rowsInsertedSpy.count(), 0);
2398     QCOMPARE(dataChangedSpy.count(), 0);
2399     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2400     QCOMPARE(newEntryInListSpy.count(), 0);
2401 
2402     myPlayList.enqueueRestoredEntries(QVariantList({QStringList({QStringLiteral("0"), QStringLiteral("track19"), QStringLiteral("artist2"), {}, {}, {}, QString::number(ElisaUtils::PlayListEntryType::Unknown)})}));
2403 
2404     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2405     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2406     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2407     QCOMPARE(rowsRemovedSpy.count(), 0);
2408     QCOMPARE(rowsMovedSpy.count(), 0);
2409     QCOMPARE(rowsInsertedSpy.count(), 1);
2410     QCOMPARE(dataChangedSpy.count(), 0);
2411     QCOMPARE(newTrackByNameInListSpy.count(), 1);
2412     QCOMPARE(newEntryInListSpy.count(), 0);
2413 
2414     QCOMPARE(dataChangedSpy.wait(), true);
2415 
2416     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2417     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2418     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2419     QCOMPARE(rowsRemovedSpy.count(), 0);
2420     QCOMPARE(rowsMovedSpy.count(), 0);
2421     QCOMPARE(rowsInsertedSpy.count(), 1);
2422     QCOMPARE(dataChangedSpy.count(), 1);
2423     QCOMPARE(newTrackByNameInListSpy.count(), 1);
2424     QCOMPARE(newEntryInListSpy.count(), 0);
2425 
2426     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track19"));
2427     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QString());
2428     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
2429     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 0);
2430     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 0);
2431     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 29);
2432 }
2433 
2434 void MediaPlayListTest::restoreLocalTrack()
2435 {
2436     QTemporaryFile databaseFile;
2437     databaseFile.open();
2438 
2439     qDebug() << "restoreLocalTrack" << databaseFile.fileName();
2440 
2441     MediaPlayList myPlayList;
2442     QAbstractItemModelTester testModel(&myPlayList);
2443     DatabaseInterface myDatabaseContent;
2444     TracksListener myListener(&myDatabaseContent);
2445 
2446     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2447     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2448     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2449     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2450     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2451     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2452     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2453     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2454     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2455     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2456 
2457     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2458     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2459     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2460     QCOMPARE(rowsRemovedSpy.count(), 0);
2461     QCOMPARE(rowsMovedSpy.count(), 0);
2462     QCOMPARE(rowsInsertedSpy.count(), 0);
2463     QCOMPARE(dataChangedSpy.count(), 0);
2464     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2465     QCOMPARE(newEntryInListSpy.count(), 0);
2466 
2467     myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), databaseFile.fileName());
2468 
2469     connect(&myListener, &TracksListener::trackHasChanged,
2470             &myPlayList, &MediaPlayList::trackChanged,
2471             Qt::QueuedConnection);
2472     connect(&myListener, &TracksListener::tracksListAdded,
2473             &myPlayList, &MediaPlayList::tracksListAdded,
2474             Qt::QueuedConnection);
2475     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2476             &myListener, &TracksListener::trackByNameInList,
2477             Qt::QueuedConnection);
2478     connect(&myPlayList, &MediaPlayList::newEntryInList,
2479             &myListener, &TracksListener::newEntryInList,
2480             Qt::QueuedConnection);
2481     connect(&myPlayList, &MediaPlayList::newUrlInList,
2482             &myListener, &TracksListener::newUrlInList,
2483             Qt::QueuedConnection);
2484     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2485             &myListener, &TracksListener::tracksAdded);
2486 
2487     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2488 
2489     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2490     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2491     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2492     QCOMPARE(rowsRemovedSpy.count(), 0);
2493     QCOMPARE(rowsMovedSpy.count(), 0);
2494     QCOMPARE(rowsInsertedSpy.count(), 0);
2495     QCOMPARE(dataChangedSpy.count(), 0);
2496     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2497     QCOMPARE(newEntryInListSpy.count(), 0);
2498 
2499     myPlayList.enqueueRestoredEntries(QVariantList({QStringList({{},
2500                                                                  QStringLiteral("Title"),
2501                                                                  QStringLiteral("Artist"),
2502                                                                  QStringLiteral("Test"),
2503                                                                  {},
2504                                                                  {},
2505                                                                  QString::number(ElisaUtils::PlayListEntryType::Unknown),
2506                                                                  QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg")).toString()})}));
2507 
2508     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2509     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2510     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2511     QCOMPARE(rowsRemovedSpy.count(), 0);
2512     QCOMPARE(rowsMovedSpy.count(), 0);
2513     QCOMPARE(rowsInsertedSpy.count(), 1);
2514     QCOMPARE(dataChangedSpy.count(), 0);
2515     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2516     QCOMPARE(newEntryInListSpy.count(), 1);
2517 
2518     QCOMPARE(dataChangedSpy.wait(), true);
2519 
2520     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2521     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2522     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2523     QCOMPARE(rowsRemovedSpy.count(), 0);
2524     QCOMPARE(rowsMovedSpy.count(), 0);
2525     QCOMPARE(rowsInsertedSpy.count(), 1);
2526     QCOMPARE(dataChangedSpy.count(), 1);
2527     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2528     QCOMPARE(newEntryInListSpy.count(), 1);
2529 
2530     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
2531     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
2532     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
2533     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2534     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2535     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
2536     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::IsValidRole).toBool(), true);
2537 }
2538 
2539 void MediaPlayListTest::testHasHeaderAlbumWithSameTitle()
2540 {
2541     MediaPlayList myPlayList;
2542     QAbstractItemModelTester testModel(&myPlayList);
2543     DatabaseInterface myDatabaseContent;
2544     TracksListener myListener(&myDatabaseContent);
2545 
2546     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2547     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2548     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2549     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2550     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2551     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2552     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2553     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2554     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2555     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2556 
2557     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2558     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2559     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2560     QCOMPARE(rowsRemovedSpy.count(), 0);
2561     QCOMPARE(rowsMovedSpy.count(), 0);
2562     QCOMPARE(rowsInsertedSpy.count(), 0);
2563     QCOMPARE(dataChangedSpy.count(), 0);
2564     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2565     QCOMPARE(newEntryInListSpy.count(), 0);
2566 
2567     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2568 
2569     connect(&myListener, &TracksListener::trackHasChanged,
2570             &myPlayList, &MediaPlayList::trackChanged,
2571             Qt::QueuedConnection);
2572     connect(&myListener, &TracksListener::tracksListAdded,
2573             &myPlayList, &MediaPlayList::tracksListAdded,
2574             Qt::QueuedConnection);
2575     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2576             &myListener, &TracksListener::trackByNameInList,
2577             Qt::QueuedConnection);
2578     connect(&myPlayList, &MediaPlayList::newEntryInList,
2579             &myListener, &TracksListener::newEntryInList,
2580             Qt::QueuedConnection);
2581     connect(&myPlayList, &MediaPlayList::newUrlInList,
2582             &myListener, &TracksListener::newUrlInList,
2583             Qt::QueuedConnection);
2584     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2585             &myListener, &TracksListener::tracksAdded);
2586 
2587     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2588 
2589     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2590     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2591     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2592     QCOMPARE(rowsRemovedSpy.count(), 0);
2593     QCOMPARE(rowsMovedSpy.count(), 0);
2594     QCOMPARE(rowsInsertedSpy.count(), 0);
2595     QCOMPARE(dataChangedSpy.count(), 0);
2596     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2597     QCOMPARE(newEntryInListSpy.count(), 0);
2598 
2599     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
2600                                                                                QStringLiteral("album3"), 1, 1);
2601     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2602 
2603     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2604     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2605     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2606     QCOMPARE(rowsRemovedSpy.count(), 0);
2607     QCOMPARE(rowsMovedSpy.count(), 0);
2608     QCOMPARE(rowsInsertedSpy.count(), 1);
2609     QCOMPARE(dataChangedSpy.count(), 0);
2610     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2611     QCOMPARE(newEntryInListSpy.count(), 1);
2612 
2613     QCOMPARE(dataChangedSpy.wait(), true);
2614 
2615     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2616     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2617     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2618     QCOMPARE(rowsRemovedSpy.count(), 0);
2619     QCOMPARE(rowsMovedSpy.count(), 0);
2620     QCOMPARE(rowsInsertedSpy.count(), 1);
2621     QCOMPARE(dataChangedSpy.count(), 1);
2622     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2623     QCOMPARE(newEntryInListSpy.count(), 1);
2624 
2625     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2626                                                                                 QStringLiteral("album1"), 1, 1);
2627     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2628 
2629     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2630     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2631     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2632     QCOMPARE(rowsRemovedSpy.count(), 0);
2633     QCOMPARE(rowsMovedSpy.count(), 0);
2634     QCOMPARE(rowsInsertedSpy.count(), 2);
2635     QCOMPARE(dataChangedSpy.count(), 1);
2636     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2637     QCOMPARE(newEntryInListSpy.count(), 2);
2638 
2639     QCOMPARE(dataChangedSpy.wait(), true);
2640 
2641     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2642     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2643     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2644     QCOMPARE(rowsRemovedSpy.count(), 0);
2645     QCOMPARE(rowsMovedSpy.count(), 0);
2646     QCOMPARE(rowsInsertedSpy.count(), 2);
2647     QCOMPARE(dataChangedSpy.count(), 2);
2648     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2649     QCOMPARE(newEntryInListSpy.count(), 2);
2650 
2651     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
2652                                                                                QStringLiteral("album3"), 2, 1);
2653     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2654 
2655     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2656     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2657     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2658     QCOMPARE(rowsRemovedSpy.count(), 0);
2659     QCOMPARE(rowsMovedSpy.count(), 0);
2660     QCOMPARE(rowsInsertedSpy.count(), 3);
2661     QCOMPARE(dataChangedSpy.count(), 2);
2662     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2663     QCOMPARE(newEntryInListSpy.count(), 3);
2664 
2665     QCOMPARE(dataChangedSpy.wait(), true);
2666 
2667     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2668     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2669     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2670     QCOMPARE(rowsRemovedSpy.count(), 0);
2671     QCOMPARE(rowsMovedSpy.count(), 0);
2672     QCOMPARE(rowsInsertedSpy.count(), 3);
2673     QCOMPARE(dataChangedSpy.count(), 3);
2674     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2675     QCOMPARE(newEntryInListSpy.count(), 3);
2676 
2677     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
2678                                                                                 QStringLiteral("album3"), 3, 1);
2679     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2680 
2681     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2682     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2683     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2684     QCOMPARE(rowsRemovedSpy.count(), 0);
2685     QCOMPARE(rowsMovedSpy.count(), 0);
2686     QCOMPARE(rowsInsertedSpy.count(), 4);
2687     QCOMPARE(dataChangedSpy.count(), 3);
2688     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2689     QCOMPARE(newEntryInListSpy.count(), 4);
2690 
2691     QCOMPARE(dataChangedSpy.wait(), true);
2692 
2693     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2694     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2695     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2696     QCOMPARE(rowsRemovedSpy.count(), 0);
2697     QCOMPARE(rowsMovedSpy.count(), 0);
2698     QCOMPARE(rowsInsertedSpy.count(), 4);
2699     QCOMPARE(dataChangedSpy.count(), 4);
2700     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2701     QCOMPARE(newEntryInListSpy.count(), 4);
2702 
2703     auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"),
2704                                                                               QStringLiteral("album3"), 9, 1);
2705     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fithTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2706 
2707     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2708     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2709     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
2710     QCOMPARE(rowsRemovedSpy.count(), 0);
2711     QCOMPARE(rowsMovedSpy.count(), 0);
2712     QCOMPARE(rowsInsertedSpy.count(), 5);
2713     QCOMPARE(dataChangedSpy.count(), 4);
2714     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2715     QCOMPARE(newEntryInListSpy.count(), 5);
2716 
2717     QCOMPARE(dataChangedSpy.wait(), true);
2718 
2719     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2720     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2721     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
2722     QCOMPARE(rowsRemovedSpy.count(), 0);
2723     QCOMPARE(rowsMovedSpy.count(), 0);
2724     QCOMPARE(rowsInsertedSpy.count(), 5);
2725     QCOMPARE(dataChangedSpy.count(), 5);
2726     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2727     QCOMPARE(newEntryInListSpy.count(), 5);
2728 
2729     auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"),
2730                                                                                QStringLiteral("album3"), 1, 1);
2731     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, sixthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2732 
2733     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2734     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2735     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
2736     QCOMPARE(rowsRemovedSpy.count(), 0);
2737     QCOMPARE(rowsMovedSpy.count(), 0);
2738     QCOMPARE(rowsInsertedSpy.count(), 6);
2739     QCOMPARE(dataChangedSpy.count(), 5);
2740     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2741     QCOMPARE(newEntryInListSpy.count(), 6);
2742 
2743     QCOMPARE(dataChangedSpy.wait(), true);
2744 
2745     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2746     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2747     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
2748     QCOMPARE(rowsRemovedSpy.count(), 0);
2749     QCOMPARE(rowsMovedSpy.count(), 0);
2750     QCOMPARE(rowsInsertedSpy.count(), 6);
2751     QCOMPARE(dataChangedSpy.count(), 6);
2752     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2753     QCOMPARE(newEntryInListSpy.count(), 6);
2754 }
2755 
2756 void MediaPlayListTest::testHasHeaderMoveFirstLikeQml()
2757 {
2758     MediaPlayList myPlayList;
2759     QAbstractItemModelTester testModel(&myPlayList);
2760     DatabaseInterface myDatabaseContent;
2761     TracksListener myListener(&myDatabaseContent);
2762 
2763     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2764     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2765     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2766     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2767     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2768     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2769     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2770     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2771     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2772     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2773 
2774     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2775     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2776     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2777     QCOMPARE(rowsRemovedSpy.count(), 0);
2778     QCOMPARE(rowsMovedSpy.count(), 0);
2779     QCOMPARE(rowsInsertedSpy.count(), 0);
2780     QCOMPARE(dataChangedSpy.count(), 0);
2781     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2782     QCOMPARE(newEntryInListSpy.count(), 0);
2783 
2784     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2785 
2786     connect(&myListener, &TracksListener::trackHasChanged,
2787             &myPlayList, &MediaPlayList::trackChanged,
2788             Qt::QueuedConnection);
2789     connect(&myListener, &TracksListener::tracksListAdded,
2790             &myPlayList, &MediaPlayList::tracksListAdded,
2791             Qt::QueuedConnection);
2792     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2793             &myListener, &TracksListener::trackByNameInList,
2794             Qt::QueuedConnection);
2795     connect(&myPlayList, &MediaPlayList::newEntryInList,
2796             &myListener, &TracksListener::newEntryInList,
2797             Qt::QueuedConnection);
2798     connect(&myPlayList, &MediaPlayList::newUrlInList,
2799             &myListener, &TracksListener::newUrlInList,
2800             Qt::QueuedConnection);
2801     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2802             &myListener, &TracksListener::tracksAdded);
2803 
2804     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2805 
2806     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2807     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2808     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2809     QCOMPARE(rowsRemovedSpy.count(), 0);
2810     QCOMPARE(rowsMovedSpy.count(), 0);
2811     QCOMPARE(rowsInsertedSpy.count(), 0);
2812     QCOMPARE(dataChangedSpy.count(), 0);
2813     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2814     QCOMPARE(newEntryInListSpy.count(), 0);
2815 
2816     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
2817     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2818 
2819     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2820     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2821     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2822     QCOMPARE(rowsRemovedSpy.count(), 0);
2823     QCOMPARE(rowsMovedSpy.count(), 0);
2824     QCOMPARE(rowsInsertedSpy.count(), 1);
2825     QCOMPARE(dataChangedSpy.count(), 0);
2826     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2827     QCOMPARE(newEntryInListSpy.count(), 1);
2828 
2829     QCOMPARE(dataChangedSpy.wait(), true);
2830 
2831     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2832     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2833     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2834     QCOMPARE(rowsRemovedSpy.count(), 0);
2835     QCOMPARE(rowsMovedSpy.count(), 0);
2836     QCOMPARE(rowsInsertedSpy.count(), 1);
2837     QCOMPARE(dataChangedSpy.count(), 1);
2838     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2839     QCOMPARE(newEntryInListSpy.count(), 1);
2840 
2841     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
2842     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2843 
2844     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2845     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2846     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2847     QCOMPARE(rowsRemovedSpy.count(), 0);
2848     QCOMPARE(rowsMovedSpy.count(), 0);
2849     QCOMPARE(rowsInsertedSpy.count(), 2);
2850     QCOMPARE(dataChangedSpy.count(), 1);
2851     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2852     QCOMPARE(newEntryInListSpy.count(), 2);
2853 
2854     QCOMPARE(dataChangedSpy.wait(), true);
2855 
2856     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2857     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2858     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2859     QCOMPARE(rowsRemovedSpy.count(), 0);
2860     QCOMPARE(rowsMovedSpy.count(), 0);
2861     QCOMPARE(rowsInsertedSpy.count(), 2);
2862     QCOMPARE(dataChangedSpy.count(), 2);
2863     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2864     QCOMPARE(newEntryInListSpy.count(), 2);
2865 
2866     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
2867     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2868 
2869     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2870     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2871     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2872     QCOMPARE(rowsRemovedSpy.count(), 0);
2873     QCOMPARE(rowsMovedSpy.count(), 0);
2874     QCOMPARE(rowsInsertedSpy.count(), 3);
2875     QCOMPARE(dataChangedSpy.count(), 2);
2876     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2877     QCOMPARE(newEntryInListSpy.count(), 3);
2878 
2879     QCOMPARE(dataChangedSpy.wait(), true);
2880 
2881     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2882     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2883     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2884     QCOMPARE(rowsRemovedSpy.count(), 0);
2885     QCOMPARE(rowsMovedSpy.count(), 0);
2886     QCOMPARE(rowsInsertedSpy.count(), 3);
2887     QCOMPARE(dataChangedSpy.count(), 3);
2888     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2889     QCOMPARE(newEntryInListSpy.count(), 3);
2890 
2891     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
2892     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2893 
2894     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2895     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2896     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2897     QCOMPARE(rowsRemovedSpy.count(), 0);
2898     QCOMPARE(rowsMovedSpy.count(), 0);
2899     QCOMPARE(rowsInsertedSpy.count(), 4);
2900     QCOMPARE(dataChangedSpy.count(), 3);
2901     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2902     QCOMPARE(newEntryInListSpy.count(), 4);
2903 
2904     QCOMPARE(dataChangedSpy.wait(), true);
2905 
2906     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2907     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2908     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2909     QCOMPARE(rowsRemovedSpy.count(), 0);
2910     QCOMPARE(rowsMovedSpy.count(), 0);
2911     QCOMPARE(rowsInsertedSpy.count(), 4);
2912     QCOMPARE(dataChangedSpy.count(), 4);
2913     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2914     QCOMPARE(newEntryInListSpy.count(), 4);
2915 
2916     myPlayList.moveRows({}, 0, 1, {}, 3);
2917 
2918     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2919     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2920     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2921     QCOMPARE(rowsRemovedSpy.count(), 0);
2922     QCOMPARE(rowsMovedSpy.count(), 1);
2923     QCOMPARE(rowsInsertedSpy.count(), 4);
2924     QCOMPARE(dataChangedSpy.count(), 4);
2925     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2926     QCOMPARE(newEntryInListSpy.count(), 4);
2927 }
2928 
2929 void MediaPlayListTest::crashOnEnqueue()
2930 {
2931     MediaPlayList myPlayList;
2932     QAbstractItemModelTester testModel(&myPlayList);
2933     DatabaseInterface myDatabaseContent;
2934     TracksListener myListener(&myDatabaseContent);
2935     CrashEnqueuePlayList myCrash(&myPlayList);
2936 
2937     connect(&myPlayList, &MediaPlayList::rowsInserted, &myCrash, &CrashEnqueuePlayList::crashMediaPlayList);
2938 
2939     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2940     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2941     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2942     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2943     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2944     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2945     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2946     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2947     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2948     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2949 
2950     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2951     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2952     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2953     QCOMPARE(rowsRemovedSpy.count(), 0);
2954     QCOMPARE(rowsMovedSpy.count(), 0);
2955     QCOMPARE(rowsInsertedSpy.count(), 0);
2956     QCOMPARE(dataChangedSpy.count(), 0);
2957     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2958     QCOMPARE(newEntryInListSpy.count(), 0);
2959 
2960     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2961 
2962     connect(&myListener, &TracksListener::trackHasChanged,
2963             &myPlayList, &MediaPlayList::trackChanged,
2964             Qt::QueuedConnection);
2965     connect(&myListener, &TracksListener::tracksListAdded,
2966             &myPlayList, &MediaPlayList::tracksListAdded,
2967             Qt::QueuedConnection);
2968     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2969             &myListener, &TracksListener::trackByNameInList,
2970             Qt::QueuedConnection);
2971     connect(&myPlayList, &MediaPlayList::newEntryInList,
2972             &myListener, &TracksListener::newEntryInList,
2973             Qt::QueuedConnection);
2974     connect(&myPlayList, &MediaPlayList::newUrlInList,
2975             &myListener, &TracksListener::newUrlInList,
2976             Qt::QueuedConnection);
2977     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2978             &myListener, &TracksListener::tracksAdded);
2979 
2980     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2981 
2982     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2983     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2984     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2985     QCOMPARE(rowsRemovedSpy.count(), 0);
2986     QCOMPARE(rowsMovedSpy.count(), 0);
2987     QCOMPARE(rowsInsertedSpy.count(), 0);
2988     QCOMPARE(dataChangedSpy.count(), 0);
2989     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2990     QCOMPARE(newEntryInListSpy.count(), 0);
2991 
2992     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"),
2993                                                                              QStringLiteral("album2"), 6, 1);
2994     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2995 
2996     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2997     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2998     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2999     QCOMPARE(rowsRemovedSpy.count(), 0);
3000     QCOMPARE(rowsMovedSpy.count(), 0);
3001     QCOMPARE(rowsInsertedSpy.count(), 1);
3002     QCOMPARE(dataChangedSpy.count(), 0);
3003     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3004     QCOMPARE(newEntryInListSpy.count(), 1);
3005 
3006     QCOMPARE(dataChangedSpy.wait(), true);
3007 
3008     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3009     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3010     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3011     QCOMPARE(rowsRemovedSpy.count(), 0);
3012     QCOMPARE(rowsMovedSpy.count(), 0);
3013     QCOMPARE(rowsInsertedSpy.count(), 1);
3014     QCOMPARE(dataChangedSpy.count(), 1);
3015     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3016     QCOMPARE(newEntryInListSpy.count(), 1);
3017 }
3018 
3019 void MediaPlayListTest::testHasHeaderMoveAnotherLikeQml()
3020 {
3021     MediaPlayList myPlayList;
3022     QAbstractItemModelTester testModel(&myPlayList);
3023     DatabaseInterface myDatabaseContent;
3024     TracksListener myListener(&myDatabaseContent);
3025 
3026     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
3027     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
3028     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
3029     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
3030     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
3031     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
3032     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
3033     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3034     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3035     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3036 
3037     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3038     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3039     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3040     QCOMPARE(rowsRemovedSpy.count(), 0);
3041     QCOMPARE(rowsMovedSpy.count(), 0);
3042     QCOMPARE(rowsInsertedSpy.count(), 0);
3043     QCOMPARE(dataChangedSpy.count(), 0);
3044     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3045     QCOMPARE(newEntryInListSpy.count(), 0);
3046 
3047     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3048 
3049     connect(&myListener, &TracksListener::trackHasChanged,
3050             &myPlayList, &MediaPlayList::trackChanged,
3051             Qt::QueuedConnection);
3052     connect(&myListener, &TracksListener::tracksListAdded,
3053             &myPlayList, &MediaPlayList::tracksListAdded,
3054             Qt::QueuedConnection);
3055     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3056             &myListener, &TracksListener::trackByNameInList,
3057             Qt::QueuedConnection);
3058     connect(&myPlayList, &MediaPlayList::newEntryInList,
3059             &myListener, &TracksListener::newEntryInList,
3060             Qt::QueuedConnection);
3061     connect(&myPlayList, &MediaPlayList::newUrlInList,
3062             &myListener, &TracksListener::newUrlInList,
3063             Qt::QueuedConnection);
3064     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3065             &myListener, &TracksListener::tracksAdded);
3066 
3067     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3068 
3069     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3070     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3071     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3072     QCOMPARE(rowsRemovedSpy.count(), 0);
3073     QCOMPARE(rowsMovedSpy.count(), 0);
3074     QCOMPARE(rowsInsertedSpy.count(), 0);
3075     QCOMPARE(dataChangedSpy.count(), 0);
3076     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3077     QCOMPARE(newEntryInListSpy.count(), 0);
3078 
3079     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
3080     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3081 
3082     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3083     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3084     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3085     QCOMPARE(rowsRemovedSpy.count(), 0);
3086     QCOMPARE(rowsMovedSpy.count(), 0);
3087     QCOMPARE(rowsInsertedSpy.count(), 1);
3088     QCOMPARE(dataChangedSpy.count(), 0);
3089     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3090     QCOMPARE(newEntryInListSpy.count(), 1);
3091 
3092     QCOMPARE(dataChangedSpy.wait(), true);
3093 
3094     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3095     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3096     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3097     QCOMPARE(rowsRemovedSpy.count(), 0);
3098     QCOMPARE(rowsMovedSpy.count(), 0);
3099     QCOMPARE(rowsInsertedSpy.count(), 1);
3100     QCOMPARE(dataChangedSpy.count(), 1);
3101     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3102     QCOMPARE(newEntryInListSpy.count(), 1);
3103 
3104     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
3105     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3106 
3107     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3108     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3109     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3110     QCOMPARE(rowsRemovedSpy.count(), 0);
3111     QCOMPARE(rowsMovedSpy.count(), 0);
3112     QCOMPARE(rowsInsertedSpy.count(), 2);
3113     QCOMPARE(dataChangedSpy.count(), 1);
3114     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3115     QCOMPARE(newEntryInListSpy.count(), 2);
3116 
3117     QCOMPARE(dataChangedSpy.wait(), true);
3118 
3119     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3120     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3121     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3122     QCOMPARE(rowsRemovedSpy.count(), 0);
3123     QCOMPARE(rowsMovedSpy.count(), 0);
3124     QCOMPARE(rowsInsertedSpy.count(), 2);
3125     QCOMPARE(dataChangedSpy.count(), 2);
3126     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3127     QCOMPARE(newEntryInListSpy.count(), 2);
3128 
3129     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
3130     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3131 
3132     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3133     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3134     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3135     QCOMPARE(rowsRemovedSpy.count(), 0);
3136     QCOMPARE(rowsMovedSpy.count(), 0);
3137     QCOMPARE(rowsInsertedSpy.count(), 3);
3138     QCOMPARE(dataChangedSpy.count(), 2);
3139     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3140     QCOMPARE(newEntryInListSpy.count(), 3);
3141 
3142     QCOMPARE(dataChangedSpy.wait(), true);
3143 
3144     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3145     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3146     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3147     QCOMPARE(rowsRemovedSpy.count(), 0);
3148     QCOMPARE(rowsMovedSpy.count(), 0);
3149     QCOMPARE(rowsInsertedSpy.count(), 3);
3150     QCOMPARE(dataChangedSpy.count(), 3);
3151     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3152     QCOMPARE(newEntryInListSpy.count(), 3);
3153 
3154     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
3155     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3156 
3157     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3158     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3159     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3160     QCOMPARE(rowsRemovedSpy.count(), 0);
3161     QCOMPARE(rowsMovedSpy.count(), 0);
3162     QCOMPARE(rowsInsertedSpy.count(), 4);
3163     QCOMPARE(dataChangedSpy.count(), 3);
3164     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3165     QCOMPARE(newEntryInListSpy.count(), 4);
3166 
3167     QCOMPARE(dataChangedSpy.wait(), true);
3168 
3169     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3170     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3171     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3172     QCOMPARE(rowsRemovedSpy.count(), 0);
3173     QCOMPARE(rowsMovedSpy.count(), 0);
3174     QCOMPARE(rowsInsertedSpy.count(), 4);
3175     QCOMPARE(dataChangedSpy.count(), 4);
3176     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3177     QCOMPARE(newEntryInListSpy.count(), 4);
3178 
3179     myPlayList.moveRows({}, 3, 1, {}, 0);
3180 
3181     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3182     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
3183     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3184     QCOMPARE(rowsRemovedSpy.count(), 0);
3185     QCOMPARE(rowsMovedSpy.count(), 1);
3186     QCOMPARE(rowsInsertedSpy.count(), 4);
3187     QCOMPARE(dataChangedSpy.count(), 4);
3188     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3189     QCOMPARE(newEntryInListSpy.count(), 4);
3190 }
3191 
3192 void MediaPlayListTest::testHasHeaderYetAnotherMoveLikeQml()
3193 {
3194     MediaPlayList myPlayList;
3195     QAbstractItemModelTester testModel(&myPlayList);
3196     DatabaseInterface myDatabaseContent;
3197     TracksListener myListener(&myDatabaseContent);
3198 
3199     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
3200     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
3201     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
3202     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
3203     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
3204     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
3205     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
3206     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3207     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3208     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3209 
3210     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3211     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3212     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3213     QCOMPARE(rowsRemovedSpy.count(), 0);
3214     QCOMPARE(rowsMovedSpy.count(), 0);
3215     QCOMPARE(rowsInsertedSpy.count(), 0);
3216     QCOMPARE(dataChangedSpy.count(), 0);
3217     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3218     QCOMPARE(newEntryInListSpy.count(), 0);
3219 
3220     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3221 
3222     connect(&myListener, &TracksListener::trackHasChanged,
3223             &myPlayList, &MediaPlayList::trackChanged,
3224             Qt::QueuedConnection);
3225     connect(&myListener, &TracksListener::tracksListAdded,
3226             &myPlayList, &MediaPlayList::tracksListAdded,
3227             Qt::QueuedConnection);
3228     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3229             &myListener, &TracksListener::trackByNameInList,
3230             Qt::QueuedConnection);
3231     connect(&myPlayList, &MediaPlayList::newEntryInList,
3232             &myListener, &TracksListener::newEntryInList,
3233             Qt::QueuedConnection);
3234     connect(&myPlayList, &MediaPlayList::newUrlInList,
3235             &myListener, &TracksListener::newUrlInList,
3236             Qt::QueuedConnection);
3237     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3238             &myListener, &TracksListener::tracksAdded);
3239 
3240     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3241 
3242     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3243     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3244     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3245     QCOMPARE(rowsRemovedSpy.count(), 0);
3246     QCOMPARE(rowsMovedSpy.count(), 0);
3247     QCOMPARE(rowsInsertedSpy.count(), 0);
3248     QCOMPARE(dataChangedSpy.count(), 0);
3249     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3250     QCOMPARE(newEntryInListSpy.count(), 0);
3251 
3252     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
3253     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3254 
3255     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3256     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3257     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3258     QCOMPARE(rowsRemovedSpy.count(), 0);
3259     QCOMPARE(rowsMovedSpy.count(), 0);
3260     QCOMPARE(rowsInsertedSpy.count(), 1);
3261     QCOMPARE(dataChangedSpy.count(), 0);
3262     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3263     QCOMPARE(newEntryInListSpy.count(), 1);
3264 
3265     QCOMPARE(dataChangedSpy.wait(), true);
3266 
3267     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3268     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3269     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3270     QCOMPARE(rowsRemovedSpy.count(), 0);
3271     QCOMPARE(rowsMovedSpy.count(), 0);
3272     QCOMPARE(rowsInsertedSpy.count(), 1);
3273     QCOMPARE(dataChangedSpy.count(), 1);
3274     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3275     QCOMPARE(newEntryInListSpy.count(), 1);
3276 
3277     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
3278     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3279 
3280     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3281     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3282     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3283     QCOMPARE(rowsRemovedSpy.count(), 0);
3284     QCOMPARE(rowsMovedSpy.count(), 0);
3285     QCOMPARE(rowsInsertedSpy.count(), 2);
3286     QCOMPARE(dataChangedSpy.count(), 1);
3287     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3288     QCOMPARE(newEntryInListSpy.count(), 2);
3289 
3290     QCOMPARE(dataChangedSpy.wait(), true);
3291 
3292     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3293     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3294     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3295     QCOMPARE(rowsRemovedSpy.count(), 0);
3296     QCOMPARE(rowsMovedSpy.count(), 0);
3297     QCOMPARE(rowsInsertedSpy.count(), 2);
3298     QCOMPARE(dataChangedSpy.count(), 2);
3299     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3300     QCOMPARE(newEntryInListSpy.count(), 2);
3301 
3302     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
3303     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3304 
3305     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3306     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3307     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3308     QCOMPARE(rowsRemovedSpy.count(), 0);
3309     QCOMPARE(rowsMovedSpy.count(), 0);
3310     QCOMPARE(rowsInsertedSpy.count(), 3);
3311     QCOMPARE(dataChangedSpy.count(), 2);
3312     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3313     QCOMPARE(newEntryInListSpy.count(), 3);
3314 
3315     QCOMPARE(dataChangedSpy.wait(), true);
3316 
3317     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3318     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3319     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3320     QCOMPARE(rowsRemovedSpy.count(), 0);
3321     QCOMPARE(rowsMovedSpy.count(), 0);
3322     QCOMPARE(rowsInsertedSpy.count(), 3);
3323     QCOMPARE(dataChangedSpy.count(), 3);
3324     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3325     QCOMPARE(newEntryInListSpy.count(), 3);
3326 
3327     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
3328     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3329 
3330     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3331     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3332     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3333     QCOMPARE(rowsRemovedSpy.count(), 0);
3334     QCOMPARE(rowsMovedSpy.count(), 0);
3335     QCOMPARE(rowsInsertedSpy.count(), 4);
3336     QCOMPARE(dataChangedSpy.count(), 3);
3337     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3338     QCOMPARE(newEntryInListSpy.count(), 4);
3339 
3340     QCOMPARE(dataChangedSpy.wait(), true);
3341 
3342     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3343     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3344     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3345     QCOMPARE(rowsRemovedSpy.count(), 0);
3346     QCOMPARE(rowsMovedSpy.count(), 0);
3347     QCOMPARE(rowsInsertedSpy.count(), 4);
3348     QCOMPARE(dataChangedSpy.count(), 4);
3349     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3350     QCOMPARE(newEntryInListSpy.count(), 4);
3351 
3352     myPlayList.moveRows({}, 0, 1, {}, 2);
3353 
3354     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3355     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
3356     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3357     QCOMPARE(rowsRemovedSpy.count(), 0);
3358     QCOMPARE(rowsMovedSpy.count(), 1);
3359     QCOMPARE(rowsInsertedSpy.count(), 4);
3360     QCOMPARE(dataChangedSpy.count(), 4);
3361     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3362     QCOMPARE(newEntryInListSpy.count(), 4);
3363 
3364     myPlayList.moveRows({}, 2, 1, {}, 0);
3365 
3366     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3367     QCOMPARE(rowsAboutToBeMovedSpy.count(), 2);
3368     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3369     QCOMPARE(rowsRemovedSpy.count(), 0);
3370     QCOMPARE(rowsMovedSpy.count(), 2);
3371     QCOMPARE(rowsInsertedSpy.count(), 4);
3372     QCOMPARE(dataChangedSpy.count(), 4);
3373     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3374     QCOMPARE(newEntryInListSpy.count(), 4);
3375 }
3376 
3377 CrashEnqueuePlayList::CrashEnqueuePlayList(MediaPlayList *list, QObject *parent) : QObject(parent), mList(list)
3378 {
3379 }
3380 
3381 void CrashEnqueuePlayList::crashMediaPlayList()
3382 {
3383     mList->data(mList->index(0, 0), MediaPlayList::ResourceRole);
3384 }
3385 
3386 QTEST_GUILESS_MAIN(MediaPlayListTest)
3387 
3388 #include "moc_mediaplaylisttest.cpp"