1 /*
2    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
3 
4    SPDX-License-Identifier: LGPL-3.0-or-later
5  */
6 
7 #include "mediaplaylisttest.h"
8 #include "mediaplaylisttestconfig.h"
9 
10 #include "mediaplaylist.h"
11 #include "databaseinterface.h"
12 #include "trackslistener.h"
13 
14 #include "config-upnp-qt.h"
15 
16 #include <QtTest>
17 #include <QUrl>
18 #include <QTime>
19 #include <QTemporaryFile>
20 #include <QAbstractItemModelTester>
21 
MediaPlayListTest(QObject * parent)22 MediaPlayListTest::MediaPlayListTest(QObject *parent) : QObject(parent)
23 {
24 }
25 
initTestCase()26 void MediaPlayListTest::initTestCase()
27 {
28     qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
29     qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
30     qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
31     qRegisterMetaType<ElisaUtils::PlayListEntryType>("PlayListEntryType");
32 }
33 
simpleInitialCase()34 void MediaPlayListTest::simpleInitialCase()
35 {
36     MediaPlayList myPlayList;
37     QAbstractItemModelTester testModel(&myPlayList);
38     DatabaseInterface myDatabaseContent;
39     TracksListener myListener(&myDatabaseContent);
40 
41     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
42     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
43     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
44     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
45     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
46     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
47     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
48     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
49     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
50     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
51 
52     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
53     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
54     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
55     QCOMPARE(rowsRemovedSpy.count(), 0);
56     QCOMPARE(rowsMovedSpy.count(), 0);
57     QCOMPARE(rowsInsertedSpy.count(), 0);
58     QCOMPARE(dataChangedSpy.count(), 0);
59     QCOMPARE(newTrackByNameInListSpy.count(), 0);
60     QCOMPARE(newEntryInListSpy.count(), 0);
61 
62     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
63 
64     connect(&myListener, &TracksListener::trackHasChanged,
65             &myPlayList, &MediaPlayList::trackChanged,
66             Qt::QueuedConnection);
67     connect(&myListener, &TracksListener::tracksListAdded,
68             &myPlayList, &MediaPlayList::tracksListAdded,
69             Qt::QueuedConnection);
70     connect(&myPlayList, &MediaPlayList::newEntryInList,
71             &myListener, &TracksListener::newEntryInList,
72             Qt::QueuedConnection);
73     connect(&myPlayList, &MediaPlayList::newUrlInList,
74             &myListener, &TracksListener::newUrlInList,
75             Qt::QueuedConnection);
76     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
77             &myListener, &TracksListener::trackByNameInList,
78             Qt::QueuedConnection);
79     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
80             &myListener, &TracksListener::tracksAdded);
81 
82     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
83 
84     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
85     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
86     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
87     QCOMPARE(rowsRemovedSpy.count(), 0);
88     QCOMPARE(rowsMovedSpy.count(), 0);
89     QCOMPARE(rowsInsertedSpy.count(), 0);
90     QCOMPARE(dataChangedSpy.count(), 0);
91     QCOMPARE(newTrackByNameInListSpy.count(), 0);
92     QCOMPARE(newEntryInListSpy.count(), 0);
93 
94     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
95     auto newTrackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
96     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
97 
98     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
99     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
100     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
101     QCOMPARE(rowsRemovedSpy.count(), 0);
102     QCOMPARE(rowsMovedSpy.count(), 0);
103     QCOMPARE(rowsInsertedSpy.count(), 1);
104     QCOMPARE(dataChangedSpy.count(), 0);
105     QCOMPARE(newTrackByNameInListSpy.count(), 0);
106     QCOMPARE(newEntryInListSpy.count(), 1);
107 
108     QCOMPARE(dataChangedSpy.wait(), true);
109 
110     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
111     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
112     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
113     QCOMPARE(rowsRemovedSpy.count(), 0);
114     QCOMPARE(rowsMovedSpy.count(), 0);
115     QCOMPARE(rowsInsertedSpy.count(), 1);
116     QCOMPARE(dataChangedSpy.count(), 1);
117     QCOMPARE(newTrackByNameInListSpy.count(), 0);
118     QCOMPARE(newEntryInListSpy.count(), 1);
119 }
120 
enqueueAlbumCase()121 void MediaPlayListTest::enqueueAlbumCase()
122 {
123     MediaPlayList myPlayList;
124     QAbstractItemModelTester testModel(&myPlayList);
125     DatabaseInterface myDatabaseContent;
126     TracksListener myListener(&myDatabaseContent);
127 
128     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
129     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
130     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
131     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
132     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
133     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
134     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
135     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
136     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
137     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
138 
139     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
140     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
141     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
142     QCOMPARE(rowsRemovedSpy.count(), 0);
143     QCOMPARE(rowsMovedSpy.count(), 0);
144     QCOMPARE(rowsInsertedSpy.count(), 0);
145     QCOMPARE(dataChangedSpy.count(), 0);
146     QCOMPARE(newTrackByNameInListSpy.count(), 0);
147     QCOMPARE(newEntryInListSpy.count(), 0);
148 
149     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
150 
151     connect(&myListener, &TracksListener::trackHasChanged,
152             &myPlayList, &MediaPlayList::trackChanged,
153             Qt::QueuedConnection);
154     connect(&myListener, &TracksListener::tracksListAdded,
155             &myPlayList, &MediaPlayList::tracksListAdded,
156             Qt::QueuedConnection);
157     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
158             &myListener, &TracksListener::trackByNameInList,
159             Qt::QueuedConnection);
160     connect(&myPlayList, &MediaPlayList::newEntryInList,
161             &myListener, &TracksListener::newEntryInList,
162             Qt::QueuedConnection);
163     connect(&myPlayList, &MediaPlayList::newUrlInList,
164             &myListener, &TracksListener::newUrlInList,
165             Qt::QueuedConnection);
166     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
167             &myListener, &TracksListener::tracksAdded);
168 
169     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
170 
171     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
172     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
173     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
174     QCOMPARE(rowsRemovedSpy.count(), 0);
175     QCOMPARE(rowsMovedSpy.count(), 0);
176     QCOMPARE(rowsInsertedSpy.count(), 0);
177     QCOMPARE(dataChangedSpy.count(), 0);
178     QCOMPARE(newTrackByNameInListSpy.count(), 0);
179     QCOMPARE(newEntryInListSpy.count(), 0);
180 
181     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
182                         QStringLiteral("album2"), {}});
183 
184     QVERIFY(rowsAboutToBeRemovedSpy.wait());
185 
186     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
187     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
188     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
189     QCOMPARE(rowsRemovedSpy.count(), 1);
190     QCOMPARE(rowsMovedSpy.count(), 0);
191     QCOMPARE(rowsInsertedSpy.count(), 2);
192     QCOMPARE(dataChangedSpy.count(), 0);
193     QCOMPARE(newTrackByNameInListSpy.count(), 0);
194     QCOMPARE(newEntryInListSpy.count(), 1);
195 
196     QCOMPARE(myPlayList.rowCount(), 6);
197 
198     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
199     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
200     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
201     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
202     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
203     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
204     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
205     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
206     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
207     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
208     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
209     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
210     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
211     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
212     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
213     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
214     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
215     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
216     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
217     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
218     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
219     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
220     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
221     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
222     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
223     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
224     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
225     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
226     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
227     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
228     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
229     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
230     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
231     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
232     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
233     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
234     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
235     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
236     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
237     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
238     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
239     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
240 }
241 
enqueueArtistCase()242 void MediaPlayListTest::enqueueArtistCase()
243 {
244     MediaPlayList myPlayList;
245     QAbstractItemModelTester testModel(&myPlayList);
246     DatabaseInterface myDatabaseContent;
247     TracksListener myListener(&myDatabaseContent);
248 
249     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
250     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
251     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
252     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
253     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
254     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
255     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
256     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
257     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
258     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
259 
260     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
261     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
262     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
263     QCOMPARE(rowsRemovedSpy.count(), 0);
264     QCOMPARE(rowsMovedSpy.count(), 0);
265     QCOMPARE(rowsInsertedSpy.count(), 0);
266     QCOMPARE(dataChangedSpy.count(), 0);
267     QCOMPARE(newTrackByNameInListSpy.count(), 0);
268     QCOMPARE(newEntryInListSpy.count(), 0);
269 
270     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
271 
272     connect(&myListener, &TracksListener::trackHasChanged,
273             &myPlayList, &MediaPlayList::trackChanged,
274             Qt::QueuedConnection);
275     connect(&myListener, &TracksListener::tracksListAdded,
276             &myPlayList, &MediaPlayList::tracksListAdded,
277             Qt::QueuedConnection);
278     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
279             &myListener, &TracksListener::trackByNameInList,
280             Qt::QueuedConnection);
281     connect(&myPlayList, &MediaPlayList::newEntryInList,
282             &myListener, &TracksListener::newEntryInList,
283             Qt::QueuedConnection);
284     connect(&myPlayList, &MediaPlayList::newUrlInList,
285             &myListener, &TracksListener::newUrlInList,
286             Qt::QueuedConnection);
287     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
288             &myListener, &TracksListener::tracksAdded);
289 
290     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
291 
292     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
293     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
294     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
295     QCOMPARE(rowsRemovedSpy.count(), 0);
296     QCOMPARE(rowsMovedSpy.count(), 0);
297     QCOMPARE(rowsInsertedSpy.count(), 0);
298     QCOMPARE(dataChangedSpy.count(), 0);
299     QCOMPARE(newTrackByNameInListSpy.count(), 0);
300     QCOMPARE(newEntryInListSpy.count(), 0);
301 
302     myPlayList.enqueueOneEntry({{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}});
303 
304     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
305     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
306     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
307     QCOMPARE(rowsRemovedSpy.count(), 0);
308     QCOMPARE(rowsMovedSpy.count(), 0);
309     QCOMPARE(rowsInsertedSpy.count(), 1);
310     QCOMPARE(dataChangedSpy.count(), 0);
311     QCOMPARE(newTrackByNameInListSpy.count(), 0);
312     QCOMPARE(newEntryInListSpy.count(), 1);
313 
314     QCOMPARE(myPlayList.rowCount(), 1);
315 
316     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
317 
318     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
319     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
320     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
321     QCOMPARE(rowsRemovedSpy.count(), 1);
322     QCOMPARE(rowsMovedSpy.count(), 0);
323     QCOMPARE(rowsInsertedSpy.count(), 2);
324     QCOMPARE(dataChangedSpy.count(), 0);
325     QCOMPARE(newTrackByNameInListSpy.count(), 0);
326     QCOMPARE(newEntryInListSpy.count(), 1);
327 
328     QCOMPARE(myPlayList.rowCount(), 6);
329 
330     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
331     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
332     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
333     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
334     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
335     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
336     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1);
337     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
338     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
339     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
340     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
341     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
342     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
343     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
344     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
345     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
346     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
347     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
348     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
349     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
350     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
351     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
352     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
353     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
354     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
355     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
356     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
357     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
358     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
359     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
360     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
361     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
362     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
363     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
364     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
365     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
366     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
367     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
368     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
369     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
370     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
371     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
372 }
373 
enqueueTrackByUrl()374 void MediaPlayListTest::enqueueTrackByUrl()
375 {
376     MediaPlayList myPlayList;
377     QAbstractItemModelTester testModel(&myPlayList);
378     DatabaseInterface myDatabaseContent;
379     TracksListener myListener(&myDatabaseContent);
380 
381     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
382     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
383     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
384     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
385     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
386     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
387     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
388     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
389     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
390     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
391 
392     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
393     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
394     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
395     QCOMPARE(rowsRemovedSpy.count(), 0);
396     QCOMPARE(rowsMovedSpy.count(), 0);
397     QCOMPARE(rowsInsertedSpy.count(), 0);
398     QCOMPARE(dataChangedSpy.count(), 0);
399     QCOMPARE(newTrackByNameInListSpy.count(), 0);
400     QCOMPARE(newEntryInListSpy.count(), 0);
401     QCOMPARE(newUrlInListSpy.count(), 0);
402 
403     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
404 
405     connect(&myListener, &TracksListener::trackHasChanged,
406             &myPlayList, &MediaPlayList::trackChanged,
407             Qt::QueuedConnection);
408     connect(&myListener, &TracksListener::tracksListAdded,
409             &myPlayList, &MediaPlayList::tracksListAdded,
410             Qt::QueuedConnection);
411     connect(&myPlayList, &MediaPlayList::newEntryInList,
412             &myListener, &TracksListener::newEntryInList,
413             Qt::QueuedConnection);
414     connect(&myPlayList, &MediaPlayList::newUrlInList,
415             &myListener, &TracksListener::newUrlInList,
416             Qt::QueuedConnection);
417     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
418             &myListener, &TracksListener::trackByNameInList,
419             Qt::QueuedConnection);
420     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
421             &myListener, &TracksListener::tracksAdded);
422 
423     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
424 
425     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
426     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
427     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
428     QCOMPARE(rowsRemovedSpy.count(), 0);
429     QCOMPARE(rowsMovedSpy.count(), 0);
430     QCOMPARE(rowsInsertedSpy.count(), 0);
431     QCOMPARE(dataChangedSpy.count(), 0);
432     QCOMPARE(newTrackByNameInListSpy.count(), 0);
433     QCOMPARE(newEntryInListSpy.count(), 0);
434     QCOMPARE(newUrlInListSpy.count(), 0);
435 
436     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
437     auto trackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
438     myPlayList.enqueueFilesList({{{}, {}, trackData.resourceURI()}});
439 
440     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
441     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
442     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
443     QCOMPARE(rowsRemovedSpy.count(), 0);
444     QCOMPARE(rowsMovedSpy.count(), 0);
445     QCOMPARE(rowsInsertedSpy.count(), 1);
446     QCOMPARE(dataChangedSpy.count(), 0);
447     QCOMPARE(newTrackByNameInListSpy.count(), 0);
448     QCOMPARE(newEntryInListSpy.count(), 0);
449     QCOMPARE(newUrlInListSpy.count(), 1);
450 
451     QCOMPARE(dataChangedSpy.wait(), true);
452 
453     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
454     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
455     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
456     QCOMPARE(rowsRemovedSpy.count(), 0);
457     QCOMPARE(rowsMovedSpy.count(), 0);
458     QCOMPARE(rowsInsertedSpy.count(), 1);
459     QCOMPARE(dataChangedSpy.count(), 1);
460     QCOMPARE(newTrackByNameInListSpy.count(), 0);
461     QCOMPARE(newEntryInListSpy.count(), 0);
462     QCOMPARE(newUrlInListSpy.count(), 1);
463 }
464 
enqueueTracksByUrl()465 void MediaPlayListTest::enqueueTracksByUrl()
466 {
467     MediaPlayList myPlayList;
468     QAbstractItemModelTester testModel(&myPlayList);
469     DatabaseInterface myDatabaseContent;
470     TracksListener myListener(&myDatabaseContent);
471 
472     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
473     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
474     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
475     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
476     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
477     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
478     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
479     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
480     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
481     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
482 
483     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
484     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
485     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
486     QCOMPARE(rowsRemovedSpy.count(), 0);
487     QCOMPARE(rowsMovedSpy.count(), 0);
488     QCOMPARE(rowsInsertedSpy.count(), 0);
489    QCOMPARE(dataChangedSpy.count(), 0);
490     QCOMPARE(newTrackByNameInListSpy.count(), 0);
491     QCOMPARE(newEntryInListSpy.count(), 0);
492     QCOMPARE(newUrlInListSpy.count(), 0);
493 
494     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
495 
496     connect(&myListener, &TracksListener::trackHasChanged,
497             &myPlayList, &MediaPlayList::trackChanged,
498             Qt::QueuedConnection);
499     connect(&myListener, &TracksListener::tracksListAdded,
500             &myPlayList, &MediaPlayList::tracksListAdded,
501             Qt::QueuedConnection);
502     connect(&myPlayList, &MediaPlayList::newEntryInList,
503             &myListener, &TracksListener::newEntryInList,
504             Qt::QueuedConnection);
505     connect(&myPlayList, &MediaPlayList::newUrlInList,
506             &myListener, &TracksListener::newUrlInList,
507             Qt::QueuedConnection);
508     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
509             &myListener, &TracksListener::trackByNameInList,
510             Qt::QueuedConnection);
511     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
512             &myListener, &TracksListener::tracksAdded);
513 
514     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
515 
516     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
517     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
518     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
519     QCOMPARE(rowsRemovedSpy.count(), 0);
520     QCOMPARE(rowsMovedSpy.count(), 0);
521     QCOMPARE(rowsInsertedSpy.count(), 0);
522     QCOMPARE(dataChangedSpy.count(), 0);
523     QCOMPARE(newTrackByNameInListSpy.count(), 0);
524     QCOMPARE(newEntryInListSpy.count(), 0);
525     QCOMPARE(newUrlInListSpy.count(), 0);
526 
527     auto firstNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
528     auto firstTrackData = myDatabaseContent.trackDataFromDatabaseId(firstNewTrackID);
529     auto secondNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
530     auto secondTrackData = myDatabaseContent.trackDataFromDatabaseId(secondNewTrackID);
531     myPlayList.enqueueFilesList({{{}, {}, firstTrackData.resourceURI()}, {{}, {}, secondTrackData.resourceURI()}});
532 
533     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
534     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
535     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
536     QCOMPARE(rowsRemovedSpy.count(), 0);
537     QCOMPARE(rowsMovedSpy.count(), 0);
538     QCOMPARE(rowsInsertedSpy.count(), 1);
539     QCOMPARE(dataChangedSpy.count(), 0);
540     QCOMPARE(newTrackByNameInListSpy.count(), 0);
541     QCOMPARE(newEntryInListSpy.count(), 0);
542     QCOMPARE(newUrlInListSpy.count(), 2);
543 
544     QCOMPARE(dataChangedSpy.wait(), true);
545 
546     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
547     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
548     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
549     QCOMPARE(rowsRemovedSpy.count(), 0);
550     QCOMPARE(rowsMovedSpy.count(), 0);
551     QCOMPARE(rowsInsertedSpy.count(), 1);
552     QCOMPARE(dataChangedSpy.count(), 2);
553     QCOMPARE(newTrackByNameInListSpy.count(), 0);
554     QCOMPARE(newEntryInListSpy.count(), 0);
555     QCOMPARE(newUrlInListSpy.count(), 2);
556 }
557 
enqueueFiles()558 void MediaPlayListTest::enqueueFiles()
559 {
560     MediaPlayList myPlayList;
561     QAbstractItemModelTester testModel(&myPlayList);
562     DatabaseInterface myDatabaseContent;
563     TracksListener myListener(&myDatabaseContent);
564 
565     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
566     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
567     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
568     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
569     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
570     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
571     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
572     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
573     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
574     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
575 
576     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
577     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
578     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
579     QCOMPARE(rowsRemovedSpy.count(), 0);
580     QCOMPARE(rowsMovedSpy.count(), 0);
581     QCOMPARE(rowsInsertedSpy.count(), 0);
582     QCOMPARE(dataChangedSpy.count(), 0);
583     QCOMPARE(newTrackByNameInListSpy.count(), 0);
584     QCOMPARE(newEntryInListSpy.count(), 0);
585     QCOMPARE(newUrlInListSpy.count(), 0);
586 
587     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
588 
589     connect(&myListener, &TracksListener::trackHasChanged,
590             &myPlayList, &MediaPlayList::trackChanged,
591             Qt::QueuedConnection);
592     connect(&myListener, &TracksListener::tracksListAdded,
593             &myPlayList, &MediaPlayList::tracksListAdded,
594             Qt::QueuedConnection);
595     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
596             &myListener, &TracksListener::trackByNameInList,
597             Qt::QueuedConnection);
598     connect(&myPlayList, &MediaPlayList::newEntryInList,
599             &myListener, &TracksListener::newEntryInList,
600             Qt::QueuedConnection);
601     connect(&myPlayList, &MediaPlayList::newUrlInList,
602             &myListener, &TracksListener::newUrlInList,
603             Qt::QueuedConnection);
604     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
605             &myListener, &TracksListener::tracksAdded);
606 
607     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
608 
609     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
610     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
611     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
612     QCOMPARE(rowsRemovedSpy.count(), 0);
613     QCOMPARE(rowsMovedSpy.count(), 0);
614     QCOMPARE(rowsInsertedSpy.count(), 0);
615     QCOMPARE(dataChangedSpy.count(), 0);
616     QCOMPARE(newTrackByNameInListSpy.count(), 0);
617     QCOMPARE(newEntryInListSpy.count(), 0);
618     QCOMPARE(newUrlInListSpy.count(), 0);
619 
620     myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral("/$1"))}, {{}, {}, QUrl::fromLocalFile(QStringLiteral("/$2"))}});
621 
622     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
623     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
624     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
625     QCOMPARE(rowsRemovedSpy.count(), 0);
626     QCOMPARE(rowsMovedSpy.count(), 0);
627     QCOMPARE(rowsInsertedSpy.count(), 1);
628     QCOMPARE(dataChangedSpy.count(), 0);
629     QCOMPARE(newTrackByNameInListSpy.count(), 0);
630     QCOMPARE(newEntryInListSpy.count(), 0);
631     QCOMPARE(newUrlInListSpy.count(), 2);
632 
633     QCOMPARE(myPlayList.rowCount(), 2);
634 
635     QCOMPARE(dataChangedSpy.wait(300), true);
636 
637     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
638     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
639     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
640     QCOMPARE(rowsRemovedSpy.count(), 0);
641     QCOMPARE(rowsMovedSpy.count(), 0);
642     QCOMPARE(rowsInsertedSpy.count(), 1);
643     QCOMPARE(dataChangedSpy.count(), 2);
644     QCOMPARE(newTrackByNameInListSpy.count(), 0);
645     QCOMPARE(newEntryInListSpy.count(), 0);
646     QCOMPARE(newUrlInListSpy.count(), 2);
647 
648     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
649     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
650     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
651     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
652     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
653     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
654     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
655     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
656     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
657     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
658     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
659     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
660 }
661 
enqueueSampleFiles()662 void MediaPlayListTest::enqueueSampleFiles()
663 {
664     MediaPlayList myPlayList;
665     QAbstractItemModelTester testModel(&myPlayList);
666     DatabaseInterface myDatabaseContent;
667     TracksListener myListener(&myDatabaseContent);
668 
669     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
670     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
671     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
672     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
673     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
674     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
675     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
676     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
677     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
678     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
679 
680     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
681     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
682     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
683     QCOMPARE(rowsRemovedSpy.count(), 0);
684     QCOMPARE(rowsMovedSpy.count(), 0);
685     QCOMPARE(rowsInsertedSpy.count(), 0);
686     QCOMPARE(dataChangedSpy.count(), 0);
687     QCOMPARE(newTrackByNameInListSpy.count(), 0);
688     QCOMPARE(newEntryInListSpy.count(), 0);
689     QCOMPARE(newUrlInListSpy.count(), 0);
690 
691     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
692 
693     connect(&myListener, &TracksListener::trackHasChanged,
694             &myPlayList, &MediaPlayList::trackChanged,
695             Qt::QueuedConnection);
696     connect(&myListener, &TracksListener::tracksListAdded,
697             &myPlayList, &MediaPlayList::tracksListAdded,
698             Qt::QueuedConnection);
699     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
700             &myListener, &TracksListener::trackByNameInList,
701             Qt::QueuedConnection);
702     connect(&myPlayList, &MediaPlayList::newEntryInList,
703             &myListener, &TracksListener::newEntryInList,
704             Qt::QueuedConnection);
705     connect(&myPlayList, &MediaPlayList::newUrlInList,
706             &myListener, &TracksListener::newUrlInList,
707             Qt::QueuedConnection);
708     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
709             &myListener, &TracksListener::tracksAdded);
710 
711     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
712 
713     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
714     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
715     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
716     QCOMPARE(rowsRemovedSpy.count(), 0);
717     QCOMPARE(rowsMovedSpy.count(), 0);
718     QCOMPARE(rowsInsertedSpy.count(), 0);
719     QCOMPARE(dataChangedSpy.count(), 0);
720     QCOMPARE(newTrackByNameInListSpy.count(), 0);
721     QCOMPARE(newEntryInListSpy.count(), 0);
722     QCOMPARE(newUrlInListSpy.count(), 0);
723 
724     myPlayList.enqueueFilesList({{{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))},
725                         {{}, {}, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}});
726 
727     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
728     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
729     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
730     QCOMPARE(rowsRemovedSpy.count(), 0);
731     QCOMPARE(rowsMovedSpy.count(), 0);
732     QCOMPARE(rowsInsertedSpy.count(), 1);
733     QCOMPARE(dataChangedSpy.count(), 0);
734     QCOMPARE(newTrackByNameInListSpy.count(), 0);
735     QCOMPARE(newEntryInListSpy.count(), 0);
736     QCOMPARE(newUrlInListSpy.count(), 2);
737 
738     QCOMPARE(myPlayList.rowCount(), 2);
739 
740     while (dataChangedSpy.count() < 2) {
741         QCOMPARE(dataChangedSpy.wait(), true);
742     }
743 
744     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
745     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
746     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
747     QCOMPARE(rowsRemovedSpy.count(), 0);
748     QCOMPARE(rowsMovedSpy.count(), 0);
749     QCOMPARE(rowsInsertedSpy.count(), 1);
750     QCOMPARE(dataChangedSpy.count(), 2);
751     QCOMPARE(newTrackByNameInListSpy.count(), 0);
752     QCOMPARE(newEntryInListSpy.count(), 0);
753     QCOMPARE(newUrlInListSpy.count(), 2);
754 
755 #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND
756     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
757     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
758     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
759     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
760     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
761     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
762     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2"));
763     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2"));
764     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2"));
765     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
766     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
767     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
768 #else
769     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg"));
770     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
771     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
772     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
773     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
774     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
775     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg"));
776     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
777     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
778     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
779     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
780     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
781 #endif
782 }
783 
enqueueEmpty()784 void MediaPlayListTest::enqueueEmpty()
785 {
786     MediaPlayList myPlayList;
787     QAbstractItemModelTester testModel(&myPlayList);
788     DatabaseInterface myDatabaseContent;
789     TracksListener myListener(&myDatabaseContent);
790 
791     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
792     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
793     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
794     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
795     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
796     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
797     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
798     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
799     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
800     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
801 
802     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
803     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
804     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
805     QCOMPARE(rowsRemovedSpy.count(), 0);
806     QCOMPARE(rowsMovedSpy.count(), 0);
807     QCOMPARE(rowsInsertedSpy.count(), 0);
808     QCOMPARE(dataChangedSpy.count(), 0);
809     QCOMPARE(newTrackByNameInListSpy.count(), 0);
810     QCOMPARE(newEntryInListSpy.count(), 0);
811 
812     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
813 
814     connect(&myListener, &TracksListener::trackHasChanged,
815             &myPlayList, &MediaPlayList::trackChanged,
816             Qt::QueuedConnection);
817     connect(&myListener, &TracksListener::tracksListAdded,
818             &myPlayList, &MediaPlayList::tracksListAdded,
819             Qt::QueuedConnection);
820     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
821             &myListener, &TracksListener::trackByNameInList,
822             Qt::QueuedConnection);
823     connect(&myPlayList, &MediaPlayList::newEntryInList,
824             &myListener, &TracksListener::newEntryInList,
825             Qt::QueuedConnection);
826     connect(&myPlayList, &MediaPlayList::newUrlInList,
827             &myListener, &TracksListener::newUrlInList,
828             Qt::QueuedConnection);
829     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
830             &myListener, &TracksListener::tracksAdded);
831 
832     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
833 
834     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
835     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
836     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
837     QCOMPARE(rowsRemovedSpy.count(), 0);
838     QCOMPARE(rowsMovedSpy.count(), 0);
839     QCOMPARE(rowsInsertedSpy.count(), 0);
840     QCOMPARE(dataChangedSpy.count(), 0);
841     QCOMPARE(newTrackByNameInListSpy.count(), 0);
842     QCOMPARE(newEntryInListSpy.count(), 0);
843 
844     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
845 
846     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
847     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
848     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
849     QCOMPARE(rowsRemovedSpy.count(), 0);
850     QCOMPARE(rowsMovedSpy.count(), 0);
851     QCOMPARE(rowsInsertedSpy.count(), 0);
852     QCOMPARE(dataChangedSpy.count(), 0);
853     QCOMPARE(newTrackByNameInListSpy.count(), 0);
854     QCOMPARE(newEntryInListSpy.count(), 0);
855 
856     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
857 
858     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
859     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
860     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
861     QCOMPARE(rowsRemovedSpy.count(), 0);
862     QCOMPARE(rowsMovedSpy.count(), 0);
863     QCOMPARE(rowsInsertedSpy.count(), 0);
864     QCOMPARE(dataChangedSpy.count(), 0);
865     QCOMPARE(newTrackByNameInListSpy.count(), 0);
866     QCOMPARE(newEntryInListSpy.count(), 0);
867 
868     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
869 
870     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
871     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
872     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
873     QCOMPARE(rowsRemovedSpy.count(), 0);
874     QCOMPARE(rowsMovedSpy.count(), 0);
875     QCOMPARE(rowsInsertedSpy.count(), 0);
876     QCOMPARE(dataChangedSpy.count(), 0);
877     QCOMPARE(newTrackByNameInListSpy.count(), 0);
878     QCOMPARE(newEntryInListSpy.count(), 0);
879 
880     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
881 
882     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
883     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
884     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
885     QCOMPARE(rowsRemovedSpy.count(), 0);
886     QCOMPARE(rowsMovedSpy.count(), 0);
887     QCOMPARE(rowsInsertedSpy.count(), 0);
888     QCOMPARE(dataChangedSpy.count(), 0);
889     QCOMPARE(newTrackByNameInListSpy.count(), 0);
890     QCOMPARE(newEntryInListSpy.count(), 0);
891 
892     myPlayList.enqueueOneEntry(DataTypes::EntryData{});
893 
894     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
895     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
896     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
897     QCOMPARE(rowsRemovedSpy.count(), 0);
898     QCOMPARE(rowsMovedSpy.count(), 0);
899     QCOMPARE(rowsInsertedSpy.count(), 0);
900     QCOMPARE(dataChangedSpy.count(), 0);
901     QCOMPARE(newTrackByNameInListSpy.count(), 0);
902     QCOMPARE(newEntryInListSpy.count(), 0);
903 }
904 
removeFirstTrackOfAlbum()905 void MediaPlayListTest::removeFirstTrackOfAlbum()
906 {
907     MediaPlayList myPlayList;
908     QAbstractItemModelTester testModel(&myPlayList);
909     DatabaseInterface myDatabaseContent;
910     TracksListener myListener(&myDatabaseContent);
911 
912     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
913     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
914     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
915     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
916     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
917     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
918     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
919     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
920     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
921     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
922 
923     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
924     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
925     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
926     QCOMPARE(rowsRemovedSpy.count(), 0);
927     QCOMPARE(rowsMovedSpy.count(), 0);
928     QCOMPARE(rowsInsertedSpy.count(), 0);
929     QCOMPARE(dataChangedSpy.count(), 0);
930     QCOMPARE(newTrackByNameInListSpy.count(), 0);
931     QCOMPARE(newEntryInListSpy.count(), 0);
932 
933     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
934 
935     connect(&myListener, &TracksListener::trackHasChanged,
936             &myPlayList, &MediaPlayList::trackChanged,
937             Qt::QueuedConnection);
938     connect(&myListener, &TracksListener::tracksListAdded,
939             &myPlayList, &MediaPlayList::tracksListAdded,
940             Qt::QueuedConnection);
941     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
942             &myListener, &TracksListener::trackByNameInList,
943             Qt::QueuedConnection);
944     connect(&myPlayList, &MediaPlayList::newEntryInList,
945             &myListener, &TracksListener::newEntryInList,
946             Qt::QueuedConnection);
947     connect(&myPlayList, &MediaPlayList::newUrlInList,
948             &myListener, &TracksListener::newUrlInList,
949             Qt::QueuedConnection);
950     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
951             &myListener, &TracksListener::tracksAdded);
952 
953     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
954 
955     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
956     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
957     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
958     QCOMPARE(rowsRemovedSpy.count(), 0);
959     QCOMPARE(rowsMovedSpy.count(), 0);
960     QCOMPARE(rowsInsertedSpy.count(), 0);
961     QCOMPARE(dataChangedSpy.count(), 0);
962     QCOMPARE(newTrackByNameInListSpy.count(), 0);
963     QCOMPARE(newEntryInListSpy.count(), 0);
964 
965     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
966                         QStringLiteral("album2"), {}});
967 
968     QVERIFY(rowsAboutToBeRemovedSpy.wait());
969 
970     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
971     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
972     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
973     QCOMPARE(rowsRemovedSpy.count(), 1);
974     QCOMPARE(rowsMovedSpy.count(), 0);
975     QCOMPARE(rowsInsertedSpy.count(), 2);
976     QCOMPARE(dataChangedSpy.count(), 0);
977     QCOMPARE(newTrackByNameInListSpy.count(), 0);
978     QCOMPARE(newEntryInListSpy.count(), 1);
979 
980     myPlayList.removeRows(0, 1);
981 
982     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
983     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
984     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
985     QCOMPARE(rowsRemovedSpy.count(), 2);
986     QCOMPARE(rowsMovedSpy.count(), 0);
987     QCOMPARE(rowsInsertedSpy.count(), 2);
988     QCOMPARE(dataChangedSpy.count(), 0);
989     QCOMPARE(newTrackByNameInListSpy.count(), 0);
990     QCOMPARE(newEntryInListSpy.count(), 1);
991 }
992 
testTrackBeenRemoved()993 void MediaPlayListTest::testTrackBeenRemoved()
994 {
995     MediaPlayList myPlayList;
996     QAbstractItemModelTester testModel(&myPlayList);
997     DatabaseInterface myDatabaseContent;
998     TracksListener myListener(&myDatabaseContent);
999 
1000     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1001     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1002     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1003     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1004     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1005     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1006     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1007     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1008     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1009     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1010 
1011     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1012     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1013     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1014     QCOMPARE(rowsRemovedSpy.count(), 0);
1015     QCOMPARE(rowsMovedSpy.count(), 0);
1016     QCOMPARE(rowsInsertedSpy.count(), 0);
1017     QCOMPARE(dataChangedSpy.count(), 0);
1018     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1019     QCOMPARE(newEntryInListSpy.count(), 0);
1020 
1021     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1022 
1023     connect(&myListener, &TracksListener::trackHasChanged,
1024             &myPlayList, &MediaPlayList::trackChanged,
1025             Qt::QueuedConnection);
1026     connect(&myListener, &TracksListener::tracksListAdded,
1027             &myPlayList, &MediaPlayList::tracksListAdded,
1028             Qt::QueuedConnection);
1029     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1030             &myListener, &TracksListener::trackByNameInList,
1031             Qt::QueuedConnection);
1032     connect(&myPlayList, &MediaPlayList::newEntryInList,
1033             &myListener, &TracksListener::newEntryInList,
1034             Qt::QueuedConnection);
1035     connect(&myPlayList, &MediaPlayList::newUrlInList,
1036             &myListener, &TracksListener::newUrlInList,
1037             Qt::QueuedConnection);
1038     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1039             &myListener, &TracksListener::tracksAdded);
1040 
1041     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1042 
1043     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1044     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1045     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1046     QCOMPARE(rowsRemovedSpy.count(), 0);
1047     QCOMPARE(rowsMovedSpy.count(), 0);
1048     QCOMPARE(rowsInsertedSpy.count(), 0);
1049     QCOMPARE(dataChangedSpy.count(), 0);
1050     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1051     QCOMPARE(newEntryInListSpy.count(), 0);
1052 
1053     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}});
1054 
1055     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1056     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1057     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1058     QCOMPARE(rowsRemovedSpy.count(), 0);
1059     QCOMPARE(rowsMovedSpy.count(), 0);
1060     QCOMPARE(rowsInsertedSpy.count(), 1);
1061     QCOMPARE(dataChangedSpy.count(), 0);
1062     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1063     QCOMPARE(newEntryInListSpy.count(), 1);
1064 
1065     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
1066 
1067     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1068     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1069     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1070     QCOMPARE(rowsRemovedSpy.count(), 1);
1071     QCOMPARE(rowsMovedSpy.count(), 0);
1072     QCOMPARE(rowsInsertedSpy.count(), 2);
1073     QCOMPARE(dataChangedSpy.count(), 0);
1074     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1075     QCOMPARE(newEntryInListSpy.count(), 1);
1076 
1077     QCOMPARE(myPlayList.rowCount(), 6);
1078 
1079     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1080     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1081     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1082     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1083     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1084     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1085     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1086     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1087     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1088     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1089     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1090     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1091     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1092     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1093     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1094     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1095     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1096     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1097     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1098     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1099     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1100     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1101     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
1102     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1103     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1104     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1105     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
1106     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1107     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1108     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
1109     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1110     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1111     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1112     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
1113     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1114     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1115     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
1116     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1117     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1118     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1119     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
1120     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1121 
1122     auto removedTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"),
1123                                                                                  QStringLiteral("album2"), 2, 1);
1124 
1125     QCOMPARE(removedTrackId != 0, true);
1126 
1127     auto removedTrack = myDatabaseContent.trackDataFromDatabaseId(removedTrackId);
1128 
1129     QVERIFY(!removedTrack.isEmpty());
1130 
1131     myPlayList.trackRemoved(removedTrack[DataTypes::DatabaseIdRole].toULongLong());
1132 
1133     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1134     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1135     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1136     QCOMPARE(rowsRemovedSpy.count(), 1);
1137     QCOMPARE(rowsMovedSpy.count(), 0);
1138     QCOMPARE(rowsInsertedSpy.count(), 2);
1139     QCOMPARE(dataChangedSpy.count(), 1);
1140     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1141     QCOMPARE(newEntryInListSpy.count(), 1);
1142 
1143     QCOMPARE(myPlayList.rowCount(), 6);
1144 
1145     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1146     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1147     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1148     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1149     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1150     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1151     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1152     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1153     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1154     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1155     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1156     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1157     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1158     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1159     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false);
1160     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1161     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1162     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1163     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1164     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1);
1165     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0);
1166     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1167     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
1168     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1169     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1170     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1171     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
1172     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1173     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1174     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
1175     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1176     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1177     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1178     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
1179     QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1180     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1181     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
1182     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1183     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
1184     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
1185     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
1186     QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1187 }
1188 
testSetData()1189 void MediaPlayListTest::testSetData()
1190 {
1191     MediaPlayList myPlayList;
1192     QAbstractItemModelTester testModel(&myPlayList);
1193     DatabaseInterface myDatabaseContent;
1194     TracksListener myListener(&myDatabaseContent);
1195 
1196     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1197     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1198     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1199     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1200     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1201     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1202     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1203     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1204     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1205     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1206 
1207     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1208     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1209     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1210     QCOMPARE(rowsRemovedSpy.count(), 0);
1211     QCOMPARE(rowsMovedSpy.count(), 0);
1212     QCOMPARE(rowsInsertedSpy.count(), 0);
1213     QCOMPARE(dataChangedSpy.count(), 0);
1214     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1215     QCOMPARE(newEntryInListSpy.count(), 0);
1216 
1217     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1218 
1219     connect(&myListener, &TracksListener::trackHasChanged,
1220             &myPlayList, &MediaPlayList::trackChanged,
1221             Qt::QueuedConnection);
1222     connect(&myListener, &TracksListener::tracksListAdded,
1223             &myPlayList, &MediaPlayList::tracksListAdded,
1224             Qt::QueuedConnection);
1225     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1226             &myListener, &TracksListener::trackByNameInList,
1227             Qt::QueuedConnection);
1228     connect(&myPlayList, &MediaPlayList::newEntryInList,
1229             &myListener, &TracksListener::newEntryInList,
1230             Qt::QueuedConnection);
1231     connect(&myPlayList, &MediaPlayList::newUrlInList,
1232             &myListener, &TracksListener::newUrlInList,
1233             Qt::QueuedConnection);
1234     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1235             &myListener, &TracksListener::tracksAdded);
1236 
1237     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1238 
1239     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1240     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1241     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1242     QCOMPARE(rowsRemovedSpy.count(), 0);
1243     QCOMPARE(rowsMovedSpy.count(), 0);
1244     QCOMPARE(rowsInsertedSpy.count(), 0);
1245     QCOMPARE(dataChangedSpy.count(), 0);
1246     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1247     QCOMPARE(newEntryInListSpy.count(), 0);
1248 
1249     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
1250                                                                                QStringLiteral("album3"), 1, 1);
1251     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1252 
1253     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1254     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1255     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1256     QCOMPARE(rowsRemovedSpy.count(), 0);
1257     QCOMPARE(rowsMovedSpy.count(), 0);
1258     QCOMPARE(rowsInsertedSpy.count(), 1);
1259     QCOMPARE(dataChangedSpy.count(), 0);
1260     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1261     QCOMPARE(newEntryInListSpy.count(), 1);
1262 
1263     QCOMPARE(dataChangedSpy.wait(), true);
1264 
1265     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1266     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1267     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1268     QCOMPARE(rowsRemovedSpy.count(), 0);
1269     QCOMPARE(rowsMovedSpy.count(), 0);
1270     QCOMPARE(rowsInsertedSpy.count(), 1);
1271     QCOMPARE(dataChangedSpy.count(), 1);
1272     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1273     QCOMPARE(newEntryInListSpy.count(), 1);
1274 
1275     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1276 
1277     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1278                                                                                 QStringLiteral("album1"), 1, 1);
1279     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1280 
1281     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1282     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1283     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1284     QCOMPARE(rowsRemovedSpy.count(), 0);
1285     QCOMPARE(rowsMovedSpy.count(), 0);
1286     QCOMPARE(rowsInsertedSpy.count(), 2);
1287     QCOMPARE(dataChangedSpy.count(), 1);
1288     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1289     QCOMPARE(newEntryInListSpy.count(), 2);
1290 
1291     QCOMPARE(dataChangedSpy.wait(), true);
1292 
1293     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1294     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1295     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1296     QCOMPARE(rowsRemovedSpy.count(), 0);
1297     QCOMPARE(rowsMovedSpy.count(), 0);
1298     QCOMPARE(rowsInsertedSpy.count(), 2);
1299     QCOMPARE(dataChangedSpy.count(), 2);
1300     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1301     QCOMPARE(newEntryInListSpy.count(), 2);
1302 
1303     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1304     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1305 
1306     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1307                                                                                QStringLiteral("album3"), 2, 1);
1308     myPlayList.enqueueOneEntry(DataTypes::EntryData{{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1309 
1310     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1311     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1312     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1313     QCOMPARE(rowsRemovedSpy.count(), 0);
1314     QCOMPARE(rowsMovedSpy.count(), 0);
1315     QCOMPARE(rowsInsertedSpy.count(), 3);
1316     QCOMPARE(dataChangedSpy.count(), 2);
1317     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1318     QCOMPARE(newEntryInListSpy.count(), 3);
1319 
1320     QCOMPARE(dataChangedSpy.wait(), true);
1321 
1322     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1323     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1324     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1325     QCOMPARE(rowsRemovedSpy.count(), 0);
1326     QCOMPARE(rowsMovedSpy.count(), 0);
1327     QCOMPARE(rowsInsertedSpy.count(), 3);
1328     QCOMPARE(dataChangedSpy.count(), 3);
1329     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1330     QCOMPARE(newEntryInListSpy.count(), 3);
1331 
1332     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1333     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1334     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1335 
1336     QCOMPARE(myPlayList.setData(myPlayList.index(2, 0), true, MediaPlayList::ColumnsRoles::IsPlayingRole), true);
1337 
1338     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1339     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1340     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1341     QCOMPARE(rowsRemovedSpy.count(), 0);
1342     QCOMPARE(rowsMovedSpy.count(), 0);
1343     QCOMPARE(rowsInsertedSpy.count(), 3);
1344     QCOMPARE(dataChangedSpy.count(), 4);
1345     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1346     QCOMPARE(newEntryInListSpy.count(), 3);
1347 
1348     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1349     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1350     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true);
1351 
1352     QCOMPARE(myPlayList.setData(myPlayList.index(2, 0), true, MediaPlayList::ColumnsRoles::SecondaryTextRole), false);
1353 
1354     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1355     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1356     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1357     QCOMPARE(rowsRemovedSpy.count(), 0);
1358     QCOMPARE(rowsMovedSpy.count(), 0);
1359     QCOMPARE(rowsInsertedSpy.count(), 3);
1360     QCOMPARE(dataChangedSpy.count(), 4);
1361     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1362     QCOMPARE(newEntryInListSpy.count(), 3);
1363 
1364     QCOMPARE(myPlayList.setData(myPlayList.index(4, 0), true, MediaPlayList::ColumnsRoles::TitleRole), false);
1365 
1366     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1367     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1368     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1369     QCOMPARE(rowsRemovedSpy.count(), 0);
1370     QCOMPARE(rowsMovedSpy.count(), 0);
1371     QCOMPARE(rowsInsertedSpy.count(), 3);
1372     QCOMPARE(dataChangedSpy.count(), 4);
1373     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1374     QCOMPARE(newEntryInListSpy.count(), 3);
1375 
1376     QCOMPARE(myPlayList.setData({}, true, MediaPlayList::ColumnsRoles::TitleRole), false);
1377 
1378     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1379     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1380     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1381     QCOMPARE(rowsRemovedSpy.count(), 0);
1382     QCOMPARE(rowsMovedSpy.count(), 0);
1383     QCOMPARE(rowsInsertedSpy.count(), 3);
1384     QCOMPARE(dataChangedSpy.count(), 4);
1385     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1386     QCOMPARE(newEntryInListSpy.count(), 3);
1387 }
1388 
testHasHeader()1389 void MediaPlayListTest::testHasHeader()
1390 {
1391     MediaPlayList myPlayList;
1392     QAbstractItemModelTester testModel(&myPlayList);
1393     DatabaseInterface myDatabaseContent;
1394     TracksListener myListener(&myDatabaseContent);
1395 
1396     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1397     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1398     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1399     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1400     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1401     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1402     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1403     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1404     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1405     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1406 
1407     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1408     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1409     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1410     QCOMPARE(rowsRemovedSpy.count(), 0);
1411     QCOMPARE(rowsMovedSpy.count(), 0);
1412     QCOMPARE(rowsInsertedSpy.count(), 0);
1413     QCOMPARE(dataChangedSpy.count(), 0);
1414     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1415     QCOMPARE(newEntryInListSpy.count(), 0);
1416 
1417     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1418 
1419     connect(&myListener, &TracksListener::trackHasChanged,
1420             &myPlayList, &MediaPlayList::trackChanged,
1421             Qt::QueuedConnection);
1422     connect(&myListener, &TracksListener::tracksListAdded,
1423             &myPlayList, &MediaPlayList::tracksListAdded,
1424             Qt::QueuedConnection);
1425     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1426             &myListener, &TracksListener::trackByNameInList,
1427             Qt::QueuedConnection);
1428     connect(&myPlayList, &MediaPlayList::newEntryInList,
1429             &myListener, &TracksListener::newEntryInList,
1430             Qt::QueuedConnection);
1431     connect(&myPlayList, &MediaPlayList::newUrlInList,
1432             &myListener, &TracksListener::newUrlInList,
1433             Qt::QueuedConnection);
1434     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1435             &myListener, &TracksListener::tracksAdded);
1436 
1437     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1438 
1439     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1440     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1441     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1442     QCOMPARE(rowsRemovedSpy.count(), 0);
1443     QCOMPARE(rowsMovedSpy.count(), 0);
1444     QCOMPARE(rowsInsertedSpy.count(), 0);
1445     QCOMPARE(dataChangedSpy.count(), 0);
1446     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1447     QCOMPARE(newEntryInListSpy.count(), 0);
1448 
1449     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1450     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1451 
1452     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1453     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1454     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1455     QCOMPARE(rowsRemovedSpy.count(), 0);
1456     QCOMPARE(rowsMovedSpy.count(), 0);
1457     QCOMPARE(rowsInsertedSpy.count(), 1);
1458     QCOMPARE(dataChangedSpy.count(), 0);
1459     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1460     QCOMPARE(newEntryInListSpy.count(), 1);
1461 
1462     QCOMPARE(dataChangedSpy.wait(), true);
1463 
1464     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1465     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1466     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1467     QCOMPARE(rowsRemovedSpy.count(), 0);
1468     QCOMPARE(rowsMovedSpy.count(), 0);
1469     QCOMPARE(rowsInsertedSpy.count(), 1);
1470     QCOMPARE(dataChangedSpy.count(), 1);
1471     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1472     QCOMPARE(newEntryInListSpy.count(), 1);
1473 
1474     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1475     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1476 
1477     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1478     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1479     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1480     QCOMPARE(rowsRemovedSpy.count(), 0);
1481     QCOMPARE(rowsMovedSpy.count(), 0);
1482     QCOMPARE(rowsInsertedSpy.count(), 2);
1483     QCOMPARE(dataChangedSpy.count(), 1);
1484     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1485     QCOMPARE(newEntryInListSpy.count(), 2);
1486 
1487     QCOMPARE(dataChangedSpy.wait(), true);
1488 
1489     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1490     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1491     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1492     QCOMPARE(rowsRemovedSpy.count(), 0);
1493     QCOMPARE(rowsMovedSpy.count(), 0);
1494     QCOMPARE(rowsInsertedSpy.count(), 2);
1495     QCOMPARE(dataChangedSpy.count(), 2);
1496     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1497     QCOMPARE(newEntryInListSpy.count(), 2);
1498 
1499     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1500     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1501 
1502     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1503     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1504     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1505     QCOMPARE(rowsRemovedSpy.count(), 0);
1506     QCOMPARE(rowsMovedSpy.count(), 0);
1507     QCOMPARE(rowsInsertedSpy.count(), 3);
1508     QCOMPARE(dataChangedSpy.count(), 2);
1509     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1510     QCOMPARE(newEntryInListSpy.count(), 3);
1511 
1512     QCOMPARE(dataChangedSpy.wait(), true);
1513 
1514     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1515     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1516     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1517     QCOMPARE(rowsRemovedSpy.count(), 0);
1518     QCOMPARE(rowsMovedSpy.count(), 0);
1519     QCOMPARE(rowsInsertedSpy.count(), 3);
1520     QCOMPARE(dataChangedSpy.count(), 3);
1521     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1522     QCOMPARE(newEntryInListSpy.count(), 3);
1523 
1524     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1525     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1526 
1527     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1528     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1529     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1530     QCOMPARE(rowsRemovedSpy.count(), 0);
1531     QCOMPARE(rowsMovedSpy.count(), 0);
1532     QCOMPARE(rowsInsertedSpy.count(), 4);
1533     QCOMPARE(dataChangedSpy.count(), 3);
1534     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1535     QCOMPARE(newEntryInListSpy.count(), 4);
1536 
1537     QCOMPARE(dataChangedSpy.wait(), true);
1538 
1539     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1540     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1541     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1542     QCOMPARE(rowsRemovedSpy.count(), 0);
1543     QCOMPARE(rowsMovedSpy.count(), 0);
1544     QCOMPARE(rowsInsertedSpy.count(), 4);
1545     QCOMPARE(dataChangedSpy.count(), 4);
1546     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1547     QCOMPARE(newEntryInListSpy.count(), 4);
1548 
1549     myPlayList.removeRows(2, 1);
1550 
1551     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1552     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1553     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1554     QCOMPARE(rowsRemovedSpy.count(), 1);
1555     QCOMPARE(rowsMovedSpy.count(), 0);
1556     QCOMPARE(rowsInsertedSpy.count(), 4);
1557     QCOMPARE(dataChangedSpy.count(), 4);
1558     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1559     QCOMPARE(newEntryInListSpy.count(), 4);
1560 }
1561 
testHasHeaderWithRemove()1562 void MediaPlayListTest::testHasHeaderWithRemove()
1563 {
1564     MediaPlayList myPlayList;
1565     QAbstractItemModelTester testModel(&myPlayList);
1566     DatabaseInterface myDatabaseContent;
1567     TracksListener myListener(&myDatabaseContent);
1568 
1569     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1570     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1571     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1572     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1573     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1574     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1575     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1576     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1577     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1578     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1579 
1580     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1581     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1582     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1583     QCOMPARE(rowsRemovedSpy.count(), 0);
1584     QCOMPARE(rowsMovedSpy.count(), 0);
1585     QCOMPARE(rowsInsertedSpy.count(), 0);
1586     QCOMPARE(dataChangedSpy.count(), 0);
1587     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1588     QCOMPARE(newEntryInListSpy.count(), 0);
1589 
1590     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1591 
1592     connect(&myListener, &TracksListener::trackHasChanged,
1593             &myPlayList, &MediaPlayList::trackChanged,
1594             Qt::QueuedConnection);
1595     connect(&myListener, &TracksListener::tracksListAdded,
1596             &myPlayList, &MediaPlayList::tracksListAdded,
1597             Qt::QueuedConnection);
1598     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1599             &myListener, &TracksListener::trackByNameInList,
1600             Qt::QueuedConnection);
1601     connect(&myPlayList, &MediaPlayList::newEntryInList,
1602             &myListener, &TracksListener::newEntryInList,
1603             Qt::QueuedConnection);
1604     connect(&myPlayList, &MediaPlayList::newUrlInList,
1605             &myListener, &TracksListener::newUrlInList,
1606             Qt::QueuedConnection);
1607     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1608             &myListener, &TracksListener::tracksAdded);
1609 
1610     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1611 
1612     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1613     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1614     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1615     QCOMPARE(rowsRemovedSpy.count(), 0);
1616     QCOMPARE(rowsMovedSpy.count(), 0);
1617     QCOMPARE(rowsInsertedSpy.count(), 0);
1618     QCOMPARE(dataChangedSpy.count(), 0);
1619     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1620     QCOMPARE(newEntryInListSpy.count(), 0);
1621 
1622     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1623     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1624 
1625     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1626     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1627     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1628     QCOMPARE(rowsRemovedSpy.count(), 0);
1629     QCOMPARE(rowsMovedSpy.count(), 0);
1630     QCOMPARE(rowsInsertedSpy.count(), 1);
1631     QCOMPARE(dataChangedSpy.count(), 0);
1632     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1633     QCOMPARE(newEntryInListSpy.count(), 1);
1634 
1635     QCOMPARE(dataChangedSpy.wait(), true);
1636 
1637     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1638     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1639     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1640     QCOMPARE(rowsRemovedSpy.count(), 0);
1641     QCOMPARE(rowsMovedSpy.count(), 0);
1642     QCOMPARE(rowsInsertedSpy.count(), 1);
1643     QCOMPARE(dataChangedSpy.count(), 1);
1644     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1645     QCOMPARE(newEntryInListSpy.count(), 1);
1646 
1647     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1648     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1649 
1650     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1651     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1652     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1653     QCOMPARE(rowsRemovedSpy.count(), 0);
1654     QCOMPARE(rowsMovedSpy.count(), 0);
1655     QCOMPARE(rowsInsertedSpy.count(), 2);
1656     QCOMPARE(dataChangedSpy.count(), 1);
1657     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1658     QCOMPARE(newEntryInListSpy.count(), 2);
1659 
1660     QCOMPARE(dataChangedSpy.wait(), true);
1661 
1662     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1663     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1664     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1665     QCOMPARE(rowsRemovedSpy.count(), 0);
1666     QCOMPARE(rowsMovedSpy.count(), 0);
1667     QCOMPARE(rowsInsertedSpy.count(), 2);
1668     QCOMPARE(dataChangedSpy.count(), 2);
1669     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1670     QCOMPARE(newEntryInListSpy.count(), 2);
1671 
1672     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
1673     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1674 
1675     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1676     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1677     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1678     QCOMPARE(rowsRemovedSpy.count(), 0);
1679     QCOMPARE(rowsMovedSpy.count(), 0);
1680     QCOMPARE(rowsInsertedSpy.count(), 3);
1681     QCOMPARE(dataChangedSpy.count(), 2);
1682     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1683     QCOMPARE(newEntryInListSpy.count(), 3);
1684 
1685     QCOMPARE(dataChangedSpy.wait(), true);
1686 
1687     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1688     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1689     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1690     QCOMPARE(rowsRemovedSpy.count(), 0);
1691     QCOMPARE(rowsMovedSpy.count(), 0);
1692     QCOMPARE(rowsInsertedSpy.count(), 3);
1693     QCOMPARE(dataChangedSpy.count(), 3);
1694     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1695     QCOMPARE(newEntryInListSpy.count(), 3);
1696 
1697     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1698     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1699 
1700     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1701     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1702     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1703     QCOMPARE(rowsRemovedSpy.count(), 0);
1704     QCOMPARE(rowsMovedSpy.count(), 0);
1705     QCOMPARE(rowsInsertedSpy.count(), 4);
1706     QCOMPARE(dataChangedSpy.count(), 3);
1707     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1708     QCOMPARE(newEntryInListSpy.count(), 4);
1709 
1710     QCOMPARE(dataChangedSpy.wait(), true);
1711 
1712     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1713     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1714     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1715     QCOMPARE(rowsRemovedSpy.count(), 0);
1716     QCOMPARE(rowsMovedSpy.count(), 0);
1717     QCOMPARE(rowsInsertedSpy.count(), 4);
1718     QCOMPARE(dataChangedSpy.count(), 4);
1719     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1720     QCOMPARE(newEntryInListSpy.count(), 4);
1721 
1722     myPlayList.removeRows(2, 1);
1723 
1724     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1725     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1726     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1727     QCOMPARE(rowsRemovedSpy.count(), 1);
1728     QCOMPARE(rowsMovedSpy.count(), 0);
1729     QCOMPARE(rowsInsertedSpy.count(), 4);
1730     QCOMPARE(dataChangedSpy.count(), 4);
1731     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1732     QCOMPARE(newEntryInListSpy.count(), 4);
1733 
1734     myPlayList.removeRows(0, 1);
1735 
1736     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
1737     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1738     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1739     QCOMPARE(rowsRemovedSpy.count(), 2);
1740     QCOMPARE(rowsMovedSpy.count(), 0);
1741     QCOMPARE(rowsInsertedSpy.count(), 4);
1742     QCOMPARE(dataChangedSpy.count(), 4);
1743     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1744     QCOMPARE(newEntryInListSpy.count(), 4);
1745 }
1746 
testHasHeaderWithRestore()1747 void MediaPlayListTest::testHasHeaderWithRestore()
1748 {
1749     MediaPlayList myPlayList;
1750     QAbstractItemModelTester testModel(&myPlayList);
1751     DatabaseInterface myDatabaseContent;
1752     TracksListener myListener(&myDatabaseContent);
1753 
1754     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1755     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1756     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1757     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1758     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1759     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1760     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1761     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1762     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1763     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1764 
1765     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1766     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1767     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1768     QCOMPARE(rowsRemovedSpy.count(), 0);
1769     QCOMPARE(rowsMovedSpy.count(), 0);
1770     QCOMPARE(rowsInsertedSpy.count(), 0);
1771     QCOMPARE(dataChangedSpy.count(), 0);
1772     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1773     QCOMPARE(newEntryInListSpy.count(), 0);
1774 
1775     myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore"));
1776 
1777     connect(&myListener, &TracksListener::trackHasChanged,
1778             &myPlayList, &MediaPlayList::trackChanged,
1779             Qt::QueuedConnection);
1780     connect(&myListener, &TracksListener::tracksListAdded,
1781             &myPlayList, &MediaPlayList::tracksListAdded,
1782             Qt::QueuedConnection);
1783     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1784             &myListener, &TracksListener::trackByNameInList,
1785             Qt::QueuedConnection);
1786     connect(&myPlayList, &MediaPlayList::newEntryInList,
1787             &myListener, &TracksListener::newEntryInList,
1788             Qt::QueuedConnection);
1789     connect(&myPlayList, &MediaPlayList::newUrlInList,
1790             &myListener, &TracksListener::newUrlInList,
1791             Qt::QueuedConnection);
1792     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1793             &myListener, &TracksListener::tracksAdded);
1794 
1795     myPlayList.enqueueRestoredEntries(
1796                 QVariantList({QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("1"), QStringLiteral("1"),{}}),
1797                               QStringList({{},QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), QStringLiteral("1"), QStringLiteral("1"),{}}),
1798                               QStringList({{},QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("2"), QStringLiteral("1"),{}}),
1799                               QStringList({{},QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), QStringLiteral("3"), QStringLiteral("1"),{}})
1800                              }));
1801 
1802     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1803     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1804     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1805     QCOMPARE(rowsRemovedSpy.count(), 0);
1806     QCOMPARE(rowsMovedSpy.count(), 0);
1807     QCOMPARE(rowsInsertedSpy.count(), 1);
1808     QCOMPARE(dataChangedSpy.count(), 0);
1809     QCOMPARE(newTrackByNameInListSpy.count(), 4);
1810     QCOMPARE(newEntryInListSpy.count(), 0);
1811 
1812     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1813 
1814     while (dataChangedSpy.count() < 4) {
1815         QCOMPARE(dataChangedSpy.wait(), true);
1816     }
1817 
1818     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1819     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1820     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1821     QCOMPARE(rowsRemovedSpy.count(), 0);
1822     QCOMPARE(rowsMovedSpy.count(), 0);
1823     QCOMPARE(rowsInsertedSpy.count(), 1);
1824     QCOMPARE(dataChangedSpy.count(), 4);
1825     QCOMPARE(newTrackByNameInListSpy.count(), 4);
1826     QCOMPARE(newEntryInListSpy.count(), 0);
1827 
1828     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
1829     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1830     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1831     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
1832     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1833     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
1834     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
1835     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
1836     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1837     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
1838     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1839     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1840     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
1841     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1842     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1843     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
1844     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1845     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
1846     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
1847     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
1848     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
1849     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
1850     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
1851     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
1852 }
1853 
testHasHeaderMoveFirst()1854 void MediaPlayListTest::testHasHeaderMoveFirst()
1855 {
1856     MediaPlayList myPlayList;
1857     QAbstractItemModelTester testModel(&myPlayList);
1858 
1859     DatabaseInterface myDatabaseContent;
1860     TracksListener myListener(&myDatabaseContent);
1861 
1862     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
1863     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
1864     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
1865     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
1866     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
1867     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
1868     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
1869     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
1870     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
1871     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
1872 
1873     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1874     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1875     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1876     QCOMPARE(rowsRemovedSpy.count(), 0);
1877     QCOMPARE(rowsMovedSpy.count(), 0);
1878     QCOMPARE(rowsInsertedSpy.count(), 0);
1879     QCOMPARE(dataChangedSpy.count(), 0);
1880     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1881     QCOMPARE(newEntryInListSpy.count(), 0);
1882 
1883     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1884 
1885     connect(&myListener, &TracksListener::trackHasChanged,
1886             &myPlayList, &MediaPlayList::trackChanged,
1887             Qt::QueuedConnection);
1888     connect(&myListener, &TracksListener::tracksListAdded,
1889             &myPlayList, &MediaPlayList::tracksListAdded,
1890             Qt::QueuedConnection);
1891     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1892             &myListener, &TracksListener::trackByNameInList,
1893             Qt::QueuedConnection);
1894     connect(&myPlayList, &MediaPlayList::newEntryInList,
1895             &myListener, &TracksListener::newEntryInList,
1896             Qt::QueuedConnection);
1897     connect(&myPlayList, &MediaPlayList::newUrlInList,
1898             &myListener, &TracksListener::newUrlInList,
1899             Qt::QueuedConnection);
1900     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1901             &myListener, &TracksListener::tracksAdded);
1902 
1903     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1904 
1905     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1906     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1907     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
1908     QCOMPARE(rowsRemovedSpy.count(), 0);
1909     QCOMPARE(rowsMovedSpy.count(), 0);
1910     QCOMPARE(rowsInsertedSpy.count(), 0);
1911     QCOMPARE(dataChangedSpy.count(), 0);
1912     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1913     QCOMPARE(newEntryInListSpy.count(), 0);
1914 
1915     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
1916     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1917 
1918     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1919     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1920     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1921     QCOMPARE(rowsRemovedSpy.count(), 0);
1922     QCOMPARE(rowsMovedSpy.count(), 0);
1923     QCOMPARE(rowsInsertedSpy.count(), 1);
1924     QCOMPARE(dataChangedSpy.count(), 0);
1925     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1926     QCOMPARE(newEntryInListSpy.count(), 1);
1927 
1928     QCOMPARE(dataChangedSpy.wait(), true);
1929 
1930     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1931     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1932     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
1933     QCOMPARE(rowsRemovedSpy.count(), 0);
1934     QCOMPARE(rowsMovedSpy.count(), 0);
1935     QCOMPARE(rowsInsertedSpy.count(), 1);
1936     QCOMPARE(dataChangedSpy.count(), 1);
1937     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1938     QCOMPARE(newEntryInListSpy.count(), 1);
1939 
1940     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
1941     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1942 
1943     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1944     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1945     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1946     QCOMPARE(rowsRemovedSpy.count(), 0);
1947     QCOMPARE(rowsMovedSpy.count(), 0);
1948     QCOMPARE(rowsInsertedSpy.count(), 2);
1949     QCOMPARE(dataChangedSpy.count(), 1);
1950     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1951     QCOMPARE(newEntryInListSpy.count(), 2);
1952 
1953     QCOMPARE(dataChangedSpy.wait(), true);
1954 
1955     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1956     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1957     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1958     QCOMPARE(rowsRemovedSpy.count(), 0);
1959     QCOMPARE(rowsMovedSpy.count(), 0);
1960     QCOMPARE(rowsInsertedSpy.count(), 2);
1961     QCOMPARE(dataChangedSpy.count(), 2);
1962     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1963     QCOMPARE(newEntryInListSpy.count(), 2);
1964 
1965     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
1966     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1967 
1968     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1969     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1970     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1971     QCOMPARE(rowsRemovedSpy.count(), 0);
1972     QCOMPARE(rowsMovedSpy.count(), 0);
1973     QCOMPARE(rowsInsertedSpy.count(), 3);
1974     QCOMPARE(dataChangedSpy.count(), 2);
1975     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1976     QCOMPARE(newEntryInListSpy.count(), 3);
1977 
1978     QCOMPARE(dataChangedSpy.wait(), true);
1979 
1980     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1981     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1982     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
1983     QCOMPARE(rowsRemovedSpy.count(), 0);
1984     QCOMPARE(rowsMovedSpy.count(), 0);
1985     QCOMPARE(rowsInsertedSpy.count(), 3);
1986     QCOMPARE(dataChangedSpy.count(), 3);
1987     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1988     QCOMPARE(newEntryInListSpy.count(), 3);
1989 
1990     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
1991     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
1992 
1993     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
1994     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1995     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
1996     QCOMPARE(rowsRemovedSpy.count(), 0);
1997     QCOMPARE(rowsMovedSpy.count(), 0);
1998     QCOMPARE(rowsInsertedSpy.count(), 4);
1999     QCOMPARE(dataChangedSpy.count(), 3);
2000     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2001     QCOMPARE(newEntryInListSpy.count(), 4);
2002 
2003     QCOMPARE(dataChangedSpy.wait(), true);
2004 
2005     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2006     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2007     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2008     QCOMPARE(rowsRemovedSpy.count(), 0);
2009     QCOMPARE(rowsMovedSpy.count(), 0);
2010     QCOMPARE(rowsInsertedSpy.count(), 4);
2011     QCOMPARE(dataChangedSpy.count(), 4);
2012     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2013     QCOMPARE(newEntryInListSpy.count(), 4);
2014 
2015     myPlayList.moveRows({}, 0, 1, {}, 3);
2016 
2017     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2018     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2019     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2020     QCOMPARE(rowsRemovedSpy.count(), 0);
2021     QCOMPARE(rowsMovedSpy.count(), 1);
2022     QCOMPARE(rowsInsertedSpy.count(), 4);
2023     QCOMPARE(dataChangedSpy.count(), 4);
2024     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2025     QCOMPARE(newEntryInListSpy.count(), 4);
2026 }
2027 
testHasHeaderMoveAnother()2028 void MediaPlayListTest::testHasHeaderMoveAnother()
2029 {
2030     MediaPlayList myPlayList;
2031     QAbstractItemModelTester testModel(&myPlayList);
2032     DatabaseInterface myDatabaseContent;
2033     TracksListener myListener(&myDatabaseContent);
2034 
2035     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2036     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2037     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2038     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2039     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2040     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2041     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2042     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2043     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2044     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2045 
2046     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2047     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2048     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2049     QCOMPARE(rowsRemovedSpy.count(), 0);
2050     QCOMPARE(rowsMovedSpy.count(), 0);
2051     QCOMPARE(rowsInsertedSpy.count(), 0);
2052     QCOMPARE(dataChangedSpy.count(), 0);
2053     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2054     QCOMPARE(newEntryInListSpy.count(), 0);
2055 
2056     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2057 
2058     connect(&myListener, &TracksListener::trackHasChanged,
2059             &myPlayList, &MediaPlayList::trackChanged,
2060             Qt::QueuedConnection);
2061     connect(&myListener, &TracksListener::tracksListAdded,
2062             &myPlayList, &MediaPlayList::tracksListAdded,
2063             Qt::QueuedConnection);
2064     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2065             &myListener, &TracksListener::trackByNameInList,
2066             Qt::QueuedConnection);
2067     connect(&myPlayList, &MediaPlayList::newEntryInList,
2068             &myListener, &TracksListener::newEntryInList,
2069             Qt::QueuedConnection);
2070     connect(&myPlayList, &MediaPlayList::newUrlInList,
2071             &myListener, &TracksListener::newUrlInList,
2072             Qt::QueuedConnection);
2073     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2074             &myListener, &TracksListener::tracksAdded);
2075 
2076     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2077 
2078     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2079     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2080     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2081     QCOMPARE(rowsRemovedSpy.count(), 0);
2082     QCOMPARE(rowsMovedSpy.count(), 0);
2083     QCOMPARE(rowsInsertedSpy.count(), 0);
2084     QCOMPARE(dataChangedSpy.count(), 0);
2085     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2086     QCOMPARE(newEntryInListSpy.count(), 0);
2087 
2088     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
2089     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2090 
2091     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2092     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2093     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2094     QCOMPARE(rowsRemovedSpy.count(), 0);
2095     QCOMPARE(rowsMovedSpy.count(), 0);
2096     QCOMPARE(rowsInsertedSpy.count(), 1);
2097     QCOMPARE(dataChangedSpy.count(), 0);
2098     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2099     QCOMPARE(newEntryInListSpy.count(), 1);
2100 
2101     QCOMPARE(dataChangedSpy.wait(), true);
2102 
2103     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2104     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2105     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2106     QCOMPARE(rowsRemovedSpy.count(), 0);
2107     QCOMPARE(rowsMovedSpy.count(), 0);
2108     QCOMPARE(rowsInsertedSpy.count(), 1);
2109     QCOMPARE(dataChangedSpy.count(), 1);
2110     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2111     QCOMPARE(newEntryInListSpy.count(), 1);
2112 
2113     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
2114     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2115 
2116     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2117     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2118     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2119     QCOMPARE(rowsRemovedSpy.count(), 0);
2120     QCOMPARE(rowsMovedSpy.count(), 0);
2121     QCOMPARE(rowsInsertedSpy.count(), 2);
2122     QCOMPARE(dataChangedSpy.count(), 1);
2123     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2124     QCOMPARE(newEntryInListSpy.count(), 2);
2125 
2126     QCOMPARE(dataChangedSpy.wait(), true);
2127 
2128     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2129     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2130     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2131     QCOMPARE(rowsRemovedSpy.count(), 0);
2132     QCOMPARE(rowsMovedSpy.count(), 0);
2133     QCOMPARE(rowsInsertedSpy.count(), 2);
2134     QCOMPARE(dataChangedSpy.count(), 2);
2135     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2136     QCOMPARE(newEntryInListSpy.count(), 2);
2137 
2138     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
2139     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2140 
2141     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2142     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2143     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2144     QCOMPARE(rowsRemovedSpy.count(), 0);
2145     QCOMPARE(rowsMovedSpy.count(), 0);
2146     QCOMPARE(rowsInsertedSpy.count(), 3);
2147     QCOMPARE(dataChangedSpy.count(), 2);
2148     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2149     QCOMPARE(newEntryInListSpy.count(), 3);
2150 
2151     QCOMPARE(dataChangedSpy.wait(), true);
2152 
2153     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2154     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2155     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2156     QCOMPARE(rowsRemovedSpy.count(), 0);
2157     QCOMPARE(rowsMovedSpy.count(), 0);
2158     QCOMPARE(rowsInsertedSpy.count(), 3);
2159     QCOMPARE(dataChangedSpy.count(), 3);
2160     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2161     QCOMPARE(newEntryInListSpy.count(), 3);
2162 
2163     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
2164     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2165 
2166     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2167     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2168     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2169     QCOMPARE(rowsRemovedSpy.count(), 0);
2170     QCOMPARE(rowsMovedSpy.count(), 0);
2171     QCOMPARE(rowsInsertedSpy.count(), 4);
2172     QCOMPARE(dataChangedSpy.count(), 3);
2173     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2174     QCOMPARE(newEntryInListSpy.count(), 4);
2175 
2176     QCOMPARE(dataChangedSpy.wait(), true);
2177 
2178     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2179     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2180     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2181     QCOMPARE(rowsRemovedSpy.count(), 0);
2182     QCOMPARE(rowsMovedSpy.count(), 0);
2183     QCOMPARE(rowsInsertedSpy.count(), 4);
2184     QCOMPARE(dataChangedSpy.count(), 4);
2185     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2186     QCOMPARE(newEntryInListSpy.count(), 4);
2187 
2188     myPlayList.moveRows({}, 3, 1, {}, 0);
2189 
2190     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2191     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2192     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2193     QCOMPARE(rowsRemovedSpy.count(), 0);
2194     QCOMPARE(rowsMovedSpy.count(), 1);
2195     QCOMPARE(rowsInsertedSpy.count(), 4);
2196     QCOMPARE(dataChangedSpy.count(), 4);
2197     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2198     QCOMPARE(newEntryInListSpy.count(), 4);
2199 }
2200 
restoreMultipleIdenticalTracks()2201 void MediaPlayListTest::restoreMultipleIdenticalTracks()
2202 {
2203     MediaPlayList myPlayList;
2204     QAbstractItemModelTester testModel(&myPlayList);
2205     DatabaseInterface myDatabaseContent;
2206     TracksListener myListener(&myDatabaseContent);
2207 
2208     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2209     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2210     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2211     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2212     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2213     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2214     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2215     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2216     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2217     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2218 
2219     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2220     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2221     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2222     QCOMPARE(rowsRemovedSpy.count(), 0);
2223     QCOMPARE(rowsMovedSpy.count(), 0);
2224     QCOMPARE(rowsInsertedSpy.count(), 0);
2225     QCOMPARE(dataChangedSpy.count(), 0);
2226     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2227     QCOMPARE(newEntryInListSpy.count(), 0);
2228 
2229     myDatabaseContent.init(QStringLiteral("testDbDirectContentHeaderWithRestore"));
2230 
2231     connect(&myListener, &TracksListener::trackHasChanged,
2232             &myPlayList, &MediaPlayList::trackChanged,
2233             Qt::QueuedConnection);
2234     connect(&myListener, &TracksListener::tracksListAdded,
2235             &myPlayList, &MediaPlayList::tracksListAdded,
2236             Qt::QueuedConnection);
2237     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2238             &myListener, &TracksListener::trackByNameInList,
2239             Qt::QueuedConnection);
2240     connect(&myPlayList, &MediaPlayList::newEntryInList,
2241             &myListener, &TracksListener::newEntryInList,
2242             Qt::QueuedConnection);
2243     connect(&myPlayList, &MediaPlayList::newUrlInList,
2244             &myListener, &TracksListener::newUrlInList,
2245             Qt::QueuedConnection);
2246     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2247             &myListener, &TracksListener::tracksAdded);
2248 
2249     myPlayList.enqueueRestoredEntries(
2250                 QVariantList({QStringList({{},QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), QStringLiteral("3"), QStringLiteral("3"),{}}),
2251                               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                              }));
2255 
2256     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2257     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2258     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2259     QCOMPARE(rowsRemovedSpy.count(), 0);
2260     QCOMPARE(rowsMovedSpy.count(), 0);
2261     QCOMPARE(rowsInsertedSpy.count(), 1);
2262     QCOMPARE(dataChangedSpy.count(), 0);
2263     QCOMPARE(newTrackByNameInListSpy.count(), 4);
2264     QCOMPARE(newEntryInListSpy.count(), 0);
2265 
2266     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2267 
2268     QCOMPARE(dataChangedSpy.wait(), true);
2269 
2270     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2271     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2272     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2273     QCOMPARE(rowsRemovedSpy.count(), 0);
2274     QCOMPARE(rowsMovedSpy.count(), 0);
2275     QCOMPARE(rowsInsertedSpy.count(), 1);
2276     QCOMPARE(dataChangedSpy.count(), 4);
2277     QCOMPARE(newTrackByNameInListSpy.count(), 4);
2278     QCOMPARE(newEntryInListSpy.count(), 0);
2279 
2280     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2281     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2282     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2283     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2284     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2285     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2286     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2287     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2288     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2289     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2290     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2291     QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2292     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2293     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2294     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2295     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2296     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2297     QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2298     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2299     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2300     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2301     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2302     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2303     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2304 }
2305 
restoreTrackWithoutAlbum()2306 void MediaPlayListTest::restoreTrackWithoutAlbum()
2307 {
2308     QTemporaryFile databaseFile;
2309     databaseFile.open();
2310 
2311     qDebug() << "restoreTrackWithoutAlbum" << databaseFile.fileName();
2312 
2313     MediaPlayList myPlayList;
2314     QAbstractItemModelTester testModel(&myPlayList);
2315     DatabaseInterface myDatabaseContent;
2316     TracksListener myListener(&myDatabaseContent);
2317 
2318     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2319     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2320     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2321     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2322     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2323     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2324     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2325     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2326     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2327     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2328 
2329     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2330     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2331     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2332     QCOMPARE(rowsRemovedSpy.count(), 0);
2333     QCOMPARE(rowsMovedSpy.count(), 0);
2334     QCOMPARE(rowsInsertedSpy.count(), 0);
2335     QCOMPARE(dataChangedSpy.count(), 0);
2336     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2337     QCOMPARE(newEntryInListSpy.count(), 0);
2338 
2339     myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), databaseFile.fileName());
2340 
2341     connect(&myListener, &TracksListener::trackHasChanged,
2342             &myPlayList, &MediaPlayList::trackChanged,
2343             Qt::QueuedConnection);
2344     connect(&myListener, &TracksListener::tracksListAdded,
2345             &myPlayList, &MediaPlayList::tracksListAdded,
2346             Qt::QueuedConnection);
2347     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2348             &myListener, &TracksListener::trackByNameInList,
2349             Qt::QueuedConnection);
2350     connect(&myPlayList, &MediaPlayList::newEntryInList,
2351             &myListener, &TracksListener::newEntryInList,
2352             Qt::QueuedConnection);
2353     connect(&myPlayList, &MediaPlayList::newUrlInList,
2354             &myListener, &TracksListener::newUrlInList,
2355             Qt::QueuedConnection);
2356     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2357             &myListener, &TracksListener::tracksAdded);
2358 
2359     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2360 
2361     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2362     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2363     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2364     QCOMPARE(rowsRemovedSpy.count(), 0);
2365     QCOMPARE(rowsMovedSpy.count(), 0);
2366     QCOMPARE(rowsInsertedSpy.count(), 0);
2367     QCOMPARE(dataChangedSpy.count(), 0);
2368     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2369     QCOMPARE(newEntryInListSpy.count(), 0);
2370 
2371     auto newTrack = DataTypes::TrackDataType{};
2372 
2373     newTrack[DataTypes::IdRole] = QStringLiteral("$29");
2374     newTrack[DataTypes::ParentIdRole] = QStringLiteral("0");
2375     newTrack[DataTypes::TitleRole] = QStringLiteral("track19");
2376     newTrack[DataTypes::ArtistRole] = QStringLiteral("artist2");
2377     newTrack[DataTypes::DurationRole] = QTime::fromMSecsSinceStartOfDay(29);
2378     newTrack[DataTypes::ResourceRole] = QUrl::fromLocalFile(QStringLiteral("/$29"));
2379     newTrack[DataTypes::FileModificationTime] = QDateTime::fromMSecsSinceEpoch(29);
2380     newTrack[DataTypes::ImageUrlRole] = QUrl::fromLocalFile(QStringLiteral("withoutAlbum"));
2381     newTrack[DataTypes::RatingRole] = 9;
2382     newTrack[DataTypes::IsSingleDiscAlbumRole] = true;
2383     newTrack[DataTypes::GenreRole] = QStringLiteral("genre1");
2384     newTrack[DataTypes::ComposerRole] = QStringLiteral("composer1");
2385     newTrack[DataTypes::LyricistRole] = QStringLiteral("lyricist1");
2386     newTrack[DataTypes::HasEmbeddedCover] = false;
2387     newTrack[DataTypes::ElementTypeRole] = ElisaUtils::Track;
2388 
2389     myDatabaseContent.insertTracksList({newTrack}, mNewCovers);
2390 
2391     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2392     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2393     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2394     QCOMPARE(rowsRemovedSpy.count(), 0);
2395     QCOMPARE(rowsMovedSpy.count(), 0);
2396     QCOMPARE(rowsInsertedSpy.count(), 0);
2397     QCOMPARE(dataChangedSpy.count(), 0);
2398     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2399     QCOMPARE(newEntryInListSpy.count(), 0);
2400 
2401     myPlayList.enqueueRestoredEntries(QVariantList({QStringList({QStringLiteral("0"), QStringLiteral("track19"), QStringLiteral("artist2"), {}, {}, {}, QString::number(ElisaUtils::PlayListEntryType::Unknown)})}));
2402 
2403     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2404     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2405     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2406     QCOMPARE(rowsRemovedSpy.count(), 0);
2407     QCOMPARE(rowsMovedSpy.count(), 0);
2408     QCOMPARE(rowsInsertedSpy.count(), 1);
2409     QCOMPARE(dataChangedSpy.count(), 0);
2410     QCOMPARE(newTrackByNameInListSpy.count(), 1);
2411     QCOMPARE(newEntryInListSpy.count(), 0);
2412 
2413     QCOMPARE(dataChangedSpy.wait(), true);
2414 
2415     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2416     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2417     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2418     QCOMPARE(rowsRemovedSpy.count(), 0);
2419     QCOMPARE(rowsMovedSpy.count(), 0);
2420     QCOMPARE(rowsInsertedSpy.count(), 1);
2421     QCOMPARE(dataChangedSpy.count(), 1);
2422     QCOMPARE(newTrackByNameInListSpy.count(), 1);
2423     QCOMPARE(newEntryInListSpy.count(), 0);
2424 
2425     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track19"));
2426     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QString());
2427     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
2428     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 0);
2429     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 0);
2430     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 29);
2431 }
2432 
restoreLocalTrack()2433 void MediaPlayListTest::restoreLocalTrack()
2434 {
2435     QTemporaryFile databaseFile;
2436     databaseFile.open();
2437 
2438     qDebug() << "restoreLocalTrack" << databaseFile.fileName();
2439 
2440     MediaPlayList myPlayList;
2441     QAbstractItemModelTester testModel(&myPlayList);
2442     DatabaseInterface myDatabaseContent;
2443     TracksListener myListener(&myDatabaseContent);
2444 
2445     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2446     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2447     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2448     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2449     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2450     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2451     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2452     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2453     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2454     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2455 
2456     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2457     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2458     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2459     QCOMPARE(rowsRemovedSpy.count(), 0);
2460     QCOMPARE(rowsMovedSpy.count(), 0);
2461     QCOMPARE(rowsInsertedSpy.count(), 0);
2462     QCOMPARE(dataChangedSpy.count(), 0);
2463     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2464     QCOMPARE(newEntryInListSpy.count(), 0);
2465 
2466     myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), databaseFile.fileName());
2467 
2468     connect(&myListener, &TracksListener::trackHasChanged,
2469             &myPlayList, &MediaPlayList::trackChanged,
2470             Qt::QueuedConnection);
2471     connect(&myListener, &TracksListener::tracksListAdded,
2472             &myPlayList, &MediaPlayList::tracksListAdded,
2473             Qt::QueuedConnection);
2474     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2475             &myListener, &TracksListener::trackByNameInList,
2476             Qt::QueuedConnection);
2477     connect(&myPlayList, &MediaPlayList::newEntryInList,
2478             &myListener, &TracksListener::newEntryInList,
2479             Qt::QueuedConnection);
2480     connect(&myPlayList, &MediaPlayList::newUrlInList,
2481             &myListener, &TracksListener::newUrlInList,
2482             Qt::QueuedConnection);
2483     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2484             &myListener, &TracksListener::tracksAdded);
2485 
2486     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2487 
2488     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2489     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2490     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2491     QCOMPARE(rowsRemovedSpy.count(), 0);
2492     QCOMPARE(rowsMovedSpy.count(), 0);
2493     QCOMPARE(rowsInsertedSpy.count(), 0);
2494     QCOMPARE(dataChangedSpy.count(), 0);
2495     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2496     QCOMPARE(newEntryInListSpy.count(), 0);
2497 
2498     myPlayList.enqueueRestoredEntries(QVariantList({QStringList({{},
2499                                                                  QStringLiteral("Title"),
2500                                                                  QStringLiteral("Artist"),
2501                                                                  QStringLiteral("Test"),
2502                                                                  {},
2503                                                                  {},
2504                                                                  QString::number(ElisaUtils::PlayListEntryType::Unknown),
2505                                                                  QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg")).toString()})}));
2506 
2507     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2508     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2509     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2510     QCOMPARE(rowsRemovedSpy.count(), 0);
2511     QCOMPARE(rowsMovedSpy.count(), 0);
2512     QCOMPARE(rowsInsertedSpy.count(), 1);
2513     QCOMPARE(dataChangedSpy.count(), 0);
2514     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2515     QCOMPARE(newEntryInListSpy.count(), 1);
2516 
2517     QCOMPARE(dataChangedSpy.wait(), true);
2518 
2519     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2520     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2521     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2522     QCOMPARE(rowsRemovedSpy.count(), 0);
2523     QCOMPARE(rowsMovedSpy.count(), 0);
2524     QCOMPARE(rowsInsertedSpy.count(), 1);
2525     QCOMPARE(dataChangedSpy.count(), 1);
2526     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2527     QCOMPARE(newEntryInListSpy.count(), 1);
2528 
2529     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
2530     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
2531     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
2532     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2533     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2534     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
2535     QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::IsValidRole).toBool(), true);
2536 }
2537 
testHasHeaderAlbumWithSameTitle()2538 void MediaPlayListTest::testHasHeaderAlbumWithSameTitle()
2539 {
2540     MediaPlayList myPlayList;
2541     QAbstractItemModelTester testModel(&myPlayList);
2542     DatabaseInterface myDatabaseContent;
2543     TracksListener myListener(&myDatabaseContent);
2544 
2545     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2546     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2547     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2548     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2549     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2550     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2551     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2552     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2553     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2554     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2555 
2556     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2557     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2558     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2559     QCOMPARE(rowsRemovedSpy.count(), 0);
2560     QCOMPARE(rowsMovedSpy.count(), 0);
2561     QCOMPARE(rowsInsertedSpy.count(), 0);
2562     QCOMPARE(dataChangedSpy.count(), 0);
2563     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2564     QCOMPARE(newEntryInListSpy.count(), 0);
2565 
2566     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2567 
2568     connect(&myListener, &TracksListener::trackHasChanged,
2569             &myPlayList, &MediaPlayList::trackChanged,
2570             Qt::QueuedConnection);
2571     connect(&myListener, &TracksListener::tracksListAdded,
2572             &myPlayList, &MediaPlayList::tracksListAdded,
2573             Qt::QueuedConnection);
2574     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2575             &myListener, &TracksListener::trackByNameInList,
2576             Qt::QueuedConnection);
2577     connect(&myPlayList, &MediaPlayList::newEntryInList,
2578             &myListener, &TracksListener::newEntryInList,
2579             Qt::QueuedConnection);
2580     connect(&myPlayList, &MediaPlayList::newUrlInList,
2581             &myListener, &TracksListener::newUrlInList,
2582             Qt::QueuedConnection);
2583     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2584             &myListener, &TracksListener::tracksAdded);
2585 
2586     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2587 
2588     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2589     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2590     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2591     QCOMPARE(rowsRemovedSpy.count(), 0);
2592     QCOMPARE(rowsMovedSpy.count(), 0);
2593     QCOMPARE(rowsInsertedSpy.count(), 0);
2594     QCOMPARE(dataChangedSpy.count(), 0);
2595     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2596     QCOMPARE(newEntryInListSpy.count(), 0);
2597 
2598     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
2599                                                                                QStringLiteral("album3"), 1, 1);
2600     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2601 
2602     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2603     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2604     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2605     QCOMPARE(rowsRemovedSpy.count(), 0);
2606     QCOMPARE(rowsMovedSpy.count(), 0);
2607     QCOMPARE(rowsInsertedSpy.count(), 1);
2608     QCOMPARE(dataChangedSpy.count(), 0);
2609     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2610     QCOMPARE(newEntryInListSpy.count(), 1);
2611 
2612     QCOMPARE(dataChangedSpy.wait(), true);
2613 
2614     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2615     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2616     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2617     QCOMPARE(rowsRemovedSpy.count(), 0);
2618     QCOMPARE(rowsMovedSpy.count(), 0);
2619     QCOMPARE(rowsInsertedSpy.count(), 1);
2620     QCOMPARE(dataChangedSpy.count(), 1);
2621     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2622     QCOMPARE(newEntryInListSpy.count(), 1);
2623 
2624     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
2625                                                                                 QStringLiteral("album1"), 1, 1);
2626     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2627 
2628     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2629     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2630     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2631     QCOMPARE(rowsRemovedSpy.count(), 0);
2632     QCOMPARE(rowsMovedSpy.count(), 0);
2633     QCOMPARE(rowsInsertedSpy.count(), 2);
2634     QCOMPARE(dataChangedSpy.count(), 1);
2635     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2636     QCOMPARE(newEntryInListSpy.count(), 2);
2637 
2638     QCOMPARE(dataChangedSpy.wait(), true);
2639 
2640     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2641     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2642     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2643     QCOMPARE(rowsRemovedSpy.count(), 0);
2644     QCOMPARE(rowsMovedSpy.count(), 0);
2645     QCOMPARE(rowsInsertedSpy.count(), 2);
2646     QCOMPARE(dataChangedSpy.count(), 2);
2647     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2648     QCOMPARE(newEntryInListSpy.count(), 2);
2649 
2650     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
2651                                                                                QStringLiteral("album3"), 2, 1);
2652     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2653 
2654     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2655     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2656     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2657     QCOMPARE(rowsRemovedSpy.count(), 0);
2658     QCOMPARE(rowsMovedSpy.count(), 0);
2659     QCOMPARE(rowsInsertedSpy.count(), 3);
2660     QCOMPARE(dataChangedSpy.count(), 2);
2661     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2662     QCOMPARE(newEntryInListSpy.count(), 3);
2663 
2664     QCOMPARE(dataChangedSpy.wait(), true);
2665 
2666     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2667     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2668     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2669     QCOMPARE(rowsRemovedSpy.count(), 0);
2670     QCOMPARE(rowsMovedSpy.count(), 0);
2671     QCOMPARE(rowsInsertedSpy.count(), 3);
2672     QCOMPARE(dataChangedSpy.count(), 3);
2673     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2674     QCOMPARE(newEntryInListSpy.count(), 3);
2675 
2676     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
2677                                                                                 QStringLiteral("album3"), 3, 1);
2678     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2679 
2680     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2681     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2682     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2683     QCOMPARE(rowsRemovedSpy.count(), 0);
2684     QCOMPARE(rowsMovedSpy.count(), 0);
2685     QCOMPARE(rowsInsertedSpy.count(), 4);
2686     QCOMPARE(dataChangedSpy.count(), 3);
2687     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2688     QCOMPARE(newEntryInListSpy.count(), 4);
2689 
2690     QCOMPARE(dataChangedSpy.wait(), true);
2691 
2692     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2693     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2694     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2695     QCOMPARE(rowsRemovedSpy.count(), 0);
2696     QCOMPARE(rowsMovedSpy.count(), 0);
2697     QCOMPARE(rowsInsertedSpy.count(), 4);
2698     QCOMPARE(dataChangedSpy.count(), 4);
2699     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2700     QCOMPARE(newEntryInListSpy.count(), 4);
2701 
2702     auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"),
2703                                                                               QStringLiteral("album3"), 9, 1);
2704     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fithTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2705 
2706     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2707     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2708     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
2709     QCOMPARE(rowsRemovedSpy.count(), 0);
2710     QCOMPARE(rowsMovedSpy.count(), 0);
2711     QCOMPARE(rowsInsertedSpy.count(), 5);
2712     QCOMPARE(dataChangedSpy.count(), 4);
2713     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2714     QCOMPARE(newEntryInListSpy.count(), 5);
2715 
2716     QCOMPARE(dataChangedSpy.wait(), true);
2717 
2718     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2719     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2720     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
2721     QCOMPARE(rowsRemovedSpy.count(), 0);
2722     QCOMPARE(rowsMovedSpy.count(), 0);
2723     QCOMPARE(rowsInsertedSpy.count(), 5);
2724     QCOMPARE(dataChangedSpy.count(), 5);
2725     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2726     QCOMPARE(newEntryInListSpy.count(), 5);
2727 
2728     auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"),
2729                                                                                QStringLiteral("album3"), 1, 1);
2730     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, sixthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2731 
2732     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2733     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2734     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
2735     QCOMPARE(rowsRemovedSpy.count(), 0);
2736     QCOMPARE(rowsMovedSpy.count(), 0);
2737     QCOMPARE(rowsInsertedSpy.count(), 6);
2738     QCOMPARE(dataChangedSpy.count(), 5);
2739     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2740     QCOMPARE(newEntryInListSpy.count(), 6);
2741 
2742     QCOMPARE(dataChangedSpy.wait(), true);
2743 
2744     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2745     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2746     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
2747     QCOMPARE(rowsRemovedSpy.count(), 0);
2748     QCOMPARE(rowsMovedSpy.count(), 0);
2749     QCOMPARE(rowsInsertedSpy.count(), 6);
2750     QCOMPARE(dataChangedSpy.count(), 6);
2751     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2752     QCOMPARE(newEntryInListSpy.count(), 6);
2753 }
2754 
testHasHeaderMoveFirstLikeQml()2755 void MediaPlayListTest::testHasHeaderMoveFirstLikeQml()
2756 {
2757     MediaPlayList myPlayList;
2758     QAbstractItemModelTester testModel(&myPlayList);
2759     DatabaseInterface myDatabaseContent;
2760     TracksListener myListener(&myDatabaseContent);
2761 
2762     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2763     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2764     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2765     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2766     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2767     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2768     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2769     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2770     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2771     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2772 
2773     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2774     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2775     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2776     QCOMPARE(rowsRemovedSpy.count(), 0);
2777     QCOMPARE(rowsMovedSpy.count(), 0);
2778     QCOMPARE(rowsInsertedSpy.count(), 0);
2779     QCOMPARE(dataChangedSpy.count(), 0);
2780     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2781     QCOMPARE(newEntryInListSpy.count(), 0);
2782 
2783     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2784 
2785     connect(&myListener, &TracksListener::trackHasChanged,
2786             &myPlayList, &MediaPlayList::trackChanged,
2787             Qt::QueuedConnection);
2788     connect(&myListener, &TracksListener::tracksListAdded,
2789             &myPlayList, &MediaPlayList::tracksListAdded,
2790             Qt::QueuedConnection);
2791     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2792             &myListener, &TracksListener::trackByNameInList,
2793             Qt::QueuedConnection);
2794     connect(&myPlayList, &MediaPlayList::newEntryInList,
2795             &myListener, &TracksListener::newEntryInList,
2796             Qt::QueuedConnection);
2797     connect(&myPlayList, &MediaPlayList::newUrlInList,
2798             &myListener, &TracksListener::newUrlInList,
2799             Qt::QueuedConnection);
2800     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2801             &myListener, &TracksListener::tracksAdded);
2802 
2803     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2804 
2805     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2806     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2807     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2808     QCOMPARE(rowsRemovedSpy.count(), 0);
2809     QCOMPARE(rowsMovedSpy.count(), 0);
2810     QCOMPARE(rowsInsertedSpy.count(), 0);
2811     QCOMPARE(dataChangedSpy.count(), 0);
2812     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2813     QCOMPARE(newEntryInListSpy.count(), 0);
2814 
2815     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
2816     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2817 
2818     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2819     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2820     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2821     QCOMPARE(rowsRemovedSpy.count(), 0);
2822     QCOMPARE(rowsMovedSpy.count(), 0);
2823     QCOMPARE(rowsInsertedSpy.count(), 1);
2824     QCOMPARE(dataChangedSpy.count(), 0);
2825     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2826     QCOMPARE(newEntryInListSpy.count(), 1);
2827 
2828     QCOMPARE(dataChangedSpy.wait(), true);
2829 
2830     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2831     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2832     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2833     QCOMPARE(rowsRemovedSpy.count(), 0);
2834     QCOMPARE(rowsMovedSpy.count(), 0);
2835     QCOMPARE(rowsInsertedSpy.count(), 1);
2836     QCOMPARE(dataChangedSpy.count(), 1);
2837     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2838     QCOMPARE(newEntryInListSpy.count(), 1);
2839 
2840     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
2841     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2842 
2843     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2844     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2845     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2846     QCOMPARE(rowsRemovedSpy.count(), 0);
2847     QCOMPARE(rowsMovedSpy.count(), 0);
2848     QCOMPARE(rowsInsertedSpy.count(), 2);
2849     QCOMPARE(dataChangedSpy.count(), 1);
2850     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2851     QCOMPARE(newEntryInListSpy.count(), 2);
2852 
2853     QCOMPARE(dataChangedSpy.wait(), true);
2854 
2855     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2856     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2857     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2858     QCOMPARE(rowsRemovedSpy.count(), 0);
2859     QCOMPARE(rowsMovedSpy.count(), 0);
2860     QCOMPARE(rowsInsertedSpy.count(), 2);
2861     QCOMPARE(dataChangedSpy.count(), 2);
2862     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2863     QCOMPARE(newEntryInListSpy.count(), 2);
2864 
2865     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
2866     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2867 
2868     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2869     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2870     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2871     QCOMPARE(rowsRemovedSpy.count(), 0);
2872     QCOMPARE(rowsMovedSpy.count(), 0);
2873     QCOMPARE(rowsInsertedSpy.count(), 3);
2874     QCOMPARE(dataChangedSpy.count(), 2);
2875     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2876     QCOMPARE(newEntryInListSpy.count(), 3);
2877 
2878     QCOMPARE(dataChangedSpy.wait(), true);
2879 
2880     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2881     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2882     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2883     QCOMPARE(rowsRemovedSpy.count(), 0);
2884     QCOMPARE(rowsMovedSpy.count(), 0);
2885     QCOMPARE(rowsInsertedSpy.count(), 3);
2886     QCOMPARE(dataChangedSpy.count(), 3);
2887     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2888     QCOMPARE(newEntryInListSpy.count(), 3);
2889 
2890     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
2891     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2892 
2893     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2894     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2895     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2896     QCOMPARE(rowsRemovedSpy.count(), 0);
2897     QCOMPARE(rowsMovedSpy.count(), 0);
2898     QCOMPARE(rowsInsertedSpy.count(), 4);
2899     QCOMPARE(dataChangedSpy.count(), 3);
2900     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2901     QCOMPARE(newEntryInListSpy.count(), 4);
2902 
2903     QCOMPARE(dataChangedSpy.wait(), true);
2904 
2905     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2906     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2907     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2908     QCOMPARE(rowsRemovedSpy.count(), 0);
2909     QCOMPARE(rowsMovedSpy.count(), 0);
2910     QCOMPARE(rowsInsertedSpy.count(), 4);
2911     QCOMPARE(dataChangedSpy.count(), 4);
2912     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2913     QCOMPARE(newEntryInListSpy.count(), 4);
2914 
2915     myPlayList.moveRows({}, 0, 1, {}, 3);
2916 
2917     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2918     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
2919     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2920     QCOMPARE(rowsRemovedSpy.count(), 0);
2921     QCOMPARE(rowsMovedSpy.count(), 1);
2922     QCOMPARE(rowsInsertedSpy.count(), 4);
2923     QCOMPARE(dataChangedSpy.count(), 4);
2924     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2925     QCOMPARE(newEntryInListSpy.count(), 4);
2926 }
2927 
crashOnEnqueue()2928 void MediaPlayListTest::crashOnEnqueue()
2929 {
2930     MediaPlayList myPlayList;
2931     QAbstractItemModelTester testModel(&myPlayList);
2932     DatabaseInterface myDatabaseContent;
2933     TracksListener myListener(&myDatabaseContent);
2934     CrashEnqueuePlayList myCrash(&myPlayList);
2935 
2936     connect(&myPlayList, &MediaPlayList::rowsInserted, &myCrash, &CrashEnqueuePlayList::crashMediaPlayList);
2937 
2938     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
2939     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
2940     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
2941     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
2942     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
2943     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
2944     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
2945     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2946     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2947     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2948 
2949     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2950     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2951     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2952     QCOMPARE(rowsRemovedSpy.count(), 0);
2953     QCOMPARE(rowsMovedSpy.count(), 0);
2954     QCOMPARE(rowsInsertedSpy.count(), 0);
2955     QCOMPARE(dataChangedSpy.count(), 0);
2956     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2957     QCOMPARE(newEntryInListSpy.count(), 0);
2958 
2959     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2960 
2961     connect(&myListener, &TracksListener::trackHasChanged,
2962             &myPlayList, &MediaPlayList::trackChanged,
2963             Qt::QueuedConnection);
2964     connect(&myListener, &TracksListener::tracksListAdded,
2965             &myPlayList, &MediaPlayList::tracksListAdded,
2966             Qt::QueuedConnection);
2967     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2968             &myListener, &TracksListener::trackByNameInList,
2969             Qt::QueuedConnection);
2970     connect(&myPlayList, &MediaPlayList::newEntryInList,
2971             &myListener, &TracksListener::newEntryInList,
2972             Qt::QueuedConnection);
2973     connect(&myPlayList, &MediaPlayList::newUrlInList,
2974             &myListener, &TracksListener::newUrlInList,
2975             Qt::QueuedConnection);
2976     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2977             &myListener, &TracksListener::tracksAdded);
2978 
2979     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2980 
2981     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2982     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2983     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2984     QCOMPARE(rowsRemovedSpy.count(), 0);
2985     QCOMPARE(rowsMovedSpy.count(), 0);
2986     QCOMPARE(rowsInsertedSpy.count(), 0);
2987     QCOMPARE(dataChangedSpy.count(), 0);
2988     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2989     QCOMPARE(newEntryInListSpy.count(), 0);
2990 
2991     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"),
2992                                                                              QStringLiteral("album2"), 6, 1);
2993     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
2994 
2995     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2996     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2997     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
2998     QCOMPARE(rowsRemovedSpy.count(), 0);
2999     QCOMPARE(rowsMovedSpy.count(), 0);
3000     QCOMPARE(rowsInsertedSpy.count(), 1);
3001     QCOMPARE(dataChangedSpy.count(), 0);
3002     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3003     QCOMPARE(newEntryInListSpy.count(), 1);
3004 
3005     QCOMPARE(dataChangedSpy.wait(), true);
3006 
3007     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3008     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3009     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3010     QCOMPARE(rowsRemovedSpy.count(), 0);
3011     QCOMPARE(rowsMovedSpy.count(), 0);
3012     QCOMPARE(rowsInsertedSpy.count(), 1);
3013     QCOMPARE(dataChangedSpy.count(), 1);
3014     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3015     QCOMPARE(newEntryInListSpy.count(), 1);
3016 }
3017 
testHasHeaderMoveAnotherLikeQml()3018 void MediaPlayListTest::testHasHeaderMoveAnotherLikeQml()
3019 {
3020     MediaPlayList myPlayList;
3021     QAbstractItemModelTester testModel(&myPlayList);
3022     DatabaseInterface myDatabaseContent;
3023     TracksListener myListener(&myDatabaseContent);
3024 
3025     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
3026     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
3027     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
3028     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
3029     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
3030     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
3031     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
3032     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3033     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3034     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3035 
3036     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3037     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3038     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3039     QCOMPARE(rowsRemovedSpy.count(), 0);
3040     QCOMPARE(rowsMovedSpy.count(), 0);
3041     QCOMPARE(rowsInsertedSpy.count(), 0);
3042     QCOMPARE(dataChangedSpy.count(), 0);
3043     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3044     QCOMPARE(newEntryInListSpy.count(), 0);
3045 
3046     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3047 
3048     connect(&myListener, &TracksListener::trackHasChanged,
3049             &myPlayList, &MediaPlayList::trackChanged,
3050             Qt::QueuedConnection);
3051     connect(&myListener, &TracksListener::tracksListAdded,
3052             &myPlayList, &MediaPlayList::tracksListAdded,
3053             Qt::QueuedConnection);
3054     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3055             &myListener, &TracksListener::trackByNameInList,
3056             Qt::QueuedConnection);
3057     connect(&myPlayList, &MediaPlayList::newEntryInList,
3058             &myListener, &TracksListener::newEntryInList,
3059             Qt::QueuedConnection);
3060     connect(&myPlayList, &MediaPlayList::newUrlInList,
3061             &myListener, &TracksListener::newUrlInList,
3062             Qt::QueuedConnection);
3063     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3064             &myListener, &TracksListener::tracksAdded);
3065 
3066     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3067 
3068     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3069     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3070     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3071     QCOMPARE(rowsRemovedSpy.count(), 0);
3072     QCOMPARE(rowsMovedSpy.count(), 0);
3073     QCOMPARE(rowsInsertedSpy.count(), 0);
3074     QCOMPARE(dataChangedSpy.count(), 0);
3075     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3076     QCOMPARE(newEntryInListSpy.count(), 0);
3077 
3078     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
3079     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3080 
3081     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3082     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3083     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3084     QCOMPARE(rowsRemovedSpy.count(), 0);
3085     QCOMPARE(rowsMovedSpy.count(), 0);
3086     QCOMPARE(rowsInsertedSpy.count(), 1);
3087     QCOMPARE(dataChangedSpy.count(), 0);
3088     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3089     QCOMPARE(newEntryInListSpy.count(), 1);
3090 
3091     QCOMPARE(dataChangedSpy.wait(), true);
3092 
3093     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3094     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3095     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3096     QCOMPARE(rowsRemovedSpy.count(), 0);
3097     QCOMPARE(rowsMovedSpy.count(), 0);
3098     QCOMPARE(rowsInsertedSpy.count(), 1);
3099     QCOMPARE(dataChangedSpy.count(), 1);
3100     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3101     QCOMPARE(newEntryInListSpy.count(), 1);
3102 
3103     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
3104     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3105 
3106     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3107     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3108     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3109     QCOMPARE(rowsRemovedSpy.count(), 0);
3110     QCOMPARE(rowsMovedSpy.count(), 0);
3111     QCOMPARE(rowsInsertedSpy.count(), 2);
3112     QCOMPARE(dataChangedSpy.count(), 1);
3113     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3114     QCOMPARE(newEntryInListSpy.count(), 2);
3115 
3116     QCOMPARE(dataChangedSpy.wait(), true);
3117 
3118     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3119     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3120     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3121     QCOMPARE(rowsRemovedSpy.count(), 0);
3122     QCOMPARE(rowsMovedSpy.count(), 0);
3123     QCOMPARE(rowsInsertedSpy.count(), 2);
3124     QCOMPARE(dataChangedSpy.count(), 2);
3125     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3126     QCOMPARE(newEntryInListSpy.count(), 2);
3127 
3128     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
3129     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3130 
3131     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3132     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3133     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3134     QCOMPARE(rowsRemovedSpy.count(), 0);
3135     QCOMPARE(rowsMovedSpy.count(), 0);
3136     QCOMPARE(rowsInsertedSpy.count(), 3);
3137     QCOMPARE(dataChangedSpy.count(), 2);
3138     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3139     QCOMPARE(newEntryInListSpy.count(), 3);
3140 
3141     QCOMPARE(dataChangedSpy.wait(), true);
3142 
3143     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3144     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3145     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3146     QCOMPARE(rowsRemovedSpy.count(), 0);
3147     QCOMPARE(rowsMovedSpy.count(), 0);
3148     QCOMPARE(rowsInsertedSpy.count(), 3);
3149     QCOMPARE(dataChangedSpy.count(), 3);
3150     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3151     QCOMPARE(newEntryInListSpy.count(), 3);
3152 
3153     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
3154     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3155 
3156     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3157     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3158     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3159     QCOMPARE(rowsRemovedSpy.count(), 0);
3160     QCOMPARE(rowsMovedSpy.count(), 0);
3161     QCOMPARE(rowsInsertedSpy.count(), 4);
3162     QCOMPARE(dataChangedSpy.count(), 3);
3163     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3164     QCOMPARE(newEntryInListSpy.count(), 4);
3165 
3166     QCOMPARE(dataChangedSpy.wait(), true);
3167 
3168     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3169     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3170     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3171     QCOMPARE(rowsRemovedSpy.count(), 0);
3172     QCOMPARE(rowsMovedSpy.count(), 0);
3173     QCOMPARE(rowsInsertedSpy.count(), 4);
3174     QCOMPARE(dataChangedSpy.count(), 4);
3175     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3176     QCOMPARE(newEntryInListSpy.count(), 4);
3177 
3178     myPlayList.moveRows({}, 3, 1, {}, 0);
3179 
3180     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3181     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
3182     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3183     QCOMPARE(rowsRemovedSpy.count(), 0);
3184     QCOMPARE(rowsMovedSpy.count(), 1);
3185     QCOMPARE(rowsInsertedSpy.count(), 4);
3186     QCOMPARE(dataChangedSpy.count(), 4);
3187     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3188     QCOMPARE(newEntryInListSpy.count(), 4);
3189 }
3190 
testHasHeaderYetAnotherMoveLikeQml()3191 void MediaPlayListTest::testHasHeaderYetAnotherMoveLikeQml()
3192 {
3193     MediaPlayList myPlayList;
3194     QAbstractItemModelTester testModel(&myPlayList);
3195     DatabaseInterface myDatabaseContent;
3196     TracksListener myListener(&myDatabaseContent);
3197 
3198     QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved);
3199     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved);
3200     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted);
3201     QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
3202     QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
3203     QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
3204     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
3205     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3206     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3207     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3208 
3209     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3210     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3211     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3212     QCOMPARE(rowsRemovedSpy.count(), 0);
3213     QCOMPARE(rowsMovedSpy.count(), 0);
3214     QCOMPARE(rowsInsertedSpy.count(), 0);
3215     QCOMPARE(dataChangedSpy.count(), 0);
3216     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3217     QCOMPARE(newEntryInListSpy.count(), 0);
3218 
3219     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3220 
3221     connect(&myListener, &TracksListener::trackHasChanged,
3222             &myPlayList, &MediaPlayList::trackChanged,
3223             Qt::QueuedConnection);
3224     connect(&myListener, &TracksListener::tracksListAdded,
3225             &myPlayList, &MediaPlayList::tracksListAdded,
3226             Qt::QueuedConnection);
3227     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3228             &myListener, &TracksListener::trackByNameInList,
3229             Qt::QueuedConnection);
3230     connect(&myPlayList, &MediaPlayList::newEntryInList,
3231             &myListener, &TracksListener::newEntryInList,
3232             Qt::QueuedConnection);
3233     connect(&myPlayList, &MediaPlayList::newUrlInList,
3234             &myListener, &TracksListener::newUrlInList,
3235             Qt::QueuedConnection);
3236     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3237             &myListener, &TracksListener::tracksAdded);
3238 
3239     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3240 
3241     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3242     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3243     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3244     QCOMPARE(rowsRemovedSpy.count(), 0);
3245     QCOMPARE(rowsMovedSpy.count(), 0);
3246     QCOMPARE(rowsInsertedSpy.count(), 0);
3247     QCOMPARE(dataChangedSpy.count(), 0);
3248     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3249     QCOMPARE(newEntryInListSpy.count(), 0);
3250 
3251     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
3252     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, firstTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3253 
3254     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3255     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3256     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3257     QCOMPARE(rowsRemovedSpy.count(), 0);
3258     QCOMPARE(rowsMovedSpy.count(), 0);
3259     QCOMPARE(rowsInsertedSpy.count(), 1);
3260     QCOMPARE(dataChangedSpy.count(), 0);
3261     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3262     QCOMPARE(newEntryInListSpy.count(), 1);
3263 
3264     QCOMPARE(dataChangedSpy.wait(), true);
3265 
3266     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3267     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3268     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3269     QCOMPARE(rowsRemovedSpy.count(), 0);
3270     QCOMPARE(rowsMovedSpy.count(), 0);
3271     QCOMPARE(rowsInsertedSpy.count(), 1);
3272     QCOMPARE(dataChangedSpy.count(), 1);
3273     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3274     QCOMPARE(newEntryInListSpy.count(), 1);
3275 
3276     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
3277     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3278 
3279     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3280     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3281     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3282     QCOMPARE(rowsRemovedSpy.count(), 0);
3283     QCOMPARE(rowsMovedSpy.count(), 0);
3284     QCOMPARE(rowsInsertedSpy.count(), 2);
3285     QCOMPARE(dataChangedSpy.count(), 1);
3286     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3287     QCOMPARE(newEntryInListSpy.count(), 2);
3288 
3289     QCOMPARE(dataChangedSpy.wait(), true);
3290 
3291     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3292     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3293     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3294     QCOMPARE(rowsRemovedSpy.count(), 0);
3295     QCOMPARE(rowsMovedSpy.count(), 0);
3296     QCOMPARE(rowsInsertedSpy.count(), 2);
3297     QCOMPARE(dataChangedSpy.count(), 2);
3298     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3299     QCOMPARE(newEntryInListSpy.count(), 2);
3300 
3301     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
3302     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, thirdTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3303 
3304     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3305     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3306     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3307     QCOMPARE(rowsRemovedSpy.count(), 0);
3308     QCOMPARE(rowsMovedSpy.count(), 0);
3309     QCOMPARE(rowsInsertedSpy.count(), 3);
3310     QCOMPARE(dataChangedSpy.count(), 2);
3311     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3312     QCOMPARE(newEntryInListSpy.count(), 3);
3313 
3314     QCOMPARE(dataChangedSpy.wait(), true);
3315 
3316     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3317     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3318     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3319     QCOMPARE(rowsRemovedSpy.count(), 0);
3320     QCOMPARE(rowsMovedSpy.count(), 0);
3321     QCOMPARE(rowsInsertedSpy.count(), 3);
3322     QCOMPARE(dataChangedSpy.count(), 3);
3323     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3324     QCOMPARE(newEntryInListSpy.count(), 3);
3325 
3326     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
3327     myPlayList.enqueueOneEntry({{{DataTypes::DatabaseIdRole, fourthTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}});
3328 
3329     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3330     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3331     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3332     QCOMPARE(rowsRemovedSpy.count(), 0);
3333     QCOMPARE(rowsMovedSpy.count(), 0);
3334     QCOMPARE(rowsInsertedSpy.count(), 4);
3335     QCOMPARE(dataChangedSpy.count(), 3);
3336     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3337     QCOMPARE(newEntryInListSpy.count(), 4);
3338 
3339     QCOMPARE(dataChangedSpy.wait(), true);
3340 
3341     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3342     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3343     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3344     QCOMPARE(rowsRemovedSpy.count(), 0);
3345     QCOMPARE(rowsMovedSpy.count(), 0);
3346     QCOMPARE(rowsInsertedSpy.count(), 4);
3347     QCOMPARE(dataChangedSpy.count(), 4);
3348     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3349     QCOMPARE(newEntryInListSpy.count(), 4);
3350 
3351     myPlayList.moveRows({}, 0, 1, {}, 2);
3352 
3353     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3354     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
3355     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3356     QCOMPARE(rowsRemovedSpy.count(), 0);
3357     QCOMPARE(rowsMovedSpy.count(), 1);
3358     QCOMPARE(rowsInsertedSpy.count(), 4);
3359     QCOMPARE(dataChangedSpy.count(), 4);
3360     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3361     QCOMPARE(newEntryInListSpy.count(), 4);
3362 
3363     myPlayList.moveRows({}, 2, 1, {}, 0);
3364 
3365     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3366     QCOMPARE(rowsAboutToBeMovedSpy.count(), 2);
3367     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3368     QCOMPARE(rowsRemovedSpy.count(), 0);
3369     QCOMPARE(rowsMovedSpy.count(), 2);
3370     QCOMPARE(rowsInsertedSpy.count(), 4);
3371     QCOMPARE(dataChangedSpy.count(), 4);
3372     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3373     QCOMPARE(newEntryInListSpy.count(), 4);
3374 }
3375 
CrashEnqueuePlayList(MediaPlayList * list,QObject * parent)3376 CrashEnqueuePlayList::CrashEnqueuePlayList(MediaPlayList *list, QObject *parent) : QObject(parent), mList(list)
3377 {
3378 }
3379 
crashMediaPlayList()3380 void CrashEnqueuePlayList::crashMediaPlayList()
3381 {
3382     mList->data(mList->index(0, 0), MediaPlayList::ResourceRole);
3383 }
3384 
3385 QTEST_GUILESS_MAIN(MediaPlayListTest)
3386 
3387 #include "moc_mediaplaylisttest.cpp"
3388