1 /*
2    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
3    SPDX-FileCopyrightText: 2020 (c) Alexander Stippich <a.stippich@gmx.net>
4 
5    SPDX-License-Identifier: LGPL-3.0-or-later
6  */
7 
8 #include "mediaplaylistproxymodeltest.h"
9 #include "mediaplaylisttestconfig.h"
10 
11 #include "datatypes.h"
12 #include "mediaplaylist.h"
13 #include "mediaplaylistproxymodel.h"
14 #include "databaseinterface.h"
15 #include "trackslistener.h"
16 
17 #include "config-upnp-qt.h"
18 
19 #include <QtTest>
20 #include <QUrl>
21 #include <QTime>
22 #include <QTemporaryFile>
23 #include <QAbstractItemModelTester>
24 
MediaPlayListProxyModelTest(QObject * parent)25 MediaPlayListProxyModelTest::MediaPlayListProxyModelTest(QObject *parent) : QObject(parent)
26 {
27 }
28 
initTestCase()29 void MediaPlayListProxyModelTest::initTestCase()
30 {
31     qRegisterMetaType<QHash<QString,QUrl>>("QHash<QString,QUrl>");
32     qRegisterMetaType<QVector<qlonglong>>("QVector<qlonglong>");
33     qRegisterMetaType<QHash<qlonglong,int>>("QHash<qlonglong,int>");
34     qRegisterMetaType<ElisaUtils::PlayListEntryType>("PlayListEntryType");
35 }
36 
simpleInitialCase()37 void MediaPlayListProxyModelTest::simpleInitialCase()
38 {
39     MediaPlayList myPlayList;
40     QAbstractItemModelTester testModel(&myPlayList);
41     MediaPlayListProxyModel myPlayListProxyModel;
42     myPlayListProxyModel.setPlayListModel(&myPlayList);
43     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
44     DatabaseInterface myDatabaseContent;
45     TracksListener myListener(&myDatabaseContent);
46 
47     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
48     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
49     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayList::rowsAboutToBeInserted);
50     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
51     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
52     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
53     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
54     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
55     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
56     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
57     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
58 
59     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
60     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
61     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
62     QCOMPARE(rowsRemovedSpy.count(), 0);
63     QCOMPARE(rowsMovedSpy.count(), 0);
64     QCOMPARE(rowsInsertedSpy.count(), 0);
65     QCOMPARE(persistentStateChangedSpy.count(), 0);
66     QCOMPARE(dataChangedSpy.count(), 0);
67     QCOMPARE(newTrackByNameInListSpy.count(), 0);
68     QCOMPARE(newEntryInListSpy.count(), 0);
69 
70     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
71 
72     connect(&myListener, &TracksListener::trackHasChanged,
73             &myPlayList, &MediaPlayList::trackChanged,
74             Qt::QueuedConnection);
75     connect(&myListener, &TracksListener::tracksListAdded,
76             &myPlayList, &MediaPlayList::tracksListAdded,
77             Qt::QueuedConnection);
78     connect(&myPlayList, &MediaPlayList::newEntryInList,
79             &myListener, &TracksListener::newEntryInList,
80             Qt::QueuedConnection);
81     connect(&myPlayList, &MediaPlayList::newUrlInList,
82             &myListener, &TracksListener::newUrlInList,
83             Qt::QueuedConnection);
84     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
85             &myListener, &TracksListener::trackByNameInList,
86             Qt::QueuedConnection);
87     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
88             &myListener, &TracksListener::tracksAdded);
89 
90     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
91 
92     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
93     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
94     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
95     QCOMPARE(rowsRemovedSpy.count(), 0);
96     QCOMPARE(rowsMovedSpy.count(), 0);
97     QCOMPARE(rowsInsertedSpy.count(), 0);
98     QCOMPARE(persistentStateChangedSpy.count(), 0);
99     QCOMPARE(dataChangedSpy.count(), 0);
100     QCOMPARE(newTrackByNameInListSpy.count(), 0);
101     QCOMPARE(newEntryInListSpy.count(), 0);
102 
103     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
104     auto newTrackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
105     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, newTrackID}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
106 
107     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
108     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
109     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
110     QCOMPARE(rowsRemovedSpy.count(), 0);
111     QCOMPARE(rowsMovedSpy.count(), 0);
112     QCOMPARE(rowsInsertedSpy.count(), 1);
113     QCOMPARE(persistentStateChangedSpy.count(), 1);
114     QCOMPARE(dataChangedSpy.count(), 0);
115     QCOMPARE(newTrackByNameInListSpy.count(), 0);
116     QCOMPARE(newEntryInListSpy.count(), 1);
117 
118     QCOMPARE(dataChangedSpy.wait(), true);
119 
120     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
121     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
122     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
123     QCOMPARE(rowsRemovedSpy.count(), 0);
124     QCOMPARE(rowsMovedSpy.count(), 0);
125     QCOMPARE(rowsInsertedSpy.count(), 1);
126     QCOMPARE(persistentStateChangedSpy.count(), 1);
127     QCOMPARE(dataChangedSpy.count(), 1);
128     QCOMPARE(newTrackByNameInListSpy.count(), 0);
129     QCOMPARE(newEntryInListSpy.count(), 1);
130 }
131 
enqueueAlbumCase()132 void MediaPlayListProxyModelTest::enqueueAlbumCase()
133 {
134     MediaPlayList myPlayList;
135     QAbstractItemModelTester testModel(&myPlayList);
136     MediaPlayListProxyModel myPlayListProxyModel;
137     myPlayListProxyModel.setPlayListModel(&myPlayList);
138     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
139     DatabaseInterface myDatabaseContent;
140     TracksListener myListener(&myDatabaseContent);
141 
142     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
143     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
144     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
145     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
146     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
147     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
148     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
149     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
150     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
151     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
152     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
153 
154     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
155     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
156     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
157     QCOMPARE(rowsRemovedSpy.count(), 0);
158     QCOMPARE(rowsMovedSpy.count(), 0);
159     QCOMPARE(rowsInsertedSpy.count(), 0);
160     QCOMPARE(dataChangedSpy.count(), 0);
161     QCOMPARE(newTrackByNameInListSpy.count(), 0);
162     QCOMPARE(newEntryInListSpy.count(), 0);
163 
164     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
165 
166     connect(&myListener, &TracksListener::trackHasChanged,
167             &myPlayList, &MediaPlayList::trackChanged,
168             Qt::QueuedConnection);
169     connect(&myListener, &TracksListener::tracksListAdded,
170             &myPlayList, &MediaPlayList::tracksListAdded,
171             Qt::QueuedConnection);
172     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
173             &myListener, &TracksListener::trackByNameInList,
174             Qt::QueuedConnection);
175     connect(&myPlayList, &MediaPlayList::newEntryInList,
176             &myListener, &TracksListener::newEntryInList,
177             Qt::QueuedConnection);
178     connect(&myPlayList, &MediaPlayList::newUrlInList,
179             &myListener, &TracksListener::newUrlInList,
180             Qt::QueuedConnection);
181     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
182             &myListener, &TracksListener::tracksAdded);
183 
184     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
185 
186     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
187     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
188     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
189     QCOMPARE(rowsRemovedSpy.count(), 0);
190     QCOMPARE(rowsMovedSpy.count(), 0);
191     QCOMPARE(rowsInsertedSpy.count(), 0);
192     QCOMPARE(dataChangedSpy.count(), 0);
193     QCOMPARE(newTrackByNameInListSpy.count(), 0);
194     QCOMPARE(newEntryInListSpy.count(), 0);
195 
196     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album}, {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
197                                    QStringLiteral("album2"), {}}}, {}, {});
198 
199     QVERIFY(rowsAboutToBeInsertedSpy.wait());
200 
201     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
202     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
203     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
204     QCOMPARE(rowsRemovedSpy.count(), 1);
205     QCOMPARE(rowsMovedSpy.count(), 0);
206     QCOMPARE(rowsInsertedSpy.count(), 2);
207     QCOMPARE(persistentStateChangedSpy.count(), 3);
208     QCOMPARE(dataChangedSpy.count(), 0);
209     QCOMPARE(newTrackByNameInListSpy.count(), 0);
210     QCOMPARE(newEntryInListSpy.count(), 1);
211 
212     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
213 
214     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
215     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
216     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
217     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
218     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
219     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
220     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
221     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
222     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
223     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
224     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
225     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
226     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
227     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
228     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
229     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
230     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
231     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
232     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
233     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
234     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
235     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
236     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
237     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
238     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
239     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
240     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
241     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
242     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
243     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
244     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
245     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
246     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
247     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
248     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
249     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
250     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
251     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
252     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
253     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
254     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
255     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
256 }
257 
enqueueArtistCase()258 void MediaPlayListProxyModelTest::enqueueArtistCase()
259 {
260     MediaPlayList myPlayList;
261     QAbstractItemModelTester testModel(&myPlayList);
262     MediaPlayListProxyModel myPlayListProxyModel;
263     myPlayListProxyModel.setPlayListModel(&myPlayList);
264     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
265     DatabaseInterface myDatabaseContent;
266     TracksListener myListener(&myDatabaseContent);
267 
268     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
269     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
270     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
271     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
272     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
273     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
274     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
275     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
276     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
277     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
278     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
279 
280     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
281     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
282     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
283     QCOMPARE(rowsRemovedSpy.count(), 0);
284     QCOMPARE(rowsMovedSpy.count(), 0);
285     QCOMPARE(rowsInsertedSpy.count(), 0);
286     QCOMPARE(persistentStateChangedSpy.count(), 0);
287     QCOMPARE(dataChangedSpy.count(), 0);
288     QCOMPARE(newTrackByNameInListSpy.count(), 0);
289     QCOMPARE(newEntryInListSpy.count(), 0);
290 
291     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
292 
293     connect(&myListener, &TracksListener::trackHasChanged,
294             &myPlayList, &MediaPlayList::trackChanged,
295             Qt::QueuedConnection);
296     connect(&myListener, &TracksListener::tracksListAdded,
297             &myPlayList, &MediaPlayList::tracksListAdded,
298             Qt::QueuedConnection);
299     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
300             &myListener, &TracksListener::trackByNameInList,
301             Qt::QueuedConnection);
302     connect(&myPlayList, &MediaPlayList::newEntryInList,
303             &myListener, &TracksListener::newEntryInList,
304             Qt::QueuedConnection);
305     connect(&myPlayList, &MediaPlayList::newUrlInList,
306             &myListener, &TracksListener::newUrlInList,
307             Qt::QueuedConnection);
308     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
309             &myListener, &TracksListener::tracksAdded);
310 
311     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
312 
313     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
314     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
315     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
316     QCOMPARE(rowsRemovedSpy.count(), 0);
317     QCOMPARE(rowsMovedSpy.count(), 0);
318     QCOMPARE(rowsInsertedSpy.count(), 0);
319     QCOMPARE(persistentStateChangedSpy.count(), 0);
320     QCOMPARE(dataChangedSpy.count(), 0);
321     QCOMPARE(newTrackByNameInListSpy.count(), 0);
322     QCOMPARE(newEntryInListSpy.count(), 0);
323 
324     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}}, {}, {});
325 
326     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
327     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
328     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
329     QCOMPARE(rowsRemovedSpy.count(), 0);
330     QCOMPARE(rowsMovedSpy.count(), 0);
331     QCOMPARE(rowsInsertedSpy.count(), 1);
332     QCOMPARE(persistentStateChangedSpy.count(), 1);
333     QCOMPARE(dataChangedSpy.count(), 0);
334     QCOMPARE(newTrackByNameInListSpy.count(), 0);
335     QCOMPARE(newEntryInListSpy.count(), 1);
336 
337     QCOMPARE(myPlayListProxyModel.rowCount(), 1);
338 
339     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
340 
341     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
342     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
343     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
344     QCOMPARE(rowsRemovedSpy.count(), 1);
345     QCOMPARE(rowsMovedSpy.count(), 0);
346     QCOMPARE(rowsInsertedSpy.count(), 2);
347     QCOMPARE(persistentStateChangedSpy.count(), 3);
348     QCOMPARE(dataChangedSpy.count(), 0);
349     QCOMPARE(newTrackByNameInListSpy.count(), 0);
350     QCOMPARE(newEntryInListSpy.count(), 1);
351 
352     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
353 
354     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
355     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
356     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
357     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
358     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
359     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
360     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 1);
361     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
362     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
363     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
364     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
365     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
366     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
367     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
368     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
369     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
370     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
371     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
372     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
373     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
374     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
375     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
376     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
377     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
378     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
379     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
380     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
381     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
382     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
383     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
384     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
385     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
386     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
387     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
388     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
389     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
390     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
391     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
392     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
393     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
394     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
395     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
396 }
397 
enqueueMultipleAlbumsCase()398 void MediaPlayListProxyModelTest::enqueueMultipleAlbumsCase()
399 {
400     MediaPlayList myPlayList;
401     QAbstractItemModelTester testModel(&myPlayList);
402     MediaPlayListProxyModel myPlayListProxyModel;
403     myPlayListProxyModel.setPlayListModel(&myPlayList);
404     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
405     DatabaseInterface myDatabaseContent;
406     TracksListener myListener(&myDatabaseContent);
407 
408     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
409     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
410     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
411     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
412     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
413     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
414     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
415     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
416     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
417     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
418     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
419 
420     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
421     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
422     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
423     QCOMPARE(rowsRemovedSpy.count(), 0);
424     QCOMPARE(rowsMovedSpy.count(), 0);
425     QCOMPARE(rowsInsertedSpy.count(), 0);
426     QCOMPARE(dataChangedSpy.count(), 0);
427     QCOMPARE(newTrackByNameInListSpy.count(), 0);
428     QCOMPARE(newEntryInListSpy.count(), 0);
429 
430     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
431 
432     connect(&myListener, &TracksListener::trackHasChanged,
433             &myPlayList, &MediaPlayList::trackChanged,
434             Qt::QueuedConnection);
435     connect(&myListener, &TracksListener::tracksListAdded,
436             &myPlayList, &MediaPlayList::tracksListAdded,
437             Qt::QueuedConnection);
438     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
439             &myListener, &TracksListener::trackByNameInList,
440             Qt::QueuedConnection);
441     connect(&myPlayList, &MediaPlayList::newEntryInList,
442             &myListener, &TracksListener::newEntryInList,
443             Qt::QueuedConnection);
444     connect(&myPlayList, &MediaPlayList::newUrlInList,
445             &myListener, &TracksListener::newUrlInList,
446             Qt::QueuedConnection);
447     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
448             &myListener, &TracksListener::tracksAdded);
449 
450     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
451 
452     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
453     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
454     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
455     QCOMPARE(rowsRemovedSpy.count(), 0);
456     QCOMPARE(rowsMovedSpy.count(), 0);
457     QCOMPARE(rowsInsertedSpy.count(), 0);
458     QCOMPARE(dataChangedSpy.count(), 0);
459     QCOMPARE(newTrackByNameInListSpy.count(), 0);
460     QCOMPARE(newEntryInListSpy.count(), 0);
461 
462     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
463                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
464                                    QStringLiteral("album2"), {}},
465                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Album},
466                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album3"), QStringLiteral("artist2"), QStringLiteral("/"))}},
467                                    QStringLiteral("album3"), {}}}, {}, {});
468 
469     QVERIFY(rowsAboutToBeInsertedSpy.wait());
470 
471     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
472     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
473     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
474     QCOMPARE(rowsRemovedSpy.count(), 2);
475     QCOMPARE(rowsMovedSpy.count(), 0);
476     QCOMPARE(rowsInsertedSpy.count(), 3);
477     QCOMPARE(persistentStateChangedSpy.count(), 5);
478     QCOMPARE(dataChangedSpy.count(), 0);
479     QCOMPARE(newTrackByNameInListSpy.count(), 0);
480     QCOMPARE(newEntryInListSpy.count(), 2);
481 
482     QCOMPARE(myPlayListProxyModel.rowCount(), 9);
483 
484     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
485     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
486     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
487     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
488     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
489     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
490     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
491     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
492     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
493     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
494     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
495     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
496     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
497     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
498     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
499     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
500     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
501     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
502     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
503     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
504     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
505     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
506     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
507     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
508     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
509     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
510     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
511     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
512     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
513     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
514     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
515     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
516     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
517     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
518     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
519     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
520     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
521     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
522     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
523     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
524     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
525     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumIdRole).toULongLong(), 2);
526     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
527     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
528     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
529     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
530     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
531     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 11);
532     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(6, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
533     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
534     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
535     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
536     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
537     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
538     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 12);
539     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(7, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
540     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
541     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album3"));
542     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
543     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
544     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
545     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 13);
546     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(8, 0), MediaPlayList::AlbumIdRole).toULongLong(), 3);
547 }
548 
enqueueTrackByUrl()549 void MediaPlayListProxyModelTest::enqueueTrackByUrl()
550 {
551     MediaPlayList myPlayList;
552     QAbstractItemModelTester testModel(&myPlayList);
553     MediaPlayListProxyModel myPlayListProxyModel;
554     myPlayListProxyModel.setPlayListModel(&myPlayList);
555     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
556     DatabaseInterface myDatabaseContent;
557     TracksListener myListener(&myDatabaseContent);
558 
559     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
560     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
561     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
562     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
563     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
564     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
565     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
566     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
567     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
568     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
569     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
570 
571     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
572     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
573     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
574     QCOMPARE(rowsRemovedSpy.count(), 0);
575     QCOMPARE(rowsMovedSpy.count(), 0);
576     QCOMPARE(rowsInsertedSpy.count(), 0);
577     QCOMPARE(persistentStateChangedSpy.count(), 0);
578     QCOMPARE(dataChangedSpy.count(), 0);
579     QCOMPARE(newTrackByNameInListSpy.count(), 0);
580     QCOMPARE(newEntryInListSpy.count(), 0);
581     QCOMPARE(newUrlInListSpy.count(), 0);
582 
583     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
584 
585     connect(&myListener, &TracksListener::trackHasChanged,
586             &myPlayList, &MediaPlayList::trackChanged,
587             Qt::QueuedConnection);
588     connect(&myListener, &TracksListener::tracksListAdded,
589             &myPlayList, &MediaPlayList::tracksListAdded,
590             Qt::QueuedConnection);
591     connect(&myPlayList, &MediaPlayList::newEntryInList,
592             &myListener, &TracksListener::newEntryInList,
593             Qt::QueuedConnection);
594     connect(&myPlayList, &MediaPlayList::newUrlInList,
595             &myListener, &TracksListener::newUrlInList,
596             Qt::QueuedConnection);
597     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
598             &myListener, &TracksListener::trackByNameInList,
599             Qt::QueuedConnection);
600     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
601             &myListener, &TracksListener::tracksAdded);
602 
603     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
604 
605     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
606     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
607     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
608     QCOMPARE(rowsRemovedSpy.count(), 0);
609     QCOMPARE(rowsMovedSpy.count(), 0);
610     QCOMPARE(rowsInsertedSpy.count(), 0);
611     QCOMPARE(persistentStateChangedSpy.count(), 0);
612     QCOMPARE(dataChangedSpy.count(), 0);
613     QCOMPARE(newTrackByNameInListSpy.count(), 0);
614     QCOMPARE(newEntryInListSpy.count(), 0);
615     QCOMPARE(newUrlInListSpy.count(), 0);
616 
617     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
618     auto trackData = myDatabaseContent.trackDataFromDatabaseId(newTrackID);
619     myPlayListProxyModel.enqueue({{DataTypes::ElementTypeRole, ElisaUtils::Track},
620                                   {DataTypes::ResourceRole, trackData.resourceURI()}}, {}, {}, {});
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(persistentStateChangedSpy.count(), 1);
629     QCOMPARE(dataChangedSpy.count(), 0);
630     QCOMPARE(newTrackByNameInListSpy.count(), 0);
631     QCOMPARE(newEntryInListSpy.count(), 0);
632     QCOMPARE(newUrlInListSpy.count(), 1);
633 
634     QCOMPARE(dataChangedSpy.wait(), true);
635 
636     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
637     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
638     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
639     QCOMPARE(rowsRemovedSpy.count(), 0);
640     QCOMPARE(rowsMovedSpy.count(), 0);
641     QCOMPARE(rowsInsertedSpy.count(), 1);
642     QCOMPARE(persistentStateChangedSpy.count(), 1);
643     QCOMPARE(dataChangedSpy.count(), 1);
644     QCOMPARE(newTrackByNameInListSpy.count(), 0);
645     QCOMPARE(newEntryInListSpy.count(), 0);
646     QCOMPARE(newUrlInListSpy.count(), 1);
647 }
648 
enqueueTracksByUrl()649 void MediaPlayListProxyModelTest::enqueueTracksByUrl()
650 {
651     MediaPlayList myPlayList;
652     QAbstractItemModelTester testModel(&myPlayList);
653     MediaPlayListProxyModel myPlayListProxyModel;
654     myPlayListProxyModel.setPlayListModel(&myPlayList);
655     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
656     DatabaseInterface myDatabaseContent;
657     TracksListener myListener(&myDatabaseContent);
658 
659     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
660     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
661     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
662     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
663     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
664     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
665     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
666     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
667     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
668     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
669     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
670 
671     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
672     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
673     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
674     QCOMPARE(rowsRemovedSpy.count(), 0);
675     QCOMPARE(rowsMovedSpy.count(), 0);
676     QCOMPARE(rowsInsertedSpy.count(), 0);
677     QCOMPARE(persistentStateChangedSpy.count(), 0);
678     QCOMPARE(dataChangedSpy.count(), 0);
679     QCOMPARE(newTrackByNameInListSpy.count(), 0);
680     QCOMPARE(newEntryInListSpy.count(), 0);
681     QCOMPARE(newUrlInListSpy.count(), 0);
682 
683     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
684 
685     connect(&myListener, &TracksListener::trackHasChanged,
686             &myPlayList, &MediaPlayList::trackChanged,
687             Qt::QueuedConnection);
688     connect(&myListener, &TracksListener::tracksListAdded,
689             &myPlayList, &MediaPlayList::tracksListAdded,
690             Qt::QueuedConnection);
691     connect(&myPlayList, &MediaPlayList::newEntryInList,
692             &myListener, &TracksListener::newEntryInList,
693             Qt::QueuedConnection);
694     connect(&myPlayList, &MediaPlayList::newUrlInList,
695             &myListener, &TracksListener::newUrlInList,
696             Qt::QueuedConnection);
697     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
698             &myListener, &TracksListener::trackByNameInList,
699             Qt::QueuedConnection);
700     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
701             &myListener, &TracksListener::tracksAdded);
702 
703     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
704 
705     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
706     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
707     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
708     QCOMPARE(rowsRemovedSpy.count(), 0);
709     QCOMPARE(rowsMovedSpy.count(), 0);
710     QCOMPARE(rowsInsertedSpy.count(), 0);
711     QCOMPARE(persistentStateChangedSpy.count(), 0);
712     QCOMPARE(dataChangedSpy.count(), 0);
713     QCOMPARE(newTrackByNameInListSpy.count(), 0);
714     QCOMPARE(newEntryInListSpy.count(), 0);
715     QCOMPARE(newUrlInListSpy.count(), 0);
716 
717     auto firstNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"), QStringLiteral("album2"), 6, 1);
718     auto firstTrackData = myDatabaseContent.trackDataFromDatabaseId(firstNewTrackID);
719     auto secondNewTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
720     auto secondTrackData = myDatabaseContent.trackDataFromDatabaseId(secondNewTrackID);
721     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
722                                     {DataTypes::ResourceRole, firstTrackData.resourceURI()}}, {}, {}},
723                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
724                                     {DataTypes::ResourceRole, secondTrackData.resourceURI()}}, {}, {}}}, {}, {});
725 
726     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
727     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
728     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
729     QCOMPARE(rowsRemovedSpy.count(), 0);
730     QCOMPARE(rowsMovedSpy.count(), 0);
731     QCOMPARE(rowsInsertedSpy.count(), 1);
732     QCOMPARE(persistentStateChangedSpy.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(dataChangedSpy.wait(), true);
739 
740     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
741     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
742     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
743     QCOMPARE(rowsRemovedSpy.count(), 0);
744     QCOMPARE(rowsMovedSpy.count(), 0);
745     QCOMPARE(rowsInsertedSpy.count(), 1);
746     QCOMPARE(persistentStateChangedSpy.count(), 1);
747     QCOMPARE(dataChangedSpy.count(), 2);
748     QCOMPARE(newTrackByNameInListSpy.count(), 0);
749     QCOMPARE(newEntryInListSpy.count(), 0);
750     QCOMPARE(newUrlInListSpy.count(), 2);
751 }
752 
enqueueReplaceAndPlay()753 void MediaPlayListProxyModelTest::enqueueReplaceAndPlay()
754 {
755     MediaPlayList myPlayList;
756     QAbstractItemModelTester testModel(&myPlayList);
757     MediaPlayListProxyModel myPlayListProxyModel;
758     myPlayListProxyModel.setPlayListModel(&myPlayList);
759     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
760     DatabaseInterface myDatabaseContent;
761     TracksListener myListener(&myDatabaseContent);
762 
763     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
764     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
765     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
766     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
767     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
768     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
769     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
770     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
771     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
772     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
773     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
774 
775     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
776     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
777     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
778     QCOMPARE(rowsRemovedSpy.count(), 0);
779     QCOMPARE(rowsMovedSpy.count(), 0);
780     QCOMPARE(rowsInsertedSpy.count(), 0);
781     QCOMPARE(persistentStateChangedSpy.count(), 0);
782     QCOMPARE(dataChangedSpy.count(), 0);
783     QCOMPARE(newTrackByNameInListSpy.count(), 0);
784     QCOMPARE(newEntryInListSpy.count(), 0);
785 
786     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
787 
788     connect(&myListener, &TracksListener::trackHasChanged,
789             &myPlayList, &MediaPlayList::trackChanged,
790             Qt::QueuedConnection);
791     connect(&myListener, &TracksListener::tracksListAdded,
792             &myPlayList, &MediaPlayList::tracksListAdded,
793             Qt::QueuedConnection);
794     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
795             &myListener, &TracksListener::trackByNameInList,
796             Qt::QueuedConnection);
797     connect(&myPlayList, &MediaPlayList::newEntryInList,
798             &myListener, &TracksListener::newEntryInList,
799             Qt::QueuedConnection);
800     connect(&myPlayList, &MediaPlayList::newUrlInList,
801             &myListener, &TracksListener::newUrlInList,
802             Qt::QueuedConnection);
803     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
804             &myListener, &TracksListener::tracksAdded);
805 
806     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
807 
808     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
809     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
810     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
811     QCOMPARE(rowsRemovedSpy.count(), 0);
812     QCOMPARE(rowsMovedSpy.count(), 0);
813     QCOMPARE(rowsInsertedSpy.count(), 0);
814     QCOMPARE(persistentStateChangedSpy.count(), 0);
815     QCOMPARE(dataChangedSpy.count(), 0);
816     QCOMPARE(newTrackByNameInListSpy.count(), 0);
817     QCOMPARE(newEntryInListSpy.count(), 0);
818 
819     auto firstTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), QStringLiteral("artist1 and artist2"),
820                                                                                QStringLiteral("album2"), 6, 1);
821     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, firstTrackID},{DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
822 
823     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
824     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
825     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
826     QCOMPARE(rowsRemovedSpy.count(), 0);
827     QCOMPARE(rowsMovedSpy.count(), 0);
828     QCOMPARE(rowsInsertedSpy.count(), 1);
829     QCOMPARE(persistentStateChangedSpy.count(), 1);
830     QCOMPARE(dataChangedSpy.count(), 0);
831     QCOMPARE(newTrackByNameInListSpy.count(), 0);
832     QCOMPARE(newEntryInListSpy.count(), 1);
833 
834     QCOMPARE(dataChangedSpy.wait(), true);
835 
836     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
837     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
838     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
839     QCOMPARE(rowsRemovedSpy.count(), 0);
840     QCOMPARE(rowsMovedSpy.count(), 0);
841     QCOMPARE(rowsInsertedSpy.count(), 1);
842     QCOMPARE(persistentStateChangedSpy.count(), 1);
843     QCOMPARE(dataChangedSpy.count(), 1);
844     QCOMPARE(newTrackByNameInListSpy.count(), 0);
845     QCOMPARE(newEntryInListSpy.count(), 1);
846 
847     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
848     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
849     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
850     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
851     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
852     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
853 
854     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
855     myPlayListProxyModel.enqueue({{{{DataTypes::DatabaseIdRole, secondTrackId}, {DataTypes::ElementTypeRole, ElisaUtils::Track}}, {}, {}}}, {}, {});
856 
857     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
858     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
859     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
860     QCOMPARE(rowsRemovedSpy.count(), 0);
861     QCOMPARE(rowsMovedSpy.count(), 0);
862     QCOMPARE(rowsInsertedSpy.count(), 2);
863     QCOMPARE(persistentStateChangedSpy.count(), 2);
864     QCOMPARE(dataChangedSpy.count(), 1);
865     QCOMPARE(newTrackByNameInListSpy.count(), 0);
866     QCOMPARE(newEntryInListSpy.count(), 2);
867 
868     QCOMPARE(dataChangedSpy.wait(), true);
869 
870     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
871     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
872     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
873     QCOMPARE(rowsRemovedSpy.count(), 0);
874     QCOMPARE(rowsMovedSpy.count(), 0);
875     QCOMPARE(rowsInsertedSpy.count(), 2);
876     QCOMPARE(persistentStateChangedSpy.count(), 2);
877     QCOMPARE(dataChangedSpy.count(), 2);
878     QCOMPARE(newTrackByNameInListSpy.count(), 0);
879     QCOMPARE(newEntryInListSpy.count(), 2);
880 
881     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
882     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
883     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
884     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
885     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
886 
887     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
888                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}},
889                                    QStringLiteral("album1"), {}}},
890                                  ElisaUtils::ReplacePlayList,
891                                  ElisaUtils::TriggerPlay);
892 
893     QVERIFY(rowsAboutToBeInsertedSpy.wait());
894 
895     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
896     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
897     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
898     QCOMPARE(rowsRemovedSpy.count(), 2);
899     QCOMPARE(rowsMovedSpy.count(), 0);
900     QCOMPARE(rowsInsertedSpy.count(), 4);
901     QCOMPARE(persistentStateChangedSpy.count(), 6);
902     QCOMPARE(dataChangedSpy.count(), 2);
903     QCOMPARE(newTrackByNameInListSpy.count(), 0);
904     QCOMPARE(newEntryInListSpy.count(), 3);
905 
906     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
907     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
908     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
909     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
910     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
911     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
912     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
913     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
914     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
915     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
916     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
917     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
918     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
919     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
920     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
921     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
922     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
923     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
924     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
925     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
926     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4"));
927     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
928     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4);
929     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4);
930 }
931 
removeFirstTrackOfAlbum()932 void MediaPlayListProxyModelTest::removeFirstTrackOfAlbum()
933 {
934     MediaPlayList myPlayList;
935     QAbstractItemModelTester testModel(&myPlayList);
936     MediaPlayListProxyModel myPlayListProxyModel;
937     myPlayListProxyModel.setPlayListModel(&myPlayList);
938     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
939     DatabaseInterface myDatabaseContent;
940     TracksListener myListener(&myDatabaseContent);
941 
942     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
943     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
944     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
945     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
946     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
947     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
948     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
949     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
950     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
951     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
952     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
953 
954     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
955     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
956     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
957     QCOMPARE(rowsRemovedSpy.count(), 0);
958     QCOMPARE(rowsMovedSpy.count(), 0);
959     QCOMPARE(rowsInsertedSpy.count(), 0);
960     QCOMPARE(persistentStateChangedSpy.count(), 0);
961     QCOMPARE(dataChangedSpy.count(), 0);
962     QCOMPARE(newTrackByNameInListSpy.count(), 0);
963     QCOMPARE(newEntryInListSpy.count(), 0);
964 
965     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
966 
967     connect(&myListener, &TracksListener::trackHasChanged,
968             &myPlayList, &MediaPlayList::trackChanged,
969             Qt::QueuedConnection);
970     connect(&myListener, &TracksListener::tracksListAdded,
971             &myPlayList, &MediaPlayList::tracksListAdded,
972             Qt::QueuedConnection);
973     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
974             &myListener, &TracksListener::trackByNameInList,
975             Qt::QueuedConnection);
976     connect(&myPlayList, &MediaPlayList::newEntryInList,
977             &myListener, &TracksListener::newEntryInList,
978             Qt::QueuedConnection);
979     connect(&myPlayList, &MediaPlayList::newUrlInList,
980             &myListener, &TracksListener::newUrlInList,
981             Qt::QueuedConnection);
982     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
983             &myListener, &TracksListener::tracksAdded);
984 
985     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
986 
987     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
988     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
989     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
990     QCOMPARE(rowsRemovedSpy.count(), 0);
991     QCOMPARE(rowsMovedSpy.count(), 0);
992     QCOMPARE(rowsInsertedSpy.count(), 0);
993     QCOMPARE(persistentStateChangedSpy.count(), 0);
994     QCOMPARE(dataChangedSpy.count(), 0);
995     QCOMPARE(newTrackByNameInListSpy.count(), 0);
996     QCOMPARE(newEntryInListSpy.count(), 0);
997 
998     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
999                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
1000                                    QStringLiteral("album2"), {}}}, {}, {});
1001 
1002     QVERIFY(rowsAboutToBeInsertedSpy.wait());
1003 
1004     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
1005     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1006     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1007     QCOMPARE(rowsRemovedSpy.count(), 1);
1008     QCOMPARE(rowsMovedSpy.count(), 0);
1009     QCOMPARE(rowsInsertedSpy.count(), 2);
1010     QCOMPARE(persistentStateChangedSpy.count(), 3);
1011     QCOMPARE(dataChangedSpy.count(), 0);
1012     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1013     QCOMPARE(newEntryInListSpy.count(), 1);
1014 
1015     myPlayListProxyModel.removeRow(0);
1016 
1017     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
1018     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
1019     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
1020     QCOMPARE(rowsRemovedSpy.count(), 2);
1021     QCOMPARE(rowsMovedSpy.count(), 0);
1022     QCOMPARE(rowsInsertedSpy.count(), 2);
1023     QCOMPARE(persistentStateChangedSpy.count(), 4);
1024     QCOMPARE(dataChangedSpy.count(), 0);
1025     QCOMPARE(newTrackByNameInListSpy.count(), 0);
1026     QCOMPARE(newEntryInListSpy.count(), 1);
1027 }
1028 
testSaveLoadPlayList()1029 void MediaPlayListProxyModelTest::testSaveLoadPlayList()
1030 {
1031     MediaPlayList myPlayListSave;
1032     MediaPlayListProxyModel myPlayListProxyModelSave;
1033     myPlayListProxyModelSave.setPlayListModel(&myPlayListSave);
1034     QAbstractItemModelTester testModelSave(&myPlayListProxyModelSave);
1035     DatabaseInterface myDatabaseContent;
1036     TracksListener myListenerSave(&myDatabaseContent);
1037     MediaPlayList myPlayListRestore;
1038     MediaPlayListProxyModel myPlayListProxyModelRestore;
1039     myPlayListProxyModelRestore.setPlayListModel(&myPlayListRestore);
1040     QAbstractItemModelTester testModelRestore(&myPlayListProxyModelRestore);
1041     TracksListener myListenerRestore(&myDatabaseContent);
1042 
1043     QSignalSpy currentTrackChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::currentTrackChanged);
1044     QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::shufflePlayListChanged);
1045     QSignalSpy repeatModeChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::repeatModeChanged);
1046     QSignalSpy playListFinishedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListFinished);
1047     QSignalSpy playListLoadedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoaded);
1048     QSignalSpy playListLoadFailedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::playListLoadFailed);
1049     QSignalSpy dataChangedSaveSpy(&myPlayListProxyModelSave, &MediaPlayListProxyModel::dataChanged);
1050     QSignalSpy currentTrackChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::currentTrackChanged);
1051     QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::shufflePlayListChanged);
1052     QSignalSpy repeatModeChangedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::repeatModeChanged);
1053     QSignalSpy playListFinishedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListFinished);
1054     QSignalSpy playListLoadedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoaded);
1055     QSignalSpy playListLoadFailedRestoreSpy(&myPlayListProxyModelRestore, &MediaPlayListProxyModel::playListLoadFailed);
1056 
1057     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1058 
1059     connect(&myListenerSave, &TracksListener::trackHasChanged,
1060             &myPlayListSave, &MediaPlayList::trackChanged,
1061             Qt::QueuedConnection);
1062     connect(&myListenerSave, &TracksListener::tracksListAdded,
1063             &myPlayListSave, &MediaPlayList::tracksListAdded,
1064             Qt::QueuedConnection);
1065     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1066             &myListenerSave, &TracksListener::trackByNameInList,
1067             Qt::QueuedConnection);
1068     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1069             &myListenerSave, &TracksListener::newEntryInList,
1070             Qt::QueuedConnection);
1071     connect(&myPlayListSave, &MediaPlayList::newUrlInList,
1072             &myListenerSave, &TracksListener::newUrlInList,
1073             Qt::QueuedConnection);
1074     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1075             &myListenerSave, &TracksListener::tracksAdded);
1076     connect(&myListenerRestore, &TracksListener::trackHasChanged,
1077             &myPlayListRestore, &MediaPlayList::trackChanged,
1078             Qt::QueuedConnection);
1079     connect(&myListenerRestore, &TracksListener::tracksListAdded,
1080             &myPlayListRestore, &MediaPlayList::tracksListAdded,
1081             Qt::QueuedConnection);
1082     connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList,
1083             &myListenerRestore, &TracksListener::trackByNameInList,
1084             Qt::QueuedConnection);
1085     connect(&myPlayListRestore, &MediaPlayList::newEntryInList,
1086             &myListenerRestore, &TracksListener::newEntryInList,
1087             Qt::QueuedConnection);
1088     connect(&myPlayListRestore, &MediaPlayList::newUrlInList,
1089             &myListenerRestore, &TracksListener::newUrlInList,
1090             Qt::QueuedConnection);
1091     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1092             &myListenerRestore, &TracksListener::tracksAdded);
1093 
1094     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1095     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1096     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1097     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1098     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1099     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1100     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1101     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1102     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1103     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1104     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1105     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1106 
1107     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1108 
1109     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1110     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1111     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1112     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1113     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1114     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1115     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1116     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1117     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1118     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1119     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1120     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1121 
1122     myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1123                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1124                                        QStringLiteral("track1"), {}}}, {}, {});
1125     myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1126                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1127                                        QStringLiteral("track3"), {}}}, {}, {});
1128     myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1129                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1130                                        QStringLiteral("track5"), {}}}, {}, {});
1131     myPlayListProxyModelSave.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1132                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}},
1133                                        QStringLiteral("track1"), {}}}, {}, {});
1134 
1135     QVERIFY(dataChangedSaveSpy.wait());
1136 
1137     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1138     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1139     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1140     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1141     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1142     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1143     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1144     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1145     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1146     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1147     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1148     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1149 
1150     QCOMPARE(myPlayListProxyModelSave.currentTrack(), QPersistentModelIndex(myPlayListProxyModelSave.index(0, 0)));
1151 
1152     QTemporaryFile playlistFile(QStringLiteral("./myPlaylistXXXXXX.m3u8"));
1153     playlistFile.open();
1154 
1155     QCOMPARE(myPlayListProxyModelSave.savePlayList(QUrl::fromLocalFile(playlistFile.fileName())), true);
1156 
1157     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1158     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1159     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1160     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1161     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1162     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1163     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1164     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1165     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1166     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1167     QCOMPARE(playListLoadedRestoreSpy.count(), 0);
1168     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1169 
1170     myPlayListProxyModelRestore.loadPlayList(QUrl::fromLocalFile(playlistFile.fileName()));
1171 
1172     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1173     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1174     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1175     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1176     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1177     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1178     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1179     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1180     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1181     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1182     QCOMPARE(playListLoadedRestoreSpy.count(), 1);
1183     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1184 
1185     QCOMPARE(currentTrackChangedRestoreSpy.wait(), true);
1186 
1187     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1188     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1189     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1190     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1191     QCOMPARE(playListLoadedSaveSpy.count(), 0);
1192     QCOMPARE(playListLoadFailedSaveSpy.count(), 0);
1193     QCOMPARE(currentTrackChangedRestoreSpy.count(), 1);
1194     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1195     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1196     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1197     QCOMPARE(playListLoadedRestoreSpy.count(), 1);
1198     QCOMPARE(playListLoadFailedRestoreSpy.count(), 0);
1199 
1200     QCOMPARE(myPlayListProxyModelRestore.currentTrack(), QPersistentModelIndex(myPlayListProxyModelRestore.index(0, 0)));
1201 }
1202 
testSavePersistentState()1203 void MediaPlayListProxyModelTest::testSavePersistentState()
1204 {
1205     MediaPlayList myPlayListSave;
1206     QAbstractItemModelTester testModelSave(&myPlayListSave);
1207     MediaPlayListProxyModel myPlayListSaveProxyModel;
1208     myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave);
1209     QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel);
1210     DatabaseInterface myDatabaseContent;
1211     TracksListener myListenerSave(&myDatabaseContent);
1212     MediaPlayList myPlayListRead;
1213     QAbstractItemModelTester testModelRead(&myPlayListRead);
1214     MediaPlayListProxyModel myPlayListReadProxyModel;
1215     myPlayListReadProxyModel.setPlayListModel(&myPlayListRead);
1216     QAbstractItemModelTester testProxyModelRead(&myPlayListReadProxyModel);
1217     TracksListener myListenerRead(&myDatabaseContent);
1218 
1219     QSignalSpy rowsAboutToBeMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
1220     QSignalSpy rowsAboutToBeRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
1221     QSignalSpy rowsAboutToBeInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
1222     QSignalSpy rowsMovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsMoved);
1223     QSignalSpy rowsRemovedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsRemoved);
1224     QSignalSpy rowsInsertedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::rowsInserted);
1225     QSignalSpy persistentStateChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
1226     QSignalSpy dataChangedSpySave(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged);
1227     QSignalSpy rowsAboutToBeMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
1228     QSignalSpy rowsAboutToBeRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
1229     QSignalSpy rowsAboutToBeInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
1230     QSignalSpy rowsMovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsMoved);
1231     QSignalSpy rowsRemovedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsRemoved);
1232     QSignalSpy rowsInsertedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::rowsInserted);
1233     QSignalSpy persistentStateChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
1234     QSignalSpy dataChangedSpyRead(&myPlayListReadProxyModel, &MediaPlayListProxyModel::dataChanged);
1235 
1236     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1237     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1238     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0);
1239     QCOMPARE(rowsRemovedSpySave.count(), 0);
1240     QCOMPARE(rowsMovedSpySave.count(), 0);
1241     QCOMPARE(rowsInsertedSpySave.count(), 0);
1242     QCOMPARE(persistentStateChangedSpySave.count(), 0);
1243     QCOMPARE(dataChangedSpySave.count(), 0);
1244     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1245     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1246     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1247     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1248     QCOMPARE(rowsMovedSpyRead.count(), 0);
1249     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1250     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1251     QCOMPARE(dataChangedSpyRead.count(), 0);
1252 
1253     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1254 
1255     connect(&myListenerSave, &TracksListener::trackHasChanged,
1256             &myPlayListSave, &MediaPlayList::trackChanged,
1257             Qt::QueuedConnection);
1258     connect(&myListenerSave, &TracksListener::tracksListAdded,
1259             &myPlayListSave, &MediaPlayList::tracksListAdded,
1260             Qt::QueuedConnection);
1261     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1262             &myListenerSave, &TracksListener::trackByNameInList,
1263             Qt::QueuedConnection);
1264     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1265             &myListenerSave, &TracksListener::newEntryInList,
1266             Qt::QueuedConnection);
1267     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1268             &myListenerSave, &TracksListener::tracksAdded);
1269     connect(&myListenerRead, &TracksListener::trackHasChanged,
1270             &myPlayListRead, &MediaPlayList::trackChanged,
1271             Qt::QueuedConnection);
1272     connect(&myListenerRead, &TracksListener::tracksListAdded,
1273             &myPlayListRead, &MediaPlayList::tracksListAdded,
1274             Qt::QueuedConnection);
1275     connect(&myPlayListRead, &MediaPlayList::newTrackByNameInList,
1276             &myListenerRead, &TracksListener::trackByNameInList,
1277             Qt::QueuedConnection);
1278     connect(&myPlayListRead, &MediaPlayList::newEntryInList,
1279             &myListenerRead, &TracksListener::newEntryInList,
1280             Qt::QueuedConnection);
1281     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1282             &myListenerRead, &TracksListener::tracksAdded);
1283 
1284     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1285 
1286     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1287     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1288     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 0);
1289     QCOMPARE(rowsRemovedSpySave.count(), 0);
1290     QCOMPARE(rowsMovedSpySave.count(), 0);
1291     QCOMPARE(rowsInsertedSpySave.count(), 0);
1292     QCOMPARE(persistentStateChangedSpySave.count(), 0);
1293     QCOMPARE(dataChangedSpySave.count(), 0);
1294     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1295     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1296     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1297     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1298     QCOMPARE(rowsMovedSpyRead.count(), 0);
1299     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1300     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1301     QCOMPARE(dataChangedSpyRead.count(), 0);
1302 
1303     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
1304                                                                                QStringLiteral("album3"), 1, 1);
1305     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1306                                         {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
1307 
1308     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1309     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1310     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1);
1311     QCOMPARE(rowsRemovedSpySave.count(), 0);
1312     QCOMPARE(rowsMovedSpySave.count(), 0);
1313     QCOMPARE(rowsInsertedSpySave.count(), 1);
1314     QCOMPARE(persistentStateChangedSpySave.count(), 1);
1315     QCOMPARE(dataChangedSpySave.count(), 0);
1316     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1317     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1318     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1319     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1320     QCOMPARE(rowsMovedSpyRead.count(), 0);
1321     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1322     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1323     QCOMPARE(dataChangedSpyRead.count(), 0);
1324 
1325     QCOMPARE(dataChangedSpySave.wait(), true);
1326 
1327     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1328     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1329     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 1);
1330     QCOMPARE(rowsRemovedSpySave.count(), 0);
1331     QCOMPARE(rowsMovedSpySave.count(), 0);
1332     QCOMPARE(rowsInsertedSpySave.count(), 1);
1333     QCOMPARE(persistentStateChangedSpySave.count(), 1);
1334     QCOMPARE(dataChangedSpySave.count(), 1);
1335     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1336     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1337     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1338     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1339     QCOMPARE(rowsMovedSpyRead.count(), 0);
1340     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1341     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1342     QCOMPARE(dataChangedSpyRead.count(), 0);
1343 
1344     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
1345                                                                                 QStringLiteral("album1"), 1, 1);
1346     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1347                                         {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
1348 
1349     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1350     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1351     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2);
1352     QCOMPARE(rowsRemovedSpySave.count(), 0);
1353     QCOMPARE(rowsMovedSpySave.count(), 0);
1354     QCOMPARE(rowsInsertedSpySave.count(), 2);
1355     QCOMPARE(persistentStateChangedSpySave.count(), 2);
1356     QCOMPARE(dataChangedSpySave.count(), 1);
1357     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1358     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1359     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1360     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1361     QCOMPARE(rowsMovedSpyRead.count(), 0);
1362     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1363     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1364     QCOMPARE(dataChangedSpyRead.count(), 0);
1365 
1366     QCOMPARE(dataChangedSpySave.wait(), true);
1367 
1368     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1369     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1370     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 2);
1371     QCOMPARE(rowsRemovedSpySave.count(), 0);
1372     QCOMPARE(rowsMovedSpySave.count(), 0);
1373     QCOMPARE(rowsInsertedSpySave.count(), 2);
1374     QCOMPARE(persistentStateChangedSpySave.count(), 2);
1375     QCOMPARE(dataChangedSpySave.count(), 2);
1376     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1377     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1378     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1379     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1380     QCOMPARE(rowsMovedSpyRead.count(), 0);
1381     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1382     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1383     QCOMPARE(dataChangedSpyRead.count(), 0);
1384 
1385     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
1386                                                                                QStringLiteral("album3"), 2, 1);
1387     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1388                                         {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
1389 
1390     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1391     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1392     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1393     QCOMPARE(rowsRemovedSpySave.count(), 0);
1394     QCOMPARE(rowsMovedSpySave.count(), 0);
1395     QCOMPARE(rowsInsertedSpySave.count(), 3);
1396     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1397     QCOMPARE(dataChangedSpySave.count(), 2);
1398     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1399     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1400     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1401     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1402     QCOMPARE(rowsMovedSpyRead.count(), 0);
1403     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1404     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1405     QCOMPARE(dataChangedSpyRead.count(), 0);
1406 
1407     QCOMPARE(dataChangedSpySave.wait(), true);
1408 
1409     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1410     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1411     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1412     QCOMPARE(rowsRemovedSpySave.count(), 0);
1413     QCOMPARE(rowsMovedSpySave.count(), 0);
1414     QCOMPARE(rowsInsertedSpySave.count(), 3);
1415     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1416     QCOMPARE(dataChangedSpySave.count(), 3);
1417     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1418     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1419     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 0);
1420     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1421     QCOMPARE(rowsMovedSpyRead.count(), 0);
1422     QCOMPARE(rowsInsertedSpyRead.count(), 0);
1423     QCOMPARE(persistentStateChangedSpyRead.count(), 0);
1424     QCOMPARE(dataChangedSpyRead.count(), 0);
1425 
1426     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1427     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1428     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11);
1429     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1430     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1431     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1432     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1433     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1434     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1435     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11")));
1436     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1437     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1438     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1439     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1440     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1441     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1442     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1443     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1444     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1445     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1446     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
1447     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1")));
1448     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1449     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
1450     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1451     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1452     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12);
1453     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1454     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1455     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1456     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1457     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1458     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1459     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12")));
1460     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1461     QCOMPARE(myPlayListSaveProxyModel.data(myPlayListSaveProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1462 
1463     myPlayListReadProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState());
1464 
1465     QCOMPARE(dataChangedSpyRead.wait(), true);
1466 
1467     QCOMPARE(rowsAboutToBeRemovedSpySave.count(), 0);
1468     QCOMPARE(rowsAboutToBeMovedSpySave.count(), 0);
1469     QCOMPARE(rowsAboutToBeInsertedSpySave.count(), 3);
1470     QCOMPARE(rowsRemovedSpySave.count(), 0);
1471     QCOMPARE(rowsMovedSpySave.count(), 0);
1472     QCOMPARE(rowsInsertedSpySave.count(), 3);
1473     QCOMPARE(persistentStateChangedSpySave.count(), 3);
1474     QCOMPARE(dataChangedSpySave.count(), 3);
1475     QCOMPARE(rowsAboutToBeRemovedSpyRead.count(), 0);
1476     QCOMPARE(rowsAboutToBeMovedSpyRead.count(), 0);
1477     QCOMPARE(rowsAboutToBeInsertedSpyRead.count(), 1);
1478     QCOMPARE(rowsRemovedSpyRead.count(), 0);
1479     QCOMPARE(rowsMovedSpyRead.count(), 0);
1480     QCOMPARE(rowsInsertedSpyRead.count(), 1);
1481     QCOMPARE(persistentStateChangedSpyRead.count(), 2);
1482     QCOMPARE(dataChangedSpyRead.count(), 3);
1483 
1484     QCOMPARE(myPlayListReadProxyModel.tracksCount(), 3);
1485 
1486     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1487     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1488     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 11);
1489     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1490     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1491     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1492     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1493     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1494     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1495     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$11")));
1496     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1497     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1498     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1499     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
1500     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 1);
1501     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
1502     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
1503     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
1504     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
1505     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1506     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
1507     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$1")));
1508     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1509     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
1510     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
1511     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
1512     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 12);
1513     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist2"));
1514     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist2"));
1515     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album3"));
1516     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
1517     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
1518     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album3")));
1519     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$12")));
1520     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
1521     QCOMPARE(myPlayListReadProxyModel.data(myPlayListReadProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), true);
1522 }
1523 
testRestoreSettings()1524 void MediaPlayListProxyModelTest::testRestoreSettings()
1525 {
1526     MediaPlayList myPlayListModel;
1527     MediaPlayListProxyModel myPlayList;
1528     myPlayList.setPlayListModel(&myPlayListModel);
1529     QAbstractItemModelTester testModel(&myPlayList);
1530     DatabaseInterface myDatabaseContent;
1531     TracksListener myListener(&myDatabaseContent);
1532 
1533     QSignalSpy currentTrackChangedSpy(&myPlayList, &MediaPlayListProxyModel::currentTrackChanged);
1534     QSignalSpy shufflePlayListChangedSpy(&myPlayList, &MediaPlayListProxyModel::shufflePlayListChanged);
1535     QSignalSpy repeatModeChangedSpy(&myPlayList, &MediaPlayListProxyModel::repeatModeChanged);
1536     QSignalSpy playListFinishedSpy(&myPlayList, &MediaPlayListProxyModel::playListFinished);
1537     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
1538 
1539     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1540 
1541     connect(&myListener, &TracksListener::trackHasChanged,
1542             &myPlayListModel, &MediaPlayList::trackChanged,
1543             Qt::QueuedConnection);
1544     connect(&myListener, &TracksListener::tracksListAdded,
1545             &myPlayListModel, &MediaPlayList::tracksListAdded,
1546             Qt::QueuedConnection);
1547     connect(&myPlayListModel, &MediaPlayList::newTrackByNameInList,
1548             &myListener, &TracksListener::trackByNameInList,
1549             Qt::QueuedConnection);
1550     connect(&myPlayListModel, &MediaPlayList::newEntryInList,
1551             &myListener, &TracksListener::newEntryInList,
1552             Qt::QueuedConnection);
1553     connect(&myPlayListModel, &MediaPlayList::newUrlInList,
1554             &myListener, &TracksListener::newUrlInList,
1555             Qt::QueuedConnection);
1556     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1557             &myListener, &TracksListener::tracksAdded);
1558 
1559     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1560 
1561     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1562                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1563                          QStringLiteral("track1"), {}}}, {}, {});
1564     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1565                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1566                          QStringLiteral("track3"), {}}}, {}, {});
1567     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1568                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1569                          QStringLiteral("track5"), {}}}, {}, {});
1570     myPlayList.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1571                           {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1572                          QStringLiteral("track1"), {}}}, {}, {});
1573 
1574     QVERIFY(dataChangedSpy.wait());
1575 
1576     QCOMPARE(currentTrackChangedSpy.count(), 1);
1577     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1578     QCOMPARE(repeatModeChangedSpy.count(), 0);
1579     QCOMPARE(playListFinishedSpy.count(), 0);
1580 
1581     QVariantMap settings;
1582     settings[QStringLiteral("currentTrack")] = 2;
1583     settings[QStringLiteral("shufflePlayList")] = true;
1584     settings[QStringLiteral("repeatMode")] = true;
1585 
1586     myPlayList.setPersistentState(settings);
1587 
1588     QCOMPARE(currentTrackChangedSpy.count(), 2);
1589     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1590     QCOMPARE(repeatModeChangedSpy.count(), 1);
1591     QCOMPARE(playListFinishedSpy.count(), 0);
1592 }
1593 
testSaveAndRestoreSettings()1594 void MediaPlayListProxyModelTest::testSaveAndRestoreSettings()
1595 {
1596     MediaPlayList myPlayListSave;
1597     QAbstractItemModelTester testModelSave(&myPlayListSave);
1598     MediaPlayListProxyModel myPlayListSaveProxyModel;
1599     myPlayListSaveProxyModel.setPlayListModel(&myPlayListSave);
1600     QAbstractItemModelTester testProxyModelSave(&myPlayListSaveProxyModel);
1601     DatabaseInterface myDatabaseContent;
1602     TracksListener myListenerSave(&myDatabaseContent);
1603     MediaPlayList myPlayListRestore;
1604     QAbstractItemModelTester testModelRestore(&myPlayListRestore);
1605     MediaPlayListProxyModel myPlayListRestoreProxyModel;
1606     myPlayListRestoreProxyModel.setPlayListModel(&myPlayListRestore);
1607     QAbstractItemModelTester testProxyModelRestore(&myPlayListRestoreProxyModel);
1608     TracksListener myListenerRestore(&myDatabaseContent);
1609 
1610     QSignalSpy currentTrackChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1611     QSignalSpy shufflePlayListChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1612     QSignalSpy repeatModeChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1613     QSignalSpy playListFinishedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::playListFinished);
1614     QSignalSpy dataChangedSaveSpy(&myPlayListSaveProxyModel, &MediaPlayListProxyModel::dataChanged);
1615     QSignalSpy currentTrackChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1616     QSignalSpy shufflePlayListChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1617     QSignalSpy repeatModeChangedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1618     QSignalSpy playListFinishedRestoreSpy(&myPlayListRestoreProxyModel, &MediaPlayListProxyModel::playListFinished);
1619 
1620     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1621 
1622     connect(&myListenerSave, &TracksListener::trackHasChanged,
1623             &myPlayListSave, &MediaPlayList::trackChanged,
1624             Qt::QueuedConnection);
1625     connect(&myListenerSave, &TracksListener::tracksListAdded,
1626             &myPlayListSave, &MediaPlayList::tracksListAdded,
1627             Qt::QueuedConnection);
1628     connect(&myPlayListSave, &MediaPlayList::newTrackByNameInList,
1629             &myListenerSave, &TracksListener::trackByNameInList,
1630             Qt::QueuedConnection);
1631     connect(&myPlayListSave, &MediaPlayList::newEntryInList,
1632             &myListenerSave, &TracksListener::newEntryInList,
1633             Qt::QueuedConnection);
1634     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1635             &myListenerSave, &TracksListener::tracksAdded);
1636 
1637     connect(&myListenerRestore, &TracksListener::trackHasChanged,
1638             &myPlayListRestore, &MediaPlayList::trackChanged,
1639             Qt::QueuedConnection);
1640     connect(&myListenerRestore, &TracksListener::tracksListAdded,
1641             &myPlayListRestore, &MediaPlayList::tracksListAdded,
1642             Qt::QueuedConnection);
1643     connect(&myPlayListRestore, &MediaPlayList::newTrackByNameInList,
1644             &myListenerRestore, &TracksListener::trackByNameInList,
1645             Qt::QueuedConnection);
1646     connect(&myPlayListRestore, &MediaPlayList::newEntryInList,
1647             &myListenerRestore, &TracksListener::newEntryInList,
1648             Qt::QueuedConnection);
1649     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1650             &myListenerRestore, &TracksListener::tracksAdded);
1651 
1652     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1653     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1654     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1655     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1656     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1657     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1658     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1659     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1660 
1661     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1662     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1663     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1664     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1665     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1666     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1667     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1668     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1669 
1670     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1671 
1672     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1673     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1674     QCOMPARE(repeatModeChangedSaveSpy.count(), 0);
1675     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1676     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1677     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1678     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1679     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1680 
1681     myPlayListSaveProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1682 
1683     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1684     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 0);
1685     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1686     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1687     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1688     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1689     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1690     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1691 
1692     myPlayListSaveProxyModel.setShufflePlayList(true);
1693 
1694     QCOMPARE(currentTrackChangedSaveSpy.count(), 0);
1695     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1696     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1697     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1698     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1699     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1700     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1701     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1702 
1703     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1704                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1705                                        QStringLiteral("track1"), {}}}, {}, {});
1706     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1707                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1708                                        QStringLiteral("track3"), {}}}, {}, {});
1709     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1710                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1711                                        QStringLiteral("track5"), {}}}, {}, {});
1712     myPlayListSaveProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1713                                         {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1)}},
1714                                        QStringLiteral("track1"), {}}}, {}, {});
1715 
1716     QVERIFY(dataChangedSaveSpy.wait());
1717 
1718     QCOMPARE(currentTrackChangedSaveSpy.count(), 1);
1719     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1720     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1721     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1722     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1723     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1724     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1725     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1726 
1727     QCOMPARE(myPlayListSaveProxyModel.currentTrack(), QPersistentModelIndex(myPlayListSaveProxyModel.index(0, 0)));
1728 
1729     myPlayListSaveProxyModel.skipNextTrack();
1730 
1731     QCOMPARE(currentTrackChangedSaveSpy.count(), 2);
1732     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1733     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1734     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1735     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1736     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1737     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1738     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1739 
1740     myPlayListSaveProxyModel.skipNextTrack();
1741 
1742     QCOMPARE(currentTrackChangedSaveSpy.count(), 3);
1743     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1744     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1745     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1746     QCOMPARE(currentTrackChangedRestoreSpy.count(), 0);
1747     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 0);
1748     QCOMPARE(repeatModeChangedRestoreSpy.count(), 0);
1749     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1750 
1751     myPlayListRestoreProxyModel.setPersistentState(myPlayListSaveProxyModel.persistentState());
1752 
1753     QCOMPARE(currentTrackChangedSaveSpy.count(), 3);
1754     QCOMPARE(shufflePlayListChangedSaveSpy.count(), 1);
1755     QCOMPARE(repeatModeChangedSaveSpy.count(), 1);
1756     QCOMPARE(playListFinishedSaveSpy.count(), 0);
1757     QCOMPARE(currentTrackChangedRestoreSpy.count(), 1);
1758     QCOMPARE(shufflePlayListChangedRestoreSpy.count(), 1);
1759     QCOMPARE(repeatModeChangedRestoreSpy.count(), 1);
1760     QCOMPARE(playListFinishedRestoreSpy.count(), 0);
1761 
1762     QCOMPARE(myPlayListRestoreProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
1763     QCOMPARE(myPlayListRestoreProxyModel.shufflePlayList(), true);
1764 }
1765 
shufflePlayList()1766 void MediaPlayListProxyModelTest::shufflePlayList()
1767 {
1768     MediaPlayList myPlayList;
1769     QAbstractItemModelTester testModel(&myPlayList);
1770     MediaPlayListProxyModel myPlayListProxyModel;
1771     myPlayListProxyModel.setPlayListModel(&myPlayList);
1772     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1773     DatabaseInterface myDatabaseContent;
1774     TracksListener myListener(&myDatabaseContent);
1775 
1776     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1777     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1778     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1779     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
1780 
1781     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1782 
1783     connect(&myListener, &TracksListener::trackHasChanged,
1784             &myPlayList, &MediaPlayList::trackChanged,
1785             Qt::QueuedConnection);
1786     connect(&myListener, &TracksListener::tracksListAdded,
1787             &myPlayList, &MediaPlayList::tracksListAdded,
1788             Qt::QueuedConnection);
1789     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1790             &myListener, &TracksListener::trackByNameInList,
1791             Qt::QueuedConnection);
1792     connect(&myPlayList, &MediaPlayList::newEntryInList,
1793             &myListener, &TracksListener::newEntryInList,
1794             Qt::QueuedConnection);
1795     connect(&myPlayList, &MediaPlayList::newUrlInList,
1796             &myListener, &TracksListener::newUrlInList,
1797             Qt::QueuedConnection);
1798     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1799             &myListener, &TracksListener::tracksAdded);
1800 
1801     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1802 
1803     QCOMPARE(currentTrackChangedSpy.count(), 0);
1804     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1805     QCOMPARE(repeatModeChangedSpy.count(), 0);
1806     QCOMPARE(playListFinishedSpy.count(), 0);
1807 
1808     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1809                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1810                                    QStringLiteral("track1"), {}}}, {}, {});
1811     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1812                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1813                                    QStringLiteral("track3"), {}}}, {}, {});
1814     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1815                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1816                                    QStringLiteral("track5"), {}}}, {}, {});
1817     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1818                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1819                                    QStringLiteral("track1"), {}}}, {}, {});
1820 
1821     QCOMPARE(currentTrackChangedSpy.count(), 1);
1822     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1823     QCOMPARE(repeatModeChangedSpy.count(), 0);
1824     QCOMPARE(playListFinishedSpy.count(), 0);
1825 
1826     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
1827 
1828     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1829     myPlayListProxyModel.setShufflePlayList(true);
1830 
1831     QCOMPARE(currentTrackChangedSpy.count(), 1);
1832     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1833     QCOMPARE(repeatModeChangedSpy.count(), 1);
1834     QCOMPARE(playListFinishedSpy.count(), 0);
1835 
1836     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
1837 
1838     myPlayListProxyModel.skipNextTrack();
1839 
1840     QCOMPARE(currentTrackChangedSpy.count(), 2);
1841     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1842     QCOMPARE(repeatModeChangedSpy.count(), 1);
1843     QCOMPARE(playListFinishedSpy.count(), 0);
1844 
1845     myPlayListProxyModel.skipNextTrack();
1846 
1847     QCOMPARE(currentTrackChangedSpy.count(), 3);
1848     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1849     QCOMPARE(repeatModeChangedSpy.count(), 1);
1850     QCOMPARE(playListFinishedSpy.count(), 0);
1851 
1852     myPlayListProxyModel.skipNextTrack();
1853 
1854     QCOMPARE(currentTrackChangedSpy.count(), 4);
1855     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1856     QCOMPARE(repeatModeChangedSpy.count(), 1);
1857     QCOMPARE(playListFinishedSpy.count(), 0);
1858 
1859     myPlayListProxyModel.skipNextTrack();
1860 
1861     QCOMPARE(currentTrackChangedSpy.count(), 5);
1862     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1863     QCOMPARE(repeatModeChangedSpy.count(), 1);
1864     QCOMPARE(playListFinishedSpy.count(), 0);
1865 }
1866 
testShuffleMode()1867 void MediaPlayListProxyModelTest::testShuffleMode()
1868 {
1869     MediaPlayList myPlayList;
1870     QAbstractItemModelTester testModel(&myPlayList);
1871     MediaPlayListProxyModel myPlayListProxyModel;
1872     myPlayListProxyModel.setPlayListModel(&myPlayList);
1873     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1874     DatabaseInterface myDatabaseContent;
1875     TracksListener myListener(&myDatabaseContent);
1876 
1877     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1878     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1879     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1880     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
1881 
1882     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1883 
1884     connect(&myListener, &TracksListener::trackHasChanged,
1885             &myPlayList, &MediaPlayList::trackChanged,
1886             Qt::QueuedConnection);
1887     connect(&myListener, &TracksListener::tracksListAdded,
1888             &myPlayList, &MediaPlayList::tracksListAdded,
1889             Qt::QueuedConnection);
1890     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
1891             &myListener, &TracksListener::trackByNameInList,
1892             Qt::QueuedConnection);
1893     connect(&myPlayList, &MediaPlayList::newEntryInList,
1894             &myListener, &TracksListener::newEntryInList,
1895             Qt::QueuedConnection);
1896     connect(&myPlayList, &MediaPlayList::newUrlInList,
1897             &myListener, &TracksListener::newUrlInList,
1898             Qt::QueuedConnection);
1899     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
1900             &myListener, &TracksListener::tracksAdded);
1901 
1902     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
1903 
1904     QCOMPARE(currentTrackChangedSpy.count(), 0);
1905     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
1906     QCOMPARE(repeatModeChangedSpy.count(), 0);
1907     QCOMPARE(playListFinishedSpy.count(), 0);
1908 
1909     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
1910     myPlayListProxyModel.setShufflePlayList(true);
1911 
1912     QCOMPARE(currentTrackChangedSpy.count(), 0);
1913     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1914     QCOMPARE(repeatModeChangedSpy.count(), 1);
1915     QCOMPARE(playListFinishedSpy.count(), 0);
1916 
1917     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
1918     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
1919 
1920     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1921                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1922                                    QStringLiteral("track1"), {}}}, {}, {});
1923     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1924                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
1925                                    QStringLiteral("track3"), {}}}, {}, {});
1926     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1927                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
1928                                    QStringLiteral("track5"), {}}}, {}, {});
1929     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
1930                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
1931                                    QStringLiteral("track1"), {}}}, {}, {});
1932 
1933     QCOMPARE(currentTrackChangedSpy.count(), 1);
1934     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1935     QCOMPARE(repeatModeChangedSpy.count(), 1);
1936     QCOMPARE(playListFinishedSpy.count(), 0);
1937 
1938     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
1939 
1940     QCOMPARE(currentTrackChangedSpy.count(), 1);
1941     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1942     QCOMPARE(repeatModeChangedSpy.count(), 1);
1943     QCOMPARE(playListFinishedSpy.count(), 0);
1944 
1945     myPlayListProxyModel.skipNextTrack();
1946 
1947     QCOMPARE(currentTrackChangedSpy.count(), 2);
1948     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1949     QCOMPARE(repeatModeChangedSpy.count(), 1);
1950     QCOMPARE(playListFinishedSpy.count(), 0);
1951 
1952     myPlayListProxyModel.skipNextTrack();
1953 
1954     QCOMPARE(currentTrackChangedSpy.count(), 3);
1955     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1956     QCOMPARE(repeatModeChangedSpy.count(), 1);
1957     QCOMPARE(playListFinishedSpy.count(), 0);
1958 
1959     myPlayListProxyModel.skipNextTrack();
1960 
1961     QCOMPARE(currentTrackChangedSpy.count(), 4);
1962     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1963     QCOMPARE(repeatModeChangedSpy.count(), 1);
1964     QCOMPARE(playListFinishedSpy.count(), 0);
1965 
1966     myPlayListProxyModel.skipPreviousTrack(0);
1967 
1968     QCOMPARE(currentTrackChangedSpy.count(), 5);
1969     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
1970     QCOMPARE(repeatModeChangedSpy.count(), 1);
1971     QCOMPARE(playListFinishedSpy.count(), 0);
1972 
1973     myPlayListProxyModel.removeRow(1);
1974 }
1975 
randomAndContinuePlayList()1976 void MediaPlayListProxyModelTest::randomAndContinuePlayList()
1977 {
1978     MediaPlayList myPlayList;
1979     QAbstractItemModelTester testModel(&myPlayList);
1980     MediaPlayListProxyModel myPlayListProxyModel;
1981     myPlayListProxyModel.setPlayListModel(&myPlayList);
1982     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
1983     DatabaseInterface myDatabaseContent;
1984     TracksListener myListener(&myDatabaseContent);
1985 
1986     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
1987     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
1988     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
1989     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
1990 
1991     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
1992 
1993     connect(&myListener, &TracksListener::trackHasChanged,
1994             &myPlayList, &MediaPlayList::trackChanged,
1995             Qt::QueuedConnection);
1996     connect(&myListener, &TracksListener::tracksListAdded,
1997             &myPlayList, &MediaPlayList::tracksListAdded,
1998             Qt::QueuedConnection);
1999     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2000             &myListener, &TracksListener::trackByNameInList,
2001             Qt::QueuedConnection);
2002     connect(&myPlayList, &MediaPlayList::newEntryInList,
2003             &myListener, &TracksListener::newEntryInList,
2004             Qt::QueuedConnection);
2005     connect(&myPlayList, &MediaPlayList::newUrlInList,
2006             &myListener, &TracksListener::newUrlInList,
2007             Qt::QueuedConnection);
2008     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2009             &myListener, &TracksListener::tracksAdded);
2010 
2011     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2012 
2013     QCOMPARE(currentTrackChangedSpy.count(), 0);
2014     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2015     QCOMPARE(repeatModeChangedSpy.count(), 0);
2016     QCOMPARE(playListFinishedSpy.count(), 0);
2017 
2018     QCOMPARE(currentTrackChangedSpy.count(), 0);
2019     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2020     QCOMPARE(repeatModeChangedSpy.count(), 0);
2021     QCOMPARE(playListFinishedSpy.count(), 0);
2022 
2023     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2024                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2025                                    QStringLiteral("track1"), {}}}, {}, {});
2026     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2027                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2028                                    QStringLiteral("track3"), {}}}, {}, {});
2029     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2030                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
2031                                    QStringLiteral("track5"), {}}}, {}, {});
2032     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2033                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2034                                    QStringLiteral("track1"), {}}}, {}, {});
2035 
2036     QCOMPARE(currentTrackChangedSpy.count(), 1);
2037     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2038     QCOMPARE(repeatModeChangedSpy.count(), 0);
2039     QCOMPARE(playListFinishedSpy.count(), 0);
2040 
2041     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2042 
2043     myPlayListProxyModel.setShufflePlayList(true);
2044 
2045     QCOMPARE(currentTrackChangedSpy.count(), 1);
2046     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2047     QCOMPARE(repeatModeChangedSpy.count(), 0);
2048     QCOMPARE(playListFinishedSpy.count(), 0);
2049 
2050     QCOMPARE(myPlayListProxyModel.shufflePlayList(), true);
2051 
2052     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2053 
2054     QCOMPARE(currentTrackChangedSpy.count(), 1);
2055     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2056     QCOMPARE(repeatModeChangedSpy.count(), 1);
2057     QCOMPARE(playListFinishedSpy.count(), 0);
2058 
2059     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
2060 
2061     myPlayListProxyModel.switchTo(3);
2062 
2063     QCOMPARE(currentTrackChangedSpy.count(), 2);
2064     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2065     QCOMPARE(repeatModeChangedSpy.count(), 1);
2066     QCOMPARE(playListFinishedSpy.count(), 0);
2067 
2068     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2069 
2070     myPlayListProxyModel.skipNextTrack();
2071 
2072     QCOMPARE(currentTrackChangedSpy.count(), 3);
2073     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2074     QCOMPARE(repeatModeChangedSpy.count(), 1);
2075     QCOMPARE(playListFinishedSpy.count(), 0);
2076 
2077     myPlayListProxyModel.skipNextTrack();
2078 
2079     QCOMPARE(currentTrackChangedSpy.count(), 4);
2080     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2081     QCOMPARE(repeatModeChangedSpy.count(), 1);
2082     QCOMPARE(playListFinishedSpy.count(), 0);
2083 
2084     myPlayListProxyModel.skipNextTrack();
2085 
2086     QCOMPARE(currentTrackChangedSpy.count(), 5);
2087     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2088     QCOMPARE(repeatModeChangedSpy.count(), 1);
2089     QCOMPARE(playListFinishedSpy.count(), 0);
2090 }
2091 
continuePlayList()2092 void MediaPlayListProxyModelTest::continuePlayList()
2093 {
2094     MediaPlayList myPlayList;
2095     QAbstractItemModelTester testModel(&myPlayList);
2096     MediaPlayListProxyModel myPlayListProxyModel;
2097     myPlayListProxyModel.setPlayListModel(&myPlayList);
2098     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2099     DatabaseInterface myDatabaseContent;
2100     TracksListener myListener(&myDatabaseContent);
2101 
2102     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2103     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2104     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2105     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
2106 
2107     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2108 
2109     connect(&myListener, &TracksListener::trackHasChanged,
2110             &myPlayList, &MediaPlayList::trackChanged,
2111             Qt::QueuedConnection);
2112     connect(&myListener, &TracksListener::tracksListAdded,
2113             &myPlayList, &MediaPlayList::tracksListAdded,
2114             Qt::QueuedConnection);
2115     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2116             &myListener, &TracksListener::trackByNameInList,
2117             Qt::QueuedConnection);
2118     connect(&myPlayList, &MediaPlayList::newEntryInList,
2119             &myListener, &TracksListener::newEntryInList,
2120             Qt::QueuedConnection);
2121     connect(&myPlayList, &MediaPlayList::newUrlInList,
2122             &myListener, &TracksListener::newUrlInList,
2123             Qt::QueuedConnection);
2124     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2125             &myListener, &TracksListener::tracksAdded);
2126 
2127     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2128 
2129     QCOMPARE(currentTrackChangedSpy.count(), 0);
2130     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2131     QCOMPARE(repeatModeChangedSpy.count(), 0);
2132     QCOMPARE(playListFinishedSpy.count(), 0);
2133 
2134     QCOMPARE(currentTrackChangedSpy.count(), 0);
2135     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2136     QCOMPARE(repeatModeChangedSpy.count(), 0);
2137     QCOMPARE(playListFinishedSpy.count(), 0);
2138 
2139     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2140                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2141                                    QStringLiteral("track1"), {}}}, {}, {});
2142     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2143                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2144                                    QStringLiteral("track3"), {}}}, {}, {});
2145     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2146                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
2147                                    QStringLiteral("track5"), {}}}, {}, {});
2148     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2149                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2150                                    QStringLiteral("track1"), {}}}, {}, {});
2151 
2152     QCOMPARE(currentTrackChangedSpy.count(), 1);
2153     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2154     QCOMPARE(repeatModeChangedSpy.count(), 0);
2155     QCOMPARE(playListFinishedSpy.count(), 0);
2156 
2157     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2158 
2159     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2160 
2161     QCOMPARE(currentTrackChangedSpy.count(), 1);
2162     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2163     QCOMPARE(repeatModeChangedSpy.count(), 1);
2164     QCOMPARE(playListFinishedSpy.count(), 0);
2165 
2166     QCOMPARE(myPlayListProxyModel.repeatMode(), MediaPlayListProxyModel::Repeat::Playlist);
2167 
2168     myPlayListProxyModel.skipNextTrack();
2169 
2170     QCOMPARE(currentTrackChangedSpy.count(), 2);
2171     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2172     QCOMPARE(repeatModeChangedSpy.count(), 1);
2173     QCOMPARE(playListFinishedSpy.count(), 0);
2174 
2175     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2176 
2177     myPlayListProxyModel.skipNextTrack();
2178 
2179     QCOMPARE(currentTrackChangedSpy.count(), 3);
2180     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2181     QCOMPARE(repeatModeChangedSpy.count(), 1);
2182     QCOMPARE(playListFinishedSpy.count(), 0);
2183 
2184     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
2185 
2186     myPlayListProxyModel.skipNextTrack();
2187 
2188     QCOMPARE(currentTrackChangedSpy.count(), 4);
2189     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2190     QCOMPARE(repeatModeChangedSpy.count(), 1);
2191     QCOMPARE(playListFinishedSpy.count(), 0);
2192 
2193     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2194 
2195     myPlayListProxyModel.skipNextTrack();
2196 
2197     QCOMPARE(currentTrackChangedSpy.count(), 5);
2198     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2199     QCOMPARE(repeatModeChangedSpy.count(), 1);
2200     QCOMPARE(playListFinishedSpy.count(), 0);
2201 
2202     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2203 }
2204 
previousAndNextTracksTest()2205 void MediaPlayListProxyModelTest::previousAndNextTracksTest()
2206 {
2207     MediaPlayList myPlayList;
2208     QAbstractItemModelTester testModel(&myPlayList);
2209     MediaPlayListProxyModel myPlayListProxyModel;
2210     myPlayListProxyModel.setPlayListModel(&myPlayList);
2211     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2212     DatabaseInterface myDatabaseContent;
2213     TracksListener myListener(&myDatabaseContent);
2214 
2215     QSignalSpy previousTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::previousTrackChanged);
2216     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2217     QSignalSpy nextTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::nextTrackChanged);
2218     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2219     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2220     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
2221 
2222     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2223 
2224     connect(&myListener, &TracksListener::trackHasChanged,
2225             &myPlayList, &MediaPlayList::trackChanged,
2226             Qt::QueuedConnection);
2227     connect(&myListener, &TracksListener::tracksListAdded,
2228             &myPlayList, &MediaPlayList::tracksListAdded,
2229             Qt::QueuedConnection);
2230     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2231             &myListener, &TracksListener::trackByNameInList,
2232             Qt::QueuedConnection);
2233     connect(&myPlayList, &MediaPlayList::newEntryInList,
2234             &myListener, &TracksListener::newEntryInList,
2235             Qt::QueuedConnection);
2236     connect(&myPlayList, &MediaPlayList::newUrlInList,
2237             &myListener, &TracksListener::newUrlInList,
2238             Qt::QueuedConnection);
2239     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2240             &myListener, &TracksListener::tracksAdded);
2241 
2242     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2243 
2244     QCOMPARE(previousTrackChangedSpy.count(), 0);
2245     QCOMPARE(currentTrackChangedSpy.count(), 0);
2246     QCOMPARE(nextTrackChangedSpy.count(), 0);
2247     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2248     QCOMPARE(repeatModeChangedSpy.count(), 0);
2249     QCOMPARE(playListFinishedSpy.count(), 0);
2250 
2251     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2252                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2253                                    QStringLiteral("track1"), {}}}, {}, {});
2254     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2255                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2256                                    QStringLiteral("track3"), {}}}, {}, {});
2257     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2258                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
2259                                    QStringLiteral("track4"), {}}}, {}, {});
2260     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2261                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
2262                                    QStringLiteral("track2"), {}}}, {}, {});
2263     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2264                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2265                                    QStringLiteral("track1"), {}}}, {}, {});
2266 
2267     QCOMPARE(previousTrackChangedSpy.count(), 0);
2268     QCOMPARE(currentTrackChangedSpy.count(), 1);
2269     QCOMPARE(nextTrackChangedSpy.count(), 1);
2270     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2271     QCOMPARE(repeatModeChangedSpy.count(), 0);
2272     QCOMPARE(playListFinishedSpy.count(), 0);
2273 
2274     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex());
2275     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2276     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2277 
2278     myPlayListProxyModel.skipNextTrack();
2279 
2280     QCOMPARE(previousTrackChangedSpy.count(), 1);
2281     QCOMPARE(currentTrackChangedSpy.count(), 2);
2282     QCOMPARE(nextTrackChangedSpy.count(), 2);
2283     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2284     QCOMPARE(repeatModeChangedSpy.count(), 0);
2285     QCOMPARE(playListFinishedSpy.count(), 0);
2286 
2287     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2288     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2289     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
2290 
2291     myPlayListProxyModel.switchTo(4);
2292 
2293     QCOMPARE(previousTrackChangedSpy.count(), 2);
2294     QCOMPARE(currentTrackChangedSpy.count(), 3);
2295     QCOMPARE(nextTrackChangedSpy.count(), 3);
2296 
2297     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2298     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2299     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex());
2300 
2301     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2302 
2303     QCOMPARE(previousTrackChangedSpy.count(), 2);
2304     QCOMPARE(currentTrackChangedSpy.count(), 3);
2305     QCOMPARE(nextTrackChangedSpy.count(), 4);
2306 
2307     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
2308     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2309     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2310 
2311     myPlayListProxyModel.skipNextTrack();
2312 
2313     QCOMPARE(previousTrackChangedSpy.count(), 3);
2314     QCOMPARE(currentTrackChangedSpy.count(), 4);
2315     QCOMPARE(nextTrackChangedSpy.count(), 5);
2316 
2317     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
2318     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2319     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2320 
2321     myPlayListProxyModel.setShufflePlayList(true);
2322 
2323     QVERIFY(myPlayListProxyModel.previousTrack() != QPersistentModelIndex());
2324     QVERIFY(myPlayListProxyModel.currentTrack() != QPersistentModelIndex());
2325     QVERIFY(myPlayListProxyModel.nextTrack() != QPersistentModelIndex());
2326 }
2327 
remainingTracksTest()2328 void MediaPlayListProxyModelTest::remainingTracksTest()
2329 {
2330     MediaPlayList myPlayList;
2331     QAbstractItemModelTester testModel(&myPlayList);
2332     MediaPlayListProxyModel myPlayListProxyModel;
2333     myPlayListProxyModel.setPlayListModel(&myPlayList);
2334     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2335     DatabaseInterface myDatabaseContent;
2336     TracksListener myListener(&myDatabaseContent);
2337 
2338     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2339     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
2340     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
2341     QSignalSpy remainingTracksChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::remainingTracksChanged);
2342 
2343     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2344 
2345     connect(&myListener, &TracksListener::trackHasChanged,
2346             &myPlayList, &MediaPlayList::trackChanged,
2347             Qt::QueuedConnection);
2348     connect(&myListener, &TracksListener::tracksListAdded,
2349             &myPlayList, &MediaPlayList::tracksListAdded,
2350             Qt::QueuedConnection);
2351     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2352             &myListener, &TracksListener::trackByNameInList,
2353             Qt::QueuedConnection);
2354     connect(&myPlayList, &MediaPlayList::newEntryInList,
2355             &myListener, &TracksListener::newEntryInList,
2356             Qt::QueuedConnection);
2357     connect(&myPlayList, &MediaPlayList::newUrlInList,
2358             &myListener, &TracksListener::newUrlInList,
2359             Qt::QueuedConnection);
2360     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2361             &myListener, &TracksListener::tracksAdded);
2362 
2363     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2364 
2365     QCOMPARE(currentTrackChangedSpy.count(), 0);
2366     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2367     QCOMPARE(repeatModeChangedSpy.count(), 0);
2368     QCOMPARE(remainingTracksChangedSpy.count(), 0);
2369 
2370     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2371                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2372                                    QStringLiteral("track1"), {}}}, {}, {});
2373     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2374                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
2375                                    QStringLiteral("track3"), {}}}, {}, {});
2376     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2377                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
2378                                    QStringLiteral("track4"), {}}}, {}, {});
2379     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2380                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
2381                                    QStringLiteral("track2"), {}}}, {}, {});
2382     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
2383                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
2384                                    QStringLiteral("track1"), {}}}, {}, {});
2385 
2386     QCOMPARE(currentTrackChangedSpy.count(), 1);
2387     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
2388     QCOMPARE(repeatModeChangedSpy.count(), 0);
2389     QCOMPARE(remainingTracksChangedSpy.count(), 6);
2390 
2391     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2392     QCOMPARE(myPlayListProxyModel.remainingTracks(), 4);
2393 
2394     myPlayListProxyModel.skipNextTrack();
2395 
2396     QCOMPARE(currentTrackChangedSpy.count(), 2);
2397     QCOMPARE(remainingTracksChangedSpy.count(), 7);
2398     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
2399     QCOMPARE(myPlayListProxyModel.remainingTracks(), 3);
2400 
2401     myPlayListProxyModel.setShufflePlayList(true);
2402 
2403     QCOMPARE(currentTrackChangedSpy.count(), 2);
2404     QCOMPARE(shufflePlayListChangedSpy.count(), 1);
2405     QCOMPARE(repeatModeChangedSpy.count(), 0);
2406     QCOMPARE(remainingTracksChangedSpy.count(), 8);
2407 
2408     myPlayListProxyModel.setShufflePlayList(false);
2409     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
2410 
2411     QCOMPARE(currentTrackChangedSpy.count(), 2);
2412     QCOMPARE(shufflePlayListChangedSpy.count(), 2);
2413     QCOMPARE(repeatModeChangedSpy.count(), 1);
2414     QCOMPARE(remainingTracksChangedSpy.count(), 10);
2415 
2416     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::One);
2417     QCOMPARE(myPlayListProxyModel.remainingTracks(), -1);
2418 }
2419 
clearPlayListCase()2420 void MediaPlayListProxyModelTest::clearPlayListCase()
2421 {
2422     MediaPlayList myPlayList;
2423     QAbstractItemModelTester testModel(&myPlayList);
2424     MediaPlayListProxyModel myPlayListProxyModel;
2425     myPlayListProxyModel.setPlayListModel(&myPlayList);
2426     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2427     DatabaseInterface myDatabaseContent;
2428     TracksListener myListener(&myDatabaseContent);
2429 
2430     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2431     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2432     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2433     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2434     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2435     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2436     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2437     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2438     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2439     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2440     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2441     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2442     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2443 
2444     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2445     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2446     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2447     QCOMPARE(rowsRemovedSpy.count(), 0);
2448     QCOMPARE(rowsMovedSpy.count(), 0);
2449     QCOMPARE(rowsInsertedSpy.count(), 0);
2450     QCOMPARE(tracksCountChangedSpy.count(), 0);
2451     QCOMPARE(persistentStateChangedSpy.count(), 0);
2452     QCOMPARE(dataChangedSpy.count(), 0);
2453     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2454     QCOMPARE(newEntryInListSpy.count(), 0);
2455     QCOMPARE(currentTrackChangedSpy.count(), 0);
2456 
2457     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2458 
2459     connect(&myListener, &TracksListener::trackHasChanged,
2460             &myPlayList, &MediaPlayList::trackChanged,
2461             Qt::QueuedConnection);
2462     connect(&myListener, &TracksListener::tracksListAdded,
2463             &myPlayList, &MediaPlayList::tracksListAdded,
2464             Qt::QueuedConnection);
2465     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2466             &myListener, &TracksListener::trackByNameInList,
2467             Qt::QueuedConnection);
2468     connect(&myPlayList, &MediaPlayList::newEntryInList,
2469             &myListener, &TracksListener::newEntryInList,
2470             Qt::QueuedConnection);
2471     connect(&myPlayList, &MediaPlayList::newUrlInList,
2472             &myListener, &TracksListener::newUrlInList,
2473             Qt::QueuedConnection);
2474     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2475             &myListener, &TracksListener::tracksAdded);
2476 
2477     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2478 
2479     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2480     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2481     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2482     QCOMPARE(rowsRemovedSpy.count(), 0);
2483     QCOMPARE(rowsMovedSpy.count(), 0);
2484     QCOMPARE(rowsInsertedSpy.count(), 0);
2485     QCOMPARE(tracksCountChangedSpy.count(), 0);
2486     QCOMPARE(persistentStateChangedSpy.count(), 0);
2487     QCOMPARE(dataChangedSpy.count(), 0);
2488     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2489     QCOMPARE(newEntryInListSpy.count(), 0);
2490     QCOMPARE(currentTrackChangedSpy.count(), 0);
2491 
2492     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2493                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2494                                    QStringLiteral("album2"), {}}}, {}, {});
2495 
2496     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2497 
2498     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2499     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2500     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2501     QCOMPARE(rowsRemovedSpy.count(), 1);
2502     QCOMPARE(rowsMovedSpy.count(), 0);
2503     QCOMPARE(rowsInsertedSpy.count(), 2);
2504     QCOMPARE(tracksCountChangedSpy.count(), 3);
2505     QCOMPARE(persistentStateChangedSpy.count(), 3);
2506     QCOMPARE(dataChangedSpy.count(), 0);
2507     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2508     QCOMPARE(newEntryInListSpy.count(), 1);
2509     QCOMPARE(currentTrackChangedSpy.count(), 1);
2510 
2511     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2512 
2513     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2514     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2515     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2516     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2517     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2518     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2519     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2520     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2521     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2522     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2523     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2524     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2525     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2526     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2527     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2528     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2529     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2530     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2531     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2532     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2533     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2534     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2535     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2536     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2537     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2538     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2539     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2540     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2541     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2542     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2543     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2544     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2545     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2546     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2547     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2548     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2549 
2550     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2551 
2552     myPlayListProxyModel.clearPlayList();
2553 
2554     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2555     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2556     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2557     QCOMPARE(rowsRemovedSpy.count(), 2);
2558     QCOMPARE(rowsMovedSpy.count(), 0);
2559     QCOMPARE(rowsInsertedSpy.count(), 2);
2560     QCOMPARE(tracksCountChangedSpy.count(), 4);
2561     QCOMPARE(persistentStateChangedSpy.count(), 4);
2562     QCOMPARE(dataChangedSpy.count(), 0);
2563     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2564     QCOMPARE(newEntryInListSpy.count(), 1);
2565     QCOMPARE(currentTrackChangedSpy.count(), 2);
2566 
2567     QCOMPARE(myPlayListProxyModel.rowCount(), 0);
2568 
2569     QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false);
2570 }
2571 
undoClearPlayListCase()2572 void MediaPlayListProxyModelTest::undoClearPlayListCase()
2573 {
2574     MediaPlayList myPlayList;
2575     QAbstractItemModelTester testModel(&myPlayList);
2576     MediaPlayListProxyModel myPlayListProxyModel;
2577     myPlayListProxyModel.setPlayListModel(&myPlayList);
2578     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2579     DatabaseInterface myDatabaseContent;
2580     TracksListener myListener(&myDatabaseContent);
2581 
2582     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2583     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2584     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2585     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2586     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2587     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2588     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2589     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2590     QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification);
2591     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2592     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2593     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2594     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2595     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2596 
2597     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2598     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2599     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2600     QCOMPARE(rowsRemovedSpy.count(), 0);
2601     QCOMPARE(rowsMovedSpy.count(), 0);
2602     QCOMPARE(rowsInsertedSpy.count(), 0);
2603     QCOMPARE(tracksCountChangedSpy.count(), 0);
2604     QCOMPARE(persistentStateChangedSpy.count(), 0);
2605     QCOMPARE(dataChangedSpy.count(), 0);
2606     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2607     QCOMPARE(newEntryInListSpy.count(), 0);
2608     QCOMPARE(currentTrackChangedSpy.count(), 0);
2609 
2610     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2611 
2612     connect(&myListener, &TracksListener::trackHasChanged,
2613             &myPlayList, &MediaPlayList::trackChanged,
2614             Qt::QueuedConnection);
2615     connect(&myListener, &TracksListener::tracksListAdded,
2616             &myPlayList, &MediaPlayList::tracksListAdded,
2617             Qt::QueuedConnection);
2618     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2619             &myListener, &TracksListener::trackByNameInList,
2620             Qt::QueuedConnection);
2621     connect(&myPlayList, &MediaPlayList::newEntryInList,
2622             &myListener, &TracksListener::newEntryInList,
2623             Qt::QueuedConnection);
2624     connect(&myPlayList, &MediaPlayList::newUrlInList,
2625             &myListener, &TracksListener::newUrlInList,
2626             Qt::QueuedConnection);
2627     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2628             &myListener, &TracksListener::tracksAdded);
2629 
2630     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2631 
2632     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2633     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2634     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2635     QCOMPARE(rowsRemovedSpy.count(), 0);
2636     QCOMPARE(rowsMovedSpy.count(), 0);
2637     QCOMPARE(rowsInsertedSpy.count(), 0);
2638     QCOMPARE(tracksCountChangedSpy.count(), 0);
2639     QCOMPARE(persistentStateChangedSpy.count(), 0);
2640     QCOMPARE(dataChangedSpy.count(), 0);
2641     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2642     QCOMPARE(newEntryInListSpy.count(), 0);
2643     QCOMPARE(currentTrackChangedSpy.count(), 0);
2644 
2645     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2646                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2647                                    QStringLiteral("album2"), {}}}, {}, {});
2648 
2649     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2650 
2651     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2652     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2653     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2654     QCOMPARE(rowsRemovedSpy.count(), 1);
2655     QCOMPARE(rowsMovedSpy.count(), 0);
2656     QCOMPARE(rowsInsertedSpy.count(), 2);
2657     QCOMPARE(tracksCountChangedSpy.count(), 3);
2658     QCOMPARE(persistentStateChangedSpy.count(), 3);
2659     QCOMPARE(dataChangedSpy.count(), 0);
2660     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2661     QCOMPARE(newEntryInListSpy.count(), 1);
2662     QCOMPARE(currentTrackChangedSpy.count(), 1);
2663 
2664     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2665 
2666     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2667     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2668     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2669     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2670     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2671     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2672     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2673     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2674     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2675     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2676     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2677     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2678     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2679     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2680     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2681     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2682     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2683     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2684     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2685     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2686     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2687     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2688     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2689     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2690     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2691     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2692     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2693     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2694     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2695     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2696     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2697     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2698     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2699     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2700     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2701     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2702 
2703     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2704 
2705     myPlayListProxyModel.clearPlayList();
2706 
2707     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2708     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2709     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2710     QCOMPARE(rowsRemovedSpy.count(), 2);
2711     QCOMPARE(rowsMovedSpy.count(), 0);
2712     QCOMPARE(rowsInsertedSpy.count(), 2);
2713     QCOMPARE(tracksCountChangedSpy.count(), 4);
2714     QCOMPARE(persistentStateChangedSpy.count(), 4);
2715     QCOMPARE(dataChangedSpy.count(), 0);
2716     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2717     QCOMPARE(newEntryInListSpy.count(), 1);
2718     QCOMPARE(currentTrackChangedSpy.count(), 2);
2719 
2720     QCOMPARE(myPlayListProxyModel.rowCount(), 0);
2721 
2722     QCOMPARE(myPlayListProxyModel.currentTrack().isValid(), false);
2723 
2724     myPlayListProxyModel.undoClearPlayList();
2725 
2726     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
2727     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2728     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
2729     QCOMPARE(rowsRemovedSpy.count(), 2);
2730     QCOMPARE(rowsMovedSpy.count(), 0);
2731     QCOMPARE(rowsInsertedSpy.count(), 3);
2732     QCOMPARE(tracksCountChangedSpy.count(), 5);
2733     QCOMPARE(persistentStateChangedSpy.count(), 6);
2734     QCOMPARE(dataChangedSpy.count(), 0);
2735     QCOMPARE(newTrackByNameInListSpy.count(), 6);
2736     QCOMPARE(newEntryInListSpy.count(), 1);
2737     QCOMPARE(currentTrackChangedSpy.count(), 3);
2738     QCOMPARE(displayUndoNotificationSpy.count(), 1);
2739 
2740     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2741 
2742     QVERIFY(dataChangedSpy.wait());
2743 
2744     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2745     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2746     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2747     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2748     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2749     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2750     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2751     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2752     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2753     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2754     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2755     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2756     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2757     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2758     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2759     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2760     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2761     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2762     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2763     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2764     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2765     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2766     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2767     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2768     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2769     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2770     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2771     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2772     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2773     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2774     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2775     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2776     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2777     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2778     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2779     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2780 
2781     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2782 }
2783 
undoReplacePlayListCase()2784 void MediaPlayListProxyModelTest::undoReplacePlayListCase()
2785 {
2786     MediaPlayList myPlayList;
2787     QAbstractItemModelTester testModel(&myPlayList);
2788     MediaPlayListProxyModel myPlayListProxyModel;
2789     myPlayListProxyModel.setPlayListModel(&myPlayList);
2790     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
2791     DatabaseInterface myDatabaseContent;
2792     TracksListener myListener(&myDatabaseContent);
2793 
2794     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
2795     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
2796     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
2797     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
2798     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
2799     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
2800     QSignalSpy tracksCountChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::tracksCountChanged);
2801     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
2802     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
2803     QSignalSpy displayUndoNotificationSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::displayUndoNotification);
2804     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
2805     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
2806     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
2807     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
2808 
2809     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2810     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2811     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2812     QCOMPARE(rowsRemovedSpy.count(), 0);
2813     QCOMPARE(rowsMovedSpy.count(), 0);
2814     QCOMPARE(rowsInsertedSpy.count(), 0);
2815     QCOMPARE(tracksCountChangedSpy.count(), 0);
2816     QCOMPARE(persistentStateChangedSpy.count(), 0);
2817     QCOMPARE(dataChangedSpy.count(), 0);
2818     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2819     QCOMPARE(newEntryInListSpy.count(), 0);
2820     QCOMPARE(currentTrackChangedSpy.count(), 0);
2821 
2822     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
2823 
2824     connect(&myListener, &TracksListener::trackHasChanged,
2825             &myPlayList, &MediaPlayList::trackChanged,
2826             Qt::QueuedConnection);
2827     connect(&myListener, &TracksListener::tracksListAdded,
2828             &myPlayList, &MediaPlayList::tracksListAdded,
2829             Qt::QueuedConnection);
2830     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
2831             &myListener, &TracksListener::trackByNameInList,
2832             Qt::QueuedConnection);
2833     connect(&myPlayList, &MediaPlayList::newEntryInList,
2834             &myListener, &TracksListener::newEntryInList,
2835             Qt::QueuedConnection);
2836     connect(&myPlayList, &MediaPlayList::newUrlInList,
2837             &myListener, &TracksListener::newUrlInList,
2838             Qt::QueuedConnection);
2839     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
2840             &myListener, &TracksListener::tracksAdded);
2841 
2842     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
2843 
2844     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
2845     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2846     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
2847     QCOMPARE(rowsRemovedSpy.count(), 0);
2848     QCOMPARE(rowsMovedSpy.count(), 0);
2849     QCOMPARE(rowsInsertedSpy.count(), 0);
2850     QCOMPARE(tracksCountChangedSpy.count(), 0);
2851     QCOMPARE(persistentStateChangedSpy.count(), 0);
2852     QCOMPARE(dataChangedSpy.count(), 0);
2853     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2854     QCOMPARE(newEntryInListSpy.count(), 0);
2855     QCOMPARE(currentTrackChangedSpy.count(), 0);
2856 
2857     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2858                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"), QStringLiteral("/"))}},
2859                                    QStringLiteral("album2"), {}}}, {}, {});
2860 
2861     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2862 
2863     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
2864     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2865     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
2866     QCOMPARE(rowsRemovedSpy.count(), 1);
2867     QCOMPARE(rowsMovedSpy.count(), 0);
2868     QCOMPARE(rowsInsertedSpy.count(), 2);
2869     QCOMPARE(tracksCountChangedSpy.count(), 3);
2870     QCOMPARE(persistentStateChangedSpy.count(), 3);
2871     QCOMPARE(dataChangedSpy.count(), 0);
2872     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2873     QCOMPARE(newEntryInListSpy.count(), 1);
2874     QCOMPARE(currentTrackChangedSpy.count(), 1);
2875 
2876     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2877 
2878     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2879     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2880     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2881     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2882     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2883     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2884     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2885     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2886     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2887     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2888     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2889     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2890     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2891     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2892     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2893     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2894     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2895     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
2896     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2897     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2898     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2899     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2900     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2901     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
2902     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
2903     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2904     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2905     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
2906     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2907     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
2908     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
2909     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2910     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
2911     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
2912     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2913     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
2914 
2915     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
2916 
2917     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Album},
2918                                     {DataTypes::DatabaseIdRole, myDatabaseContent.albumIdFromTitleAndArtist(QStringLiteral("album1"), QStringLiteral("Various Artists"), QStringLiteral("/"))}},
2919                                    QStringLiteral("album1"), {}}},
2920                                  ElisaUtils::ReplacePlayList,
2921                                  ElisaUtils::TriggerPlay);
2922 
2923     QVERIFY(rowsAboutToBeInsertedSpy.wait());
2924 
2925     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3);
2926     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2927     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
2928     QCOMPARE(rowsRemovedSpy.count(), 3);
2929     QCOMPARE(rowsMovedSpy.count(), 0);
2930     QCOMPARE(rowsInsertedSpy.count(), 4);
2931     QCOMPARE(persistentStateChangedSpy.count(), 7);
2932     QCOMPARE(dataChangedSpy.count(), 0);
2933     QCOMPARE(newTrackByNameInListSpy.count(), 0);
2934     QCOMPARE(newEntryInListSpy.count(), 2);
2935     QCOMPARE(currentTrackChangedSpy.count(), 3);
2936 
2937     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2938     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2939     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2940     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2941     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2942     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
2943     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2944     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2945     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
2946     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2947     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
2948     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
2949     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2950     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2951     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist3"));
2952     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2953     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 3);
2954     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 3);
2955     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
2956     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
2957     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist4"));
2958     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
2959     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 4);
2960     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 4);
2961 
2962     myPlayListProxyModel.undoClearPlayList();
2963 
2964     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4);
2965     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
2966     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
2967     QCOMPARE(rowsRemovedSpy.count(), 4);
2968     QCOMPARE(rowsMovedSpy.count(), 0);
2969     QCOMPARE(rowsInsertedSpy.count(), 5);
2970     QCOMPARE(tracksCountChangedSpy.count(), 9);
2971     QCOMPARE(persistentStateChangedSpy.count(), 10);
2972     QCOMPARE(dataChangedSpy.count(), 0);
2973     QCOMPARE(newTrackByNameInListSpy.count(), 6);
2974     QCOMPARE(newEntryInListSpy.count(), 2);
2975     QCOMPARE(currentTrackChangedSpy.count(), 5);
2976     QCOMPARE(displayUndoNotificationSpy.count(), 1);
2977 
2978     QCOMPARE(myPlayListProxyModel.rowCount(), 6);
2979 
2980     QVERIFY(dataChangedSpy.wait());
2981 
2982     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
2983     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2984     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2985     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
2986     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2987     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 5);
2988     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
2989     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2990     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2991     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
2992     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2993     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 6);
2994     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3"));
2995     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
2996     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
2997     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3);
2998     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
2999     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 7);
3000     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4"));
3001     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3002     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3003     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4);
3004     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3005     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 8);
3006     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5"));
3007     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3008     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
3009     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5);
3010     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3011     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 9);
3012     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6"));
3013     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2"));
3014     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2"));
3015     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6);
3016     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
3017     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 10);
3018 
3019     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3020 }
3021 
testBringUpAndSkipPreviousAndContinueCase()3022 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousAndContinueCase()
3023 {
3024     MediaPlayList myPlayList;
3025     QAbstractItemModelTester testModel(&myPlayList);
3026     MediaPlayListProxyModel myPlayListProxyModel;
3027     myPlayListProxyModel.setPlayListModel(&myPlayList);
3028     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3029     DatabaseInterface myDatabaseContent;
3030     TracksListener myListener(&myDatabaseContent);
3031 
3032     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3033     QSignalSpy shufflePlayListChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::shufflePlayListChanged);
3034     QSignalSpy repeatModeChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::repeatModeChanged);
3035     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3036 
3037     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3038 
3039     connect(&myListener, &TracksListener::trackHasChanged,
3040             &myPlayList, &MediaPlayList::trackChanged,
3041             Qt::QueuedConnection);
3042     connect(&myListener, &TracksListener::tracksListAdded,
3043             &myPlayList, &MediaPlayList::tracksListAdded,
3044             Qt::QueuedConnection);
3045     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3046             &myListener, &TracksListener::trackByNameInList,
3047             Qt::QueuedConnection);
3048     connect(&myPlayList, &MediaPlayList::newEntryInList,
3049             &myListener, &TracksListener::newEntryInList,
3050             Qt::QueuedConnection);
3051     connect(&myPlayList, &MediaPlayList::newUrlInList,
3052             &myListener, &TracksListener::newUrlInList,
3053             Qt::QueuedConnection);
3054     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3055             &myListener, &TracksListener::tracksAdded);
3056 
3057     QCOMPARE(currentTrackChangedSpy.count(), 0);
3058     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3059     QCOMPARE(repeatModeChangedSpy.count(), 0);
3060     QCOMPARE(playListFinishedSpy.count(), 0);
3061 
3062     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::Playlist);
3063 
3064     QCOMPARE(currentTrackChangedSpy.count(), 0);
3065     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3066     QCOMPARE(repeatModeChangedSpy.count(), 1);
3067     QCOMPARE(playListFinishedSpy.count(), 0);
3068 
3069     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3070 
3071     QCOMPARE(currentTrackChangedSpy.count(), 0);
3072     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3073     QCOMPARE(repeatModeChangedSpy.count(), 1);
3074     QCOMPARE(playListFinishedSpy.count(), 0);
3075 
3076     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3077                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3078                                    QStringLiteral("track1"), {}}}, {}, {});
3079     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3080                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
3081                                    QStringLiteral("track3"), {}}}, {}, {});
3082     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3083                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}},
3084                                    QStringLiteral("track2"), {}}}, {}, {});
3085     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3086                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3087                                    QStringLiteral("track1"), {}}}, {}, {});
3088     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3089                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}},
3090                                    QStringLiteral("track3"), {}}}, {}, {});
3091     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3092                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
3093                                    QStringLiteral("track2"), {}}}, {}, {});
3094 
3095     QCOMPARE(currentTrackChangedSpy.count(), 1);
3096     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3097     QCOMPARE(repeatModeChangedSpy.count(), 1);
3098     QCOMPARE(playListFinishedSpy.count(), 0);
3099 
3100     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3101 
3102     myPlayListProxyModel.skipNextTrack();
3103 
3104     QCOMPARE(currentTrackChangedSpy.count(), 2);
3105     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3106     QCOMPARE(repeatModeChangedSpy.count(), 1);
3107     QCOMPARE(playListFinishedSpy.count(), 0);
3108 
3109     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3110 
3111     myPlayListProxyModel.skipNextTrack();
3112 
3113     QCOMPARE(currentTrackChangedSpy.count(), 3);
3114     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3115     QCOMPARE(repeatModeChangedSpy.count(), 1);
3116     QCOMPARE(playListFinishedSpy.count(), 0);
3117 
3118     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
3119 
3120     myPlayListProxyModel.skipNextTrack();
3121 
3122     QCOMPARE(currentTrackChangedSpy.count(), 4);
3123     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3124     QCOMPARE(repeatModeChangedSpy.count(), 1);
3125     QCOMPARE(playListFinishedSpy.count(), 0);
3126 
3127     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
3128 
3129     myPlayListProxyModel.skipNextTrack();
3130 
3131     QCOMPARE(currentTrackChangedSpy.count(), 5);
3132     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3133     QCOMPARE(repeatModeChangedSpy.count(), 1);
3134     QCOMPARE(playListFinishedSpy.count(), 0);
3135 
3136     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3137 
3138     myPlayListProxyModel.skipNextTrack();
3139 
3140     QCOMPARE(currentTrackChangedSpy.count(), 6);
3141     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3142     QCOMPARE(repeatModeChangedSpy.count(), 1);
3143     QCOMPARE(playListFinishedSpy.count(), 0);
3144 
3145     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3146 
3147     myPlayListProxyModel.skipPreviousTrack(0);
3148 
3149     QCOMPARE(currentTrackChangedSpy.count(), 7);
3150     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3151     QCOMPARE(repeatModeChangedSpy.count(), 1);
3152     QCOMPARE(playListFinishedSpy.count(), 0);
3153 
3154     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
3155 
3156     myPlayListProxyModel.skipPreviousTrack(0);
3157 
3158     QCOMPARE(currentTrackChangedSpy.count(), 8);
3159     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3160     QCOMPARE(repeatModeChangedSpy.count(), 1);
3161     QCOMPARE(playListFinishedSpy.count(), 0);
3162 
3163     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
3164 
3165     myPlayListProxyModel.skipPreviousTrack(0);
3166 
3167     QCOMPARE(currentTrackChangedSpy.count(), 9);
3168     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3169     QCOMPARE(repeatModeChangedSpy.count(), 1);
3170     QCOMPARE(playListFinishedSpy.count(), 0);
3171 
3172     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
3173 
3174     myPlayListProxyModel.skipPreviousTrack(0);
3175 
3176     QCOMPARE(currentTrackChangedSpy.count(), 10);
3177     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3178     QCOMPARE(repeatModeChangedSpy.count(), 1);
3179     QCOMPARE(playListFinishedSpy.count(), 0);
3180 
3181     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3182 
3183     myPlayListProxyModel.skipPreviousTrack(0);
3184 
3185     QCOMPARE(currentTrackChangedSpy.count(), 11);
3186     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3187     QCOMPARE(repeatModeChangedSpy.count(), 1);
3188     QCOMPARE(playListFinishedSpy.count(), 0);
3189 
3190     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3191 
3192     myPlayListProxyModel.skipPreviousTrack(0);
3193 
3194     QCOMPARE(currentTrackChangedSpy.count(), 12);
3195     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3196     QCOMPARE(repeatModeChangedSpy.count(), 1);
3197     QCOMPARE(playListFinishedSpy.count(), 0);
3198 
3199     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3200 
3201     myPlayListProxyModel.setRepeatMode(MediaPlayListProxyModel::Repeat::One);
3202 
3203     QCOMPARE(currentTrackChangedSpy.count(), 12);
3204     QCOMPARE(shufflePlayListChangedSpy.count(), 0);
3205     QCOMPARE(repeatModeChangedSpy.count(), 2);
3206     QCOMPARE(playListFinishedSpy.count(), 0);
3207 
3208     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3209     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3210     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3211 
3212     myPlayListProxyModel.skipPreviousTrack(0);
3213 
3214     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3215     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3216     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3217 
3218     myPlayListProxyModel.skipNextTrack();
3219 
3220     QCOMPARE(myPlayListProxyModel.nextTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3221     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3222     QCOMPARE(myPlayListProxyModel.previousTrack(), QPersistentModelIndex(myPlayListProxyModel.index(5, 0)));
3223 }
3224 
testBringUpAndRemoveMultipleNotBeginCase()3225 void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleNotBeginCase()
3226 {
3227     MediaPlayList myPlayList;
3228     QAbstractItemModelTester testModel(&myPlayList);
3229     MediaPlayListProxyModel myPlayListProxyModel;
3230     myPlayListProxyModel.setPlayListModel(&myPlayList);
3231     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3232     DatabaseInterface myDatabaseContent;
3233     TracksListener myListener(&myDatabaseContent);
3234 
3235     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3236     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3237 
3238     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3239 
3240     connect(&myListener, &TracksListener::trackHasChanged,
3241             &myPlayList, &MediaPlayList::trackChanged,
3242             Qt::QueuedConnection);
3243     connect(&myListener, &TracksListener::tracksListAdded,
3244             &myPlayList, &MediaPlayList::tracksListAdded,
3245             Qt::QueuedConnection);
3246     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3247             &myListener, &TracksListener::trackByNameInList,
3248             Qt::QueuedConnection);
3249     connect(&myPlayList, &MediaPlayList::newEntryInList,
3250             &myListener, &TracksListener::newEntryInList,
3251             Qt::QueuedConnection);
3252     connect(&myPlayList, &MediaPlayList::newUrlInList,
3253             &myListener, &TracksListener::newUrlInList,
3254             Qt::QueuedConnection);
3255     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3256             &myListener, &TracksListener::tracksAdded);
3257 
3258     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3259 
3260     QCOMPARE(currentTrackChangedSpy.count(), 0);
3261     QCOMPARE(playListFinishedSpy.count(), 0);
3262 
3263     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3264                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3265                                    QStringLiteral("track1"), {}}}, {}, {});
3266 
3267     QCOMPARE(currentTrackChangedSpy.count(), 1);
3268     QCOMPARE(playListFinishedSpy.count(), 0);
3269 
3270     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3271 
3272     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3273                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
3274                                    QStringLiteral("track2"), {}}}, {}, {});
3275 
3276     QCOMPARE(currentTrackChangedSpy.count(), 1);
3277     QCOMPARE(playListFinishedSpy.count(), 0);
3278 
3279     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3280                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 1)}},
3281                                    QStringLiteral("track4"), {}}}, {}, {});
3282 
3283     QCOMPARE(currentTrackChangedSpy.count(), 1);
3284     QCOMPARE(playListFinishedSpy.count(), 0);
3285 
3286     myPlayListProxyModel.skipNextTrack();
3287 
3288     QCOMPARE(currentTrackChangedSpy.count(), 2);
3289     QCOMPARE(playListFinishedSpy.count(), 0);
3290 
3291     qDebug() << myPlayListProxyModel.currentTrack() << QPersistentModelIndex(myPlayListProxyModel.index(1, 0));
3292     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3293 
3294     myPlayListProxyModel.removeRow(1);
3295 
3296     QCOMPARE(currentTrackChangedSpy.count(), 3);
3297     QCOMPARE(playListFinishedSpy.count(), 0);
3298 
3299     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3300 }
3301 
testBringUpAndPlayCase()3302 void MediaPlayListProxyModelTest::testBringUpAndPlayCase()
3303 {
3304     MediaPlayList myPlayList;
3305     QAbstractItemModelTester testModel(&myPlayList);
3306     MediaPlayListProxyModel myPlayListProxyModel;
3307     myPlayListProxyModel.setPlayListModel(&myPlayList);
3308     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3309     DatabaseInterface myDatabaseContent;
3310     TracksListener myListener(&myDatabaseContent);
3311 
3312     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3313     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3314 
3315     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3316 
3317     connect(&myListener, &TracksListener::trackHasChanged,
3318             &myPlayList, &MediaPlayList::trackChanged,
3319             Qt::QueuedConnection);
3320     connect(&myListener, &TracksListener::tracksListAdded,
3321             &myPlayList, &MediaPlayList::tracksListAdded,
3322             Qt::QueuedConnection);
3323     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3324             &myListener, &TracksListener::trackByNameInList,
3325             Qt::QueuedConnection);
3326     connect(&myPlayList, &MediaPlayList::newEntryInList,
3327             &myListener, &TracksListener::newEntryInList,
3328             Qt::QueuedConnection);
3329     connect(&myPlayList, &MediaPlayList::newUrlInList,
3330             &myListener, &TracksListener::newUrlInList,
3331             Qt::QueuedConnection);
3332     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3333             &myListener, &TracksListener::tracksAdded);
3334 
3335     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3336 
3337     QCOMPARE(currentTrackChangedSpy.count(), 0);
3338     QCOMPARE(playListFinishedSpy.count(), 0);
3339 
3340     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3341                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3342                                    QStringLiteral("track1"), {}}}, {}, {});
3343     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3344                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3345                                    QStringLiteral("track3"), {}}}, {}, {});
3346 
3347     QCOMPARE(currentTrackChangedSpy.count(), 1);
3348     QCOMPARE(playListFinishedSpy.count(), 0);
3349 
3350     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3351 
3352     myPlayListProxyModel.skipNextTrack();
3353 
3354     QCOMPARE(currentTrackChangedSpy.count(), 2);
3355     QCOMPARE(playListFinishedSpy.count(), 0);
3356 
3357     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3358 }
3359 
testBringUpAndSkipNextCase()3360 void MediaPlayListProxyModelTest::testBringUpAndSkipNextCase()
3361 {
3362     MediaPlayList myPlayList;
3363     QAbstractItemModelTester testModel(&myPlayList);
3364     MediaPlayListProxyModel myPlayListProxyModel;
3365     myPlayListProxyModel.setPlayListModel(&myPlayList);
3366     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3367     DatabaseInterface myDatabaseContent;
3368     TracksListener myListener(&myDatabaseContent);
3369 
3370     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3371     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3372 
3373     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3374 
3375     connect(&myListener, &TracksListener::trackHasChanged,
3376             &myPlayList, &MediaPlayList::trackChanged,
3377             Qt::QueuedConnection);
3378     connect(&myListener, &TracksListener::tracksListAdded,
3379             &myPlayList, &MediaPlayList::tracksListAdded,
3380             Qt::QueuedConnection);
3381     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3382             &myListener, &TracksListener::trackByNameInList,
3383             Qt::QueuedConnection);
3384     connect(&myPlayList, &MediaPlayList::newEntryInList,
3385             &myListener, &TracksListener::newEntryInList,
3386             Qt::QueuedConnection);
3387     connect(&myPlayList, &MediaPlayList::newUrlInList,
3388             &myListener, &TracksListener::newUrlInList,
3389             Qt::QueuedConnection);
3390     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3391             &myListener, &TracksListener::tracksAdded);
3392 
3393     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3394 
3395     QCOMPARE(currentTrackChangedSpy.count(), 0);
3396     QCOMPARE(playListFinishedSpy.count(), 0);
3397 
3398     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3399                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3400                                    QStringLiteral("track1"), {}}}, {}, {});
3401     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3402                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3403                                    QStringLiteral("track3"), {}}}, {}, {});
3404 
3405     QCOMPARE(currentTrackChangedSpy.count(), 1);
3406     QCOMPARE(playListFinishedSpy.count(), 0);
3407 
3408     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3409 
3410     myPlayListProxyModel.skipNextTrack();
3411 
3412     QCOMPARE(currentTrackChangedSpy.count(), 2);
3413     QCOMPARE(playListFinishedSpy.count(), 0);
3414 
3415     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3416 }
3417 
testBringUpAndSkipPreviousCase()3418 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousCase()
3419 {
3420     MediaPlayList myPlayList;
3421     QAbstractItemModelTester testModel(&myPlayList);
3422     MediaPlayListProxyModel myPlayListProxyModel;
3423     myPlayListProxyModel.setPlayListModel(&myPlayList);
3424     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3425     DatabaseInterface myDatabaseContent;
3426     TracksListener myListener(&myDatabaseContent);
3427 
3428     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3429     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3430 
3431     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3432 
3433     connect(&myListener, &TracksListener::trackHasChanged,
3434             &myPlayList, &MediaPlayList::trackChanged,
3435             Qt::QueuedConnection);
3436     connect(&myListener, &TracksListener::tracksListAdded,
3437             &myPlayList, &MediaPlayList::tracksListAdded,
3438             Qt::QueuedConnection);
3439     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3440             &myListener, &TracksListener::trackByNameInList,
3441             Qt::QueuedConnection);
3442     connect(&myPlayList, &MediaPlayList::newEntryInList,
3443             &myListener, &TracksListener::newEntryInList,
3444             Qt::QueuedConnection);
3445     connect(&myPlayList, &MediaPlayList::newUrlInList,
3446             &myListener, &TracksListener::newUrlInList,
3447             Qt::QueuedConnection);
3448     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3449             &myListener, &TracksListener::tracksAdded);
3450 
3451     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3452 
3453     QCOMPARE(currentTrackChangedSpy.count(), 0);
3454     QCOMPARE(playListFinishedSpy.count(), 0);
3455 
3456     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3457                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3458                                    QStringLiteral("track1"), {}}}, {}, {});
3459     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3460                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3461                                    QStringLiteral("track3"), {}}}, {}, {});
3462 
3463     QCOMPARE(currentTrackChangedSpy.count(), 1);
3464     QCOMPARE(playListFinishedSpy.count(), 0);
3465 
3466     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3467 
3468     myPlayListProxyModel.skipNextTrack();
3469 
3470     QCOMPARE(currentTrackChangedSpy.count(), 2);
3471     QCOMPARE(playListFinishedSpy.count(), 0);
3472 
3473     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3474 
3475     myPlayListProxyModel.skipPreviousTrack(0);
3476 
3477     QCOMPARE(currentTrackChangedSpy.count(), 3);
3478     QCOMPARE(playListFinishedSpy.count(), 0);
3479 
3480     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3481 }
3482 
testBringUpAndSkipPreviousWithSeekCase()3483 void MediaPlayListProxyModelTest::testBringUpAndSkipPreviousWithSeekCase()
3484 {
3485     MediaPlayList myPlayList;
3486     QAbstractItemModelTester testModel(&myPlayList);
3487     MediaPlayListProxyModel myPlayListProxyModel;
3488     myPlayListProxyModel.setPlayListModel(&myPlayList);
3489     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3490     DatabaseInterface myDatabaseContent;
3491     TracksListener myListener(&myDatabaseContent);
3492 
3493     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
3494     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
3495     QSignalSpy trackSeekedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::seek);
3496 
3497     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3498 
3499     connect(&myListener, &TracksListener::trackHasChanged,
3500             &myPlayList, &MediaPlayList::trackChanged,
3501             Qt::QueuedConnection);
3502     connect(&myListener, &TracksListener::tracksListAdded,
3503             &myPlayList, &MediaPlayList::tracksListAdded,
3504             Qt::QueuedConnection);
3505     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3506             &myListener, &TracksListener::trackByNameInList,
3507             Qt::QueuedConnection);
3508     connect(&myPlayList, &MediaPlayList::newEntryInList,
3509             &myListener, &TracksListener::newEntryInList,
3510             Qt::QueuedConnection);
3511     connect(&myPlayList, &MediaPlayList::newUrlInList,
3512             &myListener, &TracksListener::newUrlInList,
3513             Qt::QueuedConnection);
3514     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3515             &myListener, &TracksListener::tracksAdded);
3516 
3517     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3518 
3519     QCOMPARE(currentTrackChangedSpy.count(), 0);
3520     QCOMPARE(playListFinishedSpy.count(), 0);
3521 
3522     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3523                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
3524                                    QStringLiteral("track1"), {}}}, {}, {});
3525     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
3526                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
3527                                    QStringLiteral("track3"), {}}}, {}, {});
3528 
3529     QCOMPARE(currentTrackChangedSpy.count(), 1);
3530     QCOMPARE(playListFinishedSpy.count(), 0);
3531     QCOMPARE(trackSeekedSpy.count(), 0);
3532 
3533     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3534 
3535     myPlayListProxyModel.skipNextTrack();
3536 
3537     QCOMPARE(currentTrackChangedSpy.count(), 2);
3538     QCOMPARE(playListFinishedSpy.count(), 0);
3539     QCOMPARE(trackSeekedSpy.count(), 0);
3540 
3541     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
3542 
3543     myPlayListProxyModel.skipPreviousTrack(10000);
3544 
3545     QCOMPARE(currentTrackChangedSpy.count(), 2);
3546     QCOMPARE(playListFinishedSpy.count(), 0);
3547     QCOMPARE(trackSeekedSpy.count(), 1);
3548 
3549     myPlayListProxyModel.skipPreviousTrack(0);
3550 
3551     QCOMPARE(currentTrackChangedSpy.count(), 3);
3552     QCOMPARE(playListFinishedSpy.count(), 0);
3553     QCOMPARE(trackSeekedSpy.count(), 1);
3554 
3555     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
3556 }
3557 
testRemoveSelection()3558 void MediaPlayListProxyModelTest::testRemoveSelection()
3559 {
3560     MediaPlayList myPlayList;
3561     QAbstractItemModelTester testModel(&myPlayList);
3562     MediaPlayListProxyModel myPlayListProxyModel;
3563     myPlayListProxyModel.setPlayListModel(&myPlayList);
3564     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3565     DatabaseInterface myDatabaseContent;
3566     TracksListener myListener(&myDatabaseContent);
3567 
3568     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3569     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3570     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3571     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3572     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3573     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3574     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3575     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3576     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3577     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3578     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3579 
3580     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3581     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3582     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3583     QCOMPARE(rowsRemovedSpy.count(), 0);
3584     QCOMPARE(rowsMovedSpy.count(), 0);
3585     QCOMPARE(rowsInsertedSpy.count(), 0);
3586     QCOMPARE(persistentStateChangedSpy.count(), 0);
3587     QCOMPARE(dataChangedSpy.count(), 0);
3588     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3589     QCOMPARE(newEntryInListSpy.count(), 0);
3590 
3591     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3592 
3593     connect(&myListener, &TracksListener::trackHasChanged,
3594             &myPlayList, &MediaPlayList::trackChanged,
3595             Qt::QueuedConnection);
3596     connect(&myListener, &TracksListener::tracksListAdded,
3597             &myPlayList, &MediaPlayList::tracksListAdded,
3598             Qt::QueuedConnection);
3599     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3600             &myListener, &TracksListener::trackByNameInList,
3601             Qt::QueuedConnection);
3602     connect(&myPlayList, &MediaPlayList::newEntryInList,
3603             &myListener, &TracksListener::newEntryInList,
3604             Qt::QueuedConnection);
3605     connect(&myPlayList, &MediaPlayList::newUrlInList,
3606             &myListener, &TracksListener::newUrlInList,
3607             Qt::QueuedConnection);
3608     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3609             &myListener, &TracksListener::tracksAdded);
3610 
3611     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3612 
3613     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3614     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3615     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3616     QCOMPARE(rowsRemovedSpy.count(), 0);
3617     QCOMPARE(rowsMovedSpy.count(), 0);
3618     QCOMPARE(rowsInsertedSpy.count(), 0);
3619     QCOMPARE(persistentStateChangedSpy.count(), 0);
3620     QCOMPARE(dataChangedSpy.count(), 0);
3621     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3622     QCOMPARE(newEntryInListSpy.count(), 0);
3623 
3624     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}},
3625                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3626 
3627     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3628     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3629     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3630     QCOMPARE(rowsRemovedSpy.count(), 0);
3631     QCOMPARE(rowsMovedSpy.count(), 0);
3632     QCOMPARE(rowsInsertedSpy.count(), 1);
3633     QCOMPARE(persistentStateChangedSpy.count(), 1);
3634     QCOMPARE(dataChangedSpy.count(), 0);
3635     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3636     QCOMPARE(newEntryInListSpy.count(), 1);
3637 
3638     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3639 
3640     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
3641     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3642     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3643     QCOMPARE(rowsRemovedSpy.count(),1);
3644     QCOMPARE(rowsMovedSpy.count(), 0);
3645     QCOMPARE(rowsInsertedSpy.count(), 2);
3646     QCOMPARE(persistentStateChangedSpy.count(), 3);
3647     QCOMPARE(dataChangedSpy.count(), 0);
3648     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3649     QCOMPARE(newEntryInListSpy.count(), 1);
3650 
3651     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
3652 
3653     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3654     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3655     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3656     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3657     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3658     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3659     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3660     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3661     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3662     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3663     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3664     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3665     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3666     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3667     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3668     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
3669     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3670     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3671     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3672     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
3673     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3674     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3675     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3676     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3677     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3678     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3679     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3680     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3681     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3682     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
3683     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3684     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3685     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3686     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
3687     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3688     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3689     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
3690     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3691     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3692     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3693     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
3694     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3695 
3696     myPlayListProxyModel.removeSelection({2, 4, 5});
3697 
3698     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 4);
3699     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3700     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3701     QCOMPARE(rowsRemovedSpy.count(), 4);
3702     QCOMPARE(rowsMovedSpy.count(), 0);
3703     QCOMPARE(rowsInsertedSpy.count(), 2);
3704     QCOMPARE(persistentStateChangedSpy.count(), 6);
3705     QCOMPARE(dataChangedSpy.count(), 0);
3706     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3707     QCOMPARE(newEntryInListSpy.count(), 1);
3708 
3709     QCOMPARE(myPlayListProxyModel.tracksCount(), 3);
3710 
3711     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3712     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3713     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3714     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3715     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3716     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3717     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3718     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3719     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
3720     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3721     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3722     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3723     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
3724     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3725     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3726     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3727     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
3728     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
3729     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
3730     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3731     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
3732 }
3733 
testReplaceAndPlayArtist()3734 void MediaPlayListProxyModelTest::testReplaceAndPlayArtist()
3735 {
3736     MediaPlayList myPlayList;
3737     QAbstractItemModelTester testModel(&myPlayList);
3738     MediaPlayListProxyModel myPlayListProxyModel;
3739     myPlayListProxyModel.setPlayListModel(&myPlayList);
3740     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3741     DatabaseInterface myDatabaseContent;
3742     TracksListener myListener(&myDatabaseContent);
3743 
3744     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3745     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3746     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3747     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3748     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3749     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3750     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3751     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3752     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3753     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3754     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3755 
3756     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3757     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3758     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3759     QCOMPARE(rowsRemovedSpy.count(), 0);
3760     QCOMPARE(rowsMovedSpy.count(), 0);
3761     QCOMPARE(rowsInsertedSpy.count(), 0);
3762     QCOMPARE(persistentStateChangedSpy.count(), 0);
3763     QCOMPARE(dataChangedSpy.count(), 0);
3764     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3765     QCOMPARE(newEntryInListSpy.count(), 0);
3766 
3767     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3768 
3769     connect(&myListener, &TracksListener::trackHasChanged,
3770             &myPlayList, &MediaPlayList::trackChanged,
3771             Qt::QueuedConnection);
3772     connect(&myListener, &TracksListener::tracksListAdded,
3773             &myPlayList, &MediaPlayList::tracksListAdded,
3774             Qt::QueuedConnection);
3775     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3776             &myListener, &TracksListener::trackByNameInList,
3777             Qt::QueuedConnection);
3778     connect(&myPlayList, &MediaPlayList::newEntryInList,
3779             &myListener, &TracksListener::newEntryInList,
3780             Qt::QueuedConnection);
3781     connect(&myPlayList, &MediaPlayList::newUrlInList,
3782             &myListener, &TracksListener::newUrlInList,
3783             Qt::QueuedConnection);
3784     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3785             &myListener, &TracksListener::tracksAdded);
3786 
3787     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3788 
3789     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3790     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3791     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3792     QCOMPARE(rowsRemovedSpy.count(), 0);
3793     QCOMPARE(rowsMovedSpy.count(), 0);
3794     QCOMPARE(rowsInsertedSpy.count(), 0);
3795     QCOMPARE(persistentStateChangedSpy.count(), 0);
3796     QCOMPARE(dataChangedSpy.count(), 0);
3797     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3798     QCOMPARE(newEntryInListSpy.count(), 0);
3799 
3800     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist3"), {}}},
3801                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3802 
3803     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3804     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3805     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3806     QCOMPARE(rowsRemovedSpy.count(), 0);
3807     QCOMPARE(rowsMovedSpy.count(), 0);
3808     QCOMPARE(rowsInsertedSpy.count(), 1);
3809     QCOMPARE(persistentStateChangedSpy.count(), 1);
3810     QCOMPARE(dataChangedSpy.count(), 0);
3811     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3812     QCOMPARE(newEntryInListSpy.count(), 1);
3813 
3814     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3815 
3816     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
3817     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3818     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
3819     QCOMPARE(rowsRemovedSpy.count(), 1);
3820     QCOMPARE(rowsMovedSpy.count(), 0);
3821     QCOMPARE(rowsInsertedSpy.count(), 2);
3822     QCOMPARE(persistentStateChangedSpy.count(), 3);
3823     QCOMPARE(dataChangedSpy.count(), 0);
3824     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3825     QCOMPARE(newEntryInListSpy.count(), 1);
3826 
3827     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
3828 
3829     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3830     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3831     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3);
3832     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3"));
3833     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3834     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3835     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3836     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3);
3837     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
3838     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3")));
3839     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
3840     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
3841 
3842     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist4"), {}}},
3843                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3844 
3845     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
3846     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3847     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
3848     QCOMPARE(rowsRemovedSpy.count(), 2);
3849     QCOMPARE(rowsMovedSpy.count(), 0);
3850     QCOMPARE(rowsInsertedSpy.count(), 3);
3851     QCOMPARE(persistentStateChangedSpy.count(), 5);
3852     QCOMPARE(dataChangedSpy.count(), 0);
3853     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3854     QCOMPARE(newEntryInListSpy.count(), 2);
3855 
3856     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
3857 
3858     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 3);
3859     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3860     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
3861     QCOMPARE(rowsRemovedSpy.count(), 3);
3862     QCOMPARE(rowsMovedSpy.count(), 0);
3863     QCOMPARE(rowsInsertedSpy.count(), 4);
3864     QCOMPARE(persistentStateChangedSpy.count(), 7);
3865     QCOMPARE(dataChangedSpy.count(), 0);
3866     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3867     QCOMPARE(newEntryInListSpy.count(), 2);
3868 
3869     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
3870 
3871     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3872     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
3873     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4);
3874     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4"));
3875     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3876     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3877     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
3878     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4);
3879     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
3880     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4")));
3881     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
3882     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
3883 }
3884 
testReplaceAndPlayTrackId()3885 void MediaPlayListProxyModelTest::testReplaceAndPlayTrackId()
3886 {
3887     MediaPlayList myPlayList;
3888     QAbstractItemModelTester testModel(&myPlayList);
3889     MediaPlayListProxyModel myPlayListProxyModel;
3890     myPlayListProxyModel.setPlayListModel(&myPlayList);
3891     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
3892     DatabaseInterface myDatabaseContent;
3893     TracksListener myListener(&myDatabaseContent);
3894 
3895     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
3896     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
3897     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
3898     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
3899     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
3900     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
3901     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
3902     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
3903     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
3904     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
3905     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
3906 
3907     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3908     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3909     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3910     QCOMPARE(rowsRemovedSpy.count(), 0);
3911     QCOMPARE(rowsMovedSpy.count(), 0);
3912     QCOMPARE(rowsInsertedSpy.count(), 0);
3913     QCOMPARE(persistentStateChangedSpy.count(), 0);
3914     QCOMPARE(dataChangedSpy.count(), 0);
3915     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3916     QCOMPARE(newEntryInListSpy.count(), 0);
3917 
3918     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
3919 
3920     connect(&myListener, &TracksListener::trackHasChanged,
3921             &myPlayList, &MediaPlayList::trackChanged,
3922             Qt::QueuedConnection);
3923     connect(&myListener, &TracksListener::tracksListAdded,
3924             &myPlayList, &MediaPlayList::tracksListAdded,
3925             Qt::QueuedConnection);
3926     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
3927             &myListener, &TracksListener::trackByNameInList,
3928             Qt::QueuedConnection);
3929     connect(&myPlayList, &MediaPlayList::newEntryInList,
3930             &myListener, &TracksListener::newEntryInList,
3931             Qt::QueuedConnection);
3932     connect(&myPlayList, &MediaPlayList::newUrlInList,
3933             &myListener, &TracksListener::newUrlInList,
3934             Qt::QueuedConnection);
3935     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
3936             &myListener, &TracksListener::tracksAdded);
3937 
3938     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
3939 
3940     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3941     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3942     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
3943     QCOMPARE(rowsRemovedSpy.count(), 0);
3944     QCOMPARE(rowsMovedSpy.count(), 0);
3945     QCOMPARE(rowsInsertedSpy.count(), 0);
3946     QCOMPARE(persistentStateChangedSpy.count(), 0);
3947     QCOMPARE(dataChangedSpy.count(), 0);
3948     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3949     QCOMPARE(newEntryInListSpy.count(), 0);
3950 
3951     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"),
3952                                                                                QStringLiteral("album1"), 3, 3);
3953 
3954     QCOMPARE(firstTrackId != 0, true);
3955 
3956     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}},
3957                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
3958 
3959     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3960     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3961     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3962     QCOMPARE(rowsRemovedSpy.count(), 0);
3963     QCOMPARE(rowsMovedSpy.count(), 0);
3964     QCOMPARE(rowsInsertedSpy.count(), 1);
3965     QCOMPARE(persistentStateChangedSpy.count(), 1);
3966     QCOMPARE(dataChangedSpy.count(), 0);
3967     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3968     QCOMPARE(newEntryInListSpy.count(), 1);
3969 
3970     QCOMPARE(dataChangedSpy.wait(), true);
3971 
3972     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
3973     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
3974     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
3975     QCOMPARE(rowsRemovedSpy.count(), 0);
3976     QCOMPARE(rowsMovedSpy.count(), 0);
3977     QCOMPARE(rowsInsertedSpy.count(), 1);
3978     QCOMPARE(persistentStateChangedSpy.count(), 1);
3979     QCOMPARE(dataChangedSpy.count(), 1);
3980     QCOMPARE(newTrackByNameInListSpy.count(), 0);
3981     QCOMPARE(newEntryInListSpy.count(), 1);
3982 
3983     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
3984 
3985     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
3986     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
3987     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 3);
3988     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist3"));
3989     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
3990     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
3991     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
3992     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 3);
3993     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
3994     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$3")));
3995     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
3996     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
3997 
3998     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist4"),
3999                                                                                 QStringLiteral("album1"), 4, 4);
4000 
4001     QCOMPARE(secondTrackId != 0, true);
4002 
4003     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track}, {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}},
4004                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
4005 
4006     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4007     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4008     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4009     QCOMPARE(rowsRemovedSpy.count(), 1);
4010     QCOMPARE(rowsMovedSpy.count(), 0);
4011     QCOMPARE(rowsInsertedSpy.count(), 2);
4012     QCOMPARE(persistentStateChangedSpy.count(), 3);
4013     QCOMPARE(dataChangedSpy.count(), 1);
4014     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4015     QCOMPARE(newEntryInListSpy.count(), 2);
4016 
4017     QCOMPARE(dataChangedSpy.wait(), true);
4018 
4019     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4020     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4021     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4022     QCOMPARE(rowsRemovedSpy.count(), 1);
4023     QCOMPARE(rowsMovedSpy.count(), 0);
4024     QCOMPARE(rowsInsertedSpy.count(), 2);
4025     QCOMPARE(persistentStateChangedSpy.count(), 3);
4026     QCOMPARE(dataChangedSpy.count(), 2);
4027     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4028     QCOMPARE(newEntryInListSpy.count(), 2);
4029 
4030     QCOMPARE(myPlayListProxyModel.tracksCount(), 1);
4031 
4032     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4033     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4034     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DurationRole).toTime().msecsSinceStartOfDay(), 4);
4035     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist4"));
4036     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4037     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4038     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4039     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 4);
4040     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ImageUrlRole).toUrl(), QUrl::fromLocalFile(QStringLiteral("album1")));
4041     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ResourceRole).toUrl(), QUrl::fromUserInput(QStringLiteral("/$4")));
4042     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
4043     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsSingleDiscAlbumRole).toBool(), false);
4044 }
4045 
testTrackBeenRemoved()4046 void MediaPlayListProxyModelTest::testTrackBeenRemoved()
4047 {
4048     MediaPlayList myPlayList;
4049     QAbstractItemModelTester testModel(&myPlayList);
4050     MediaPlayListProxyModel myPlayListProxyModel;
4051     myPlayListProxyModel.setPlayListModel(&myPlayList);
4052     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4053     DatabaseInterface myDatabaseContent;
4054     TracksListener myListener(&myDatabaseContent);
4055 
4056     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
4057     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
4058     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
4059     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
4060     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
4061     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
4062     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
4063     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
4064     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
4065     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
4066     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
4067 
4068     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4069     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4070     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4071     QCOMPARE(rowsRemovedSpy.count(), 0);
4072     QCOMPARE(rowsMovedSpy.count(), 0);
4073     QCOMPARE(rowsInsertedSpy.count(), 0);
4074     QCOMPARE(persistentStateChangedSpy.count(), 0);
4075     QCOMPARE(dataChangedSpy.count(), 0);
4076     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4077     QCOMPARE(newEntryInListSpy.count(), 0);
4078 
4079     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4080 
4081     connect(&myListener, &TracksListener::trackHasChanged,
4082             &myPlayList, &MediaPlayList::trackChanged,
4083             Qt::QueuedConnection);
4084     connect(&myListener, &TracksListener::tracksListAdded,
4085             &myPlayList, &MediaPlayList::tracksListAdded,
4086             Qt::QueuedConnection);
4087     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4088             &myListener, &TracksListener::trackByNameInList,
4089             Qt::QueuedConnection);
4090     connect(&myPlayList, &MediaPlayList::newEntryInList,
4091             &myListener, &TracksListener::newEntryInList,
4092             Qt::QueuedConnection);
4093     connect(&myPlayList, &MediaPlayList::newUrlInList,
4094             &myListener, &TracksListener::newUrlInList,
4095             Qt::QueuedConnection);
4096     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4097             &myListener, &TracksListener::tracksAdded);
4098 
4099     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4100 
4101     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4102     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4103     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4104     QCOMPARE(rowsRemovedSpy.count(), 0);
4105     QCOMPARE(rowsMovedSpy.count(), 0);
4106     QCOMPARE(rowsInsertedSpy.count(), 0);
4107     QCOMPARE(persistentStateChangedSpy.count(), 0);
4108     QCOMPARE(dataChangedSpy.count(), 0);
4109     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4110     QCOMPARE(newEntryInListSpy.count(), 0);
4111 
4112     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Artist}}, QStringLiteral("artist1"), {}}},
4113                                  ElisaUtils::PlayListEnqueueMode::ReplacePlayList, ElisaUtils::PlayListEnqueueTriggerPlay::TriggerPlay);
4114 
4115     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4116     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4117     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4118     QCOMPARE(rowsRemovedSpy.count(), 0);
4119     QCOMPARE(rowsMovedSpy.count(), 0);
4120     QCOMPARE(rowsInsertedSpy.count(), 1);
4121     QCOMPARE(persistentStateChangedSpy.count(), 1);
4122     QCOMPARE(dataChangedSpy.count(), 0);
4123     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4124     QCOMPARE(newEntryInListSpy.count(), 1);
4125 
4126     QCOMPARE(rowsAboutToBeInsertedSpy.wait(), true);
4127 
4128     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4129     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4130     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4131     QCOMPARE(rowsRemovedSpy.count(), 1);
4132     QCOMPARE(rowsMovedSpy.count(), 0);
4133     QCOMPARE(rowsInsertedSpy.count(), 2);
4134     QCOMPARE(persistentStateChangedSpy.count(), 3);
4135     QCOMPARE(dataChangedSpy.count(), 0);
4136     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4137     QCOMPARE(newEntryInListSpy.count(), 1);
4138 
4139     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
4140 
4141     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4142     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4143     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4144     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4145     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4146     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4147     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4148     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4149     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4150     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4151     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4152     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4153     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4154     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4155     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4156     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
4157     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4158     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4159     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4160     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 2);
4161     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4162     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4163     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
4164     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4165     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4166     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4167     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
4168     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4169     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4170     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4171     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4172     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4173     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4174     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4175     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4176     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4177     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
4178     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4179     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4180     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4181     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
4182     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4183 
4184     auto removedTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"),
4185                                                                                  QStringLiteral("album2"), 2, 1);
4186 
4187     QCOMPARE(removedTrackId != 0, true);
4188 
4189     auto removedTrack = myDatabaseContent.trackDataFromDatabaseId(removedTrackId);
4190 
4191     QVERIFY(!removedTrack.isEmpty());
4192 
4193     myPlayList.trackRemoved(removedTrack[DataTypes::DatabaseIdRole].toULongLong());
4194 
4195     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
4196     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4197     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4198     QCOMPARE(rowsRemovedSpy.count(), 1);
4199     QCOMPARE(rowsMovedSpy.count(), 0);
4200     QCOMPARE(rowsInsertedSpy.count(), 2);
4201     QCOMPARE(persistentStateChangedSpy.count(), 3);
4202     QCOMPARE(dataChangedSpy.count(), 1);
4203     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4204     QCOMPARE(newEntryInListSpy.count(), 1);
4205 
4206     QCOMPARE(myPlayListProxyModel.tracksCount(), 6);
4207 
4208     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4209     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4210     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4211     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("Various Artists"));
4212     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album1"));
4213     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4214     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4215     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4216     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track1"));
4217     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4218     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4219     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4220     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 1);
4221     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4222     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), false);
4223     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track2"));
4224     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4225     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4226     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4227     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), -1);
4228     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 0);
4229     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4230     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track3"));
4231     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4232     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4233     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4234     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 3);
4235     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(3, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4236     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4237     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track4"));
4238     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4239     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4240     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4241     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 4);
4242     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(4, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4243     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::IsValidRole).toBool(), true);
4244     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TitleRole).toString(), QStringLiteral("track5"));
4245     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::ArtistRole).toString(), QStringLiteral("artist1"));
4246     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumArtistRole).toString(), QStringLiteral("artist1"));
4247     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::AlbumRole).toString(), QStringLiteral("album2"));
4248     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::TrackNumberRole).toInt(), 5);
4249     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(5, 0), MediaPlayList::ColumnsRoles::DiscNumberRole).toInt(), 1);
4250 }
4251 
finishPlayList()4252 void MediaPlayListProxyModelTest::finishPlayList()
4253 {
4254     MediaPlayList myPlayList;
4255     QAbstractItemModelTester testModel(&myPlayList);
4256     MediaPlayListProxyModel myPlayListProxyModel;
4257     myPlayListProxyModel.setPlayListModel(&myPlayList);
4258     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4259     DatabaseInterface myDatabaseContent;
4260     TracksListener myListener(&myDatabaseContent);
4261 
4262     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4263     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4264 
4265     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4266 
4267     connect(&myListener, &TracksListener::trackHasChanged,
4268             &myPlayList, &MediaPlayList::trackChanged,
4269             Qt::QueuedConnection);
4270     connect(&myListener, &TracksListener::tracksListAdded,
4271             &myPlayList, &MediaPlayList::tracksListAdded,
4272             Qt::QueuedConnection);
4273     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4274             &myListener, &TracksListener::trackByNameInList,
4275             Qt::QueuedConnection);
4276     connect(&myPlayList, &MediaPlayList::newEntryInList,
4277             &myListener, &TracksListener::newEntryInList,
4278             Qt::QueuedConnection);
4279     connect(&myPlayList, &MediaPlayList::newUrlInList,
4280             &myListener, &TracksListener::newUrlInList,
4281             Qt::QueuedConnection);
4282     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4283             &myListener, &TracksListener::tracksAdded);
4284 
4285     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4286 
4287     QCOMPARE(currentTrackChangedSpy.count(), 0);
4288     QCOMPARE(playListFinishedSpy.count(), 0);
4289 
4290     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4291                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4292                                    QStringLiteral("track1"), {}}}, {}, {});
4293     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4294                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"), QStringLiteral("album1"), 3, 3)}},
4295                                    QStringLiteral("track3"), {}}}, {}, {});
4296 
4297     QCOMPARE(currentTrackChangedSpy.count(), 1);
4298     QCOMPARE(playListFinishedSpy.count(), 0);
4299 
4300     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4301 
4302     myPlayListProxyModel.skipNextTrack();
4303 
4304     QCOMPARE(currentTrackChangedSpy.count(), 2);
4305     QCOMPARE(playListFinishedSpy.count(), 0);
4306 
4307     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4308 
4309     myPlayListProxyModel.skipNextTrack();
4310 
4311     QCOMPARE(currentTrackChangedSpy.count(), 3);
4312     QCOMPARE(playListFinishedSpy.count(), 1);
4313 
4314     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4315 }
4316 
removeBeforeCurrentTrack()4317 void MediaPlayListProxyModelTest::removeBeforeCurrentTrack()
4318 {
4319     MediaPlayList myPlayList;
4320     QAbstractItemModelTester testModel(&myPlayList);
4321     MediaPlayListProxyModel myPlayListProxyModel;
4322     myPlayListProxyModel.setPlayListModel(&myPlayList);
4323     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4324     DatabaseInterface myDatabaseContent;
4325     TracksListener myListener(&myDatabaseContent);
4326 
4327     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4328     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4329 
4330     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4331 
4332     connect(&myListener, &TracksListener::trackHasChanged,
4333             &myPlayList, &MediaPlayList::trackChanged,
4334             Qt::QueuedConnection);
4335     connect(&myListener, &TracksListener::tracksListAdded,
4336             &myPlayList, &MediaPlayList::tracksListAdded,
4337             Qt::QueuedConnection);
4338     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4339             &myListener, &TracksListener::trackByNameInList,
4340             Qt::QueuedConnection);
4341     connect(&myPlayList, &MediaPlayList::newEntryInList,
4342             &myListener, &TracksListener::newEntryInList,
4343             Qt::QueuedConnection);
4344     connect(&myPlayList, &MediaPlayList::newUrlInList,
4345             &myListener, &TracksListener::newUrlInList,
4346             Qt::QueuedConnection);
4347     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4348             &myListener, &TracksListener::tracksAdded);
4349 
4350     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4351 
4352     QCOMPARE(currentTrackChangedSpy.count(), 0);
4353     QCOMPARE(playListFinishedSpy.count(), 0);
4354 
4355     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4356                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4357                                    QStringLiteral("track1"), {}}}, {}, {});
4358     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4359                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
4360                                    QStringLiteral("track3"), {}}}, {}, {});
4361     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4362                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track5"), QStringLiteral("artist1"), QStringLiteral("album2"), 5, 1)}},
4363                                    QStringLiteral("track5"), {}}}, {}, {});
4364     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4365                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4366                                    QStringLiteral("track1"), {}}}, {}, {});
4367 
4368     QCOMPARE(currentTrackChangedSpy.count(), 1);
4369     QCOMPARE(playListFinishedSpy.count(), 0);
4370 
4371     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4372 
4373     myPlayListProxyModel.skipNextTrack();
4374 
4375     QCOMPARE(currentTrackChangedSpy.count(), 2);
4376     QCOMPARE(playListFinishedSpy.count(), 0);
4377 
4378     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4379 
4380     myPlayListProxyModel.skipNextTrack();
4381 
4382     QCOMPARE(currentTrackChangedSpy.count(), 3);
4383     QCOMPARE(playListFinishedSpy.count(), 0);
4384 
4385     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
4386 
4387     myPlayListProxyModel.skipNextTrack();
4388 
4389     QCOMPARE(currentTrackChangedSpy.count(), 4);
4390     QCOMPARE(playListFinishedSpy.count(), 0);
4391 
4392     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(3, 0)));
4393 
4394     myPlayListProxyModel.removeRow(1);
4395 
4396     QCOMPARE(currentTrackChangedSpy.count(), 4);
4397     QCOMPARE(playListFinishedSpy.count(), 0);
4398 }
4399 
switchToTrackTest()4400 void MediaPlayListProxyModelTest::switchToTrackTest()
4401 {
4402     MediaPlayList myPlayList;
4403     QAbstractItemModelTester testModel(&myPlayList);
4404     MediaPlayListProxyModel myPlayListProxyModel;
4405     myPlayListProxyModel.setPlayListModel(&myPlayList);
4406     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4407     DatabaseInterface myDatabaseContent;
4408     TracksListener myListener(&myDatabaseContent);
4409 
4410     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4411     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4412 
4413     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4414 
4415     connect(&myListener, &TracksListener::trackHasChanged,
4416             &myPlayList, &MediaPlayList::trackChanged,
4417             Qt::QueuedConnection);
4418     connect(&myListener, &TracksListener::tracksListAdded,
4419             &myPlayList, &MediaPlayList::tracksListAdded,
4420             Qt::QueuedConnection);
4421     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4422             &myListener, &TracksListener::trackByNameInList,
4423             Qt::QueuedConnection);
4424     connect(&myPlayList, &MediaPlayList::newEntryInList,
4425             &myListener, &TracksListener::newEntryInList,
4426             Qt::QueuedConnection);
4427     connect(&myPlayList, &MediaPlayList::newUrlInList,
4428             &myListener, &TracksListener::newUrlInList,
4429             Qt::QueuedConnection);
4430     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4431             &myListener, &TracksListener::tracksAdded);
4432 
4433     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4434 
4435     QCOMPARE(currentTrackChangedSpy.count(), 0);
4436     QCOMPARE(playListFinishedSpy.count(), 0);
4437 
4438     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4439                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4440                                    QStringLiteral("track1"), {}}}, {}, {});
4441     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4442                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist3"), QStringLiteral("album1"), 3, 3)}},
4443                                    QStringLiteral("track3"), {}}}, {}, {});
4444     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4445                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album1"), 4, 4)}},
4446                                    QStringLiteral("track4"), {}}}, {}, {});
4447     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4448                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
4449                                    QStringLiteral("track2"), {}}}, {}, {});
4450     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4451                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4452                                    QStringLiteral("track1"), {}}}, {}, {});
4453 
4454     QCOMPARE(currentTrackChangedSpy.count(), 1);
4455     QCOMPARE(playListFinishedSpy.count(), 0);
4456 
4457     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4458 
4459     myPlayListProxyModel.switchTo(4);
4460 
4461     QCOMPARE(currentTrackChangedSpy.count(), 2);
4462     QCOMPARE(playListFinishedSpy.count(), 0);
4463 
4464     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(4, 0)));
4465 }
4466 
singleTrack()4467 void MediaPlayListProxyModelTest::singleTrack()
4468 {
4469     MediaPlayList myPlayList;
4470     QAbstractItemModelTester testModel(&myPlayList);
4471     MediaPlayListProxyModel myPlayListProxyModel;
4472     myPlayListProxyModel.setPlayListModel(&myPlayList);
4473     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4474     DatabaseInterface myDatabaseContent;
4475     TracksListener myListener(&myDatabaseContent);
4476 
4477     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4478     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4479 
4480     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4481 
4482     connect(&myListener, &TracksListener::trackHasChanged,
4483             &myPlayList, &MediaPlayList::trackChanged,
4484             Qt::QueuedConnection);
4485     connect(&myListener, &TracksListener::tracksListAdded,
4486             &myPlayList, &MediaPlayList::tracksListAdded,
4487             Qt::QueuedConnection);
4488     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4489             &myListener, &TracksListener::trackByNameInList,
4490             Qt::QueuedConnection);
4491     connect(&myPlayList, &MediaPlayList::newEntryInList,
4492             &myListener, &TracksListener::newEntryInList,
4493             Qt::QueuedConnection);
4494     connect(&myPlayList, &MediaPlayList::newUrlInList,
4495             &myListener, &TracksListener::newUrlInList,
4496             Qt::QueuedConnection);
4497     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4498             &myListener, &TracksListener::tracksAdded);
4499 
4500     QCOMPARE(currentTrackChangedSpy.count(), 0);
4501     QCOMPARE(playListFinishedSpy.count(), 0);
4502 
4503     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4504 
4505     QCOMPARE(currentTrackChangedSpy.count(), 0);
4506     QCOMPARE(playListFinishedSpy.count(), 0);
4507 
4508     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4509                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4510                                    QStringLiteral("track1"), {}}}, {}, {});
4511 
4512     QCOMPARE(currentTrackChangedSpy.count(), 1);
4513     QCOMPARE(playListFinishedSpy.count(), 0);
4514 
4515     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4516 
4517     myPlayListProxyModel.skipNextTrack();
4518 
4519     QCOMPARE(currentTrackChangedSpy.count(), 2);
4520     QCOMPARE(playListFinishedSpy.count(), 1);
4521 
4522     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4523 }
4524 
testBringUpAndRemoveCase()4525 void MediaPlayListProxyModelTest::testBringUpAndRemoveCase()
4526 {
4527     MediaPlayList myPlayList;
4528     QAbstractItemModelTester testModel(&myPlayList);
4529     MediaPlayListProxyModel myPlayListProxyModel;
4530     myPlayListProxyModel.setPlayListModel(&myPlayList);
4531     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4532     DatabaseInterface myDatabaseContent;
4533     TracksListener myListener(&myDatabaseContent);
4534 
4535     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4536     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4537 
4538     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4539 
4540     connect(&myListener, &TracksListener::trackHasChanged,
4541             &myPlayList, &MediaPlayList::trackChanged,
4542             Qt::QueuedConnection);
4543     connect(&myListener, &TracksListener::tracksListAdded,
4544             &myPlayList, &MediaPlayList::tracksListAdded,
4545             Qt::QueuedConnection);
4546     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4547             &myListener, &TracksListener::trackByNameInList,
4548             Qt::QueuedConnection);
4549     connect(&myPlayList, &MediaPlayList::newEntryInList,
4550             &myListener, &TracksListener::newEntryInList,
4551             Qt::QueuedConnection);
4552     connect(&myPlayList, &MediaPlayList::newUrlInList,
4553             &myListener, &TracksListener::newUrlInList,
4554             Qt::QueuedConnection);
4555     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4556             &myListener, &TracksListener::tracksAdded);
4557 
4558     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4559 
4560     QCOMPARE(currentTrackChangedSpy.count(), 0);
4561     QCOMPARE(playListFinishedSpy.count(), 0);
4562 
4563     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4564                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4565                                    QStringLiteral("track1"), {}}}, {}, {});
4566 
4567     QCOMPARE(currentTrackChangedSpy.count(), 1);
4568     QCOMPARE(playListFinishedSpy.count(), 0);
4569 
4570     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4571 
4572     myPlayListProxyModel.removeRow(0);
4573 
4574     QCOMPARE(currentTrackChangedSpy.count(), 2);
4575     QCOMPARE(playListFinishedSpy.count(), 1);
4576 
4577     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex());
4578 }
4579 
testBringUpAndRemoveLastCase()4580 void MediaPlayListProxyModelTest::testBringUpAndRemoveLastCase()
4581 {
4582     MediaPlayList myPlayList;
4583     QAbstractItemModelTester testModel(&myPlayList);
4584     MediaPlayListProxyModel myPlayListProxyModel;
4585     myPlayListProxyModel.setPlayListModel(&myPlayList);
4586     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4587     DatabaseInterface myDatabaseContent;
4588     TracksListener myListener(&myDatabaseContent);
4589 
4590     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4591     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4592 
4593     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4594 
4595     connect(&myListener, &TracksListener::trackHasChanged,
4596             &myPlayList, &MediaPlayList::trackChanged,
4597             Qt::QueuedConnection);
4598     connect(&myListener, &TracksListener::tracksListAdded,
4599             &myPlayList, &MediaPlayList::tracksListAdded,
4600             Qt::QueuedConnection);
4601     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4602             &myListener, &TracksListener::trackByNameInList,
4603             Qt::QueuedConnection);
4604     connect(&myPlayList, &MediaPlayList::newEntryInList,
4605             &myListener, &TracksListener::newEntryInList,
4606             Qt::QueuedConnection);
4607     connect(&myPlayList, &MediaPlayList::newUrlInList,
4608             &myListener, &TracksListener::newUrlInList,
4609             Qt::QueuedConnection);
4610     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4611             &myListener, &TracksListener::tracksAdded);
4612 
4613     QCOMPARE(currentTrackChangedSpy.count(), 0);
4614     QCOMPARE(playListFinishedSpy.count(), 0);
4615 
4616     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4617 
4618     QCOMPARE(currentTrackChangedSpy.count(), 0);
4619     QCOMPARE(playListFinishedSpy.count(), 0);
4620 
4621     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4622                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4623                                    QStringLiteral("track1"), {}}}, {}, {});
4624     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4625                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1)}},
4626                                    QStringLiteral("track2"), {}}}, {}, {});
4627     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4628                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1)}},
4629                                    QStringLiteral("track3"), {}}}, {}, {});
4630 
4631     QCOMPARE(currentTrackChangedSpy.count(), 1);
4632     QCOMPARE(playListFinishedSpy.count(), 0);
4633 
4634     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4635 
4636     myPlayListProxyModel.skipNextTrack();
4637 
4638     QCOMPARE(currentTrackChangedSpy.count(), 2);
4639     QCOMPARE(playListFinishedSpy.count(), 0);
4640 
4641     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(1, 0)));
4642 
4643     myPlayListProxyModel.skipNextTrack();
4644 
4645     QCOMPARE(currentTrackChangedSpy.count(), 3);
4646     QCOMPARE(playListFinishedSpy.count(), 0);
4647 
4648     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(2, 0)));
4649 
4650     myPlayListProxyModel.removeRow(2);
4651 
4652     QCOMPARE(currentTrackChangedSpy.count(), 4);
4653     QCOMPARE(playListFinishedSpy.count(), 1);
4654 
4655     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4656 }
4657 
testBringUpAndRemoveMultipleCase()4658 void MediaPlayListProxyModelTest::testBringUpAndRemoveMultipleCase()
4659 {
4660     MediaPlayList myPlayList;
4661     QAbstractItemModelTester testModel(&myPlayList);
4662     MediaPlayListProxyModel myPlayListProxyModel;
4663     myPlayListProxyModel.setPlayListModel(&myPlayList);
4664     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4665     DatabaseInterface myDatabaseContent;
4666     TracksListener myListener(&myDatabaseContent);
4667 
4668     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4669     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4670 
4671     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4672 
4673     connect(&myListener, &TracksListener::trackHasChanged,
4674             &myPlayList, &MediaPlayList::trackChanged,
4675             Qt::QueuedConnection);
4676     connect(&myListener, &TracksListener::tracksListAdded,
4677             &myPlayList, &MediaPlayList::tracksListAdded,
4678             Qt::QueuedConnection);
4679     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4680             &myListener, &TracksListener::trackByNameInList,
4681             Qt::QueuedConnection);
4682     connect(&myPlayList, &MediaPlayList::newEntryInList,
4683             &myListener, &TracksListener::newEntryInList,
4684             Qt::QueuedConnection);
4685     connect(&myPlayList, &MediaPlayList::newUrlInList,
4686             &myListener, &TracksListener::newUrlInList,
4687             Qt::QueuedConnection);
4688     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4689             &myListener, &TracksListener::tracksAdded);
4690 
4691     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4692 
4693     QCOMPARE(currentTrackChangedSpy.count(), 0);
4694     QCOMPARE(playListFinishedSpy.count(), 0);
4695 
4696     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4697                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4698                                    QStringLiteral("track1"), {}}}, {}, {});
4699 
4700     QCOMPARE(currentTrackChangedSpy.count(), 1);
4701     QCOMPARE(playListFinishedSpy.count(), 0);
4702 
4703     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4704 
4705     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4706                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album1"), 2, 2)}},
4707                                    QStringLiteral("track2"), {}}}, {}, {});
4708 
4709     QCOMPARE(currentTrackChangedSpy.count(), 1);
4710     QCOMPARE(playListFinishedSpy.count(), 0);
4711 
4712     myPlayListProxyModel.removeRow(0);
4713 
4714     QCOMPARE(currentTrackChangedSpy.count(), 2);
4715     QCOMPARE(playListFinishedSpy.count(), 0);
4716 
4717     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4718 }
4719 
testBringUpAndDownCase()4720 void MediaPlayListProxyModelTest::testBringUpAndDownCase()
4721 {
4722     MediaPlayList myPlayList;
4723     QAbstractItemModelTester testModel(&myPlayList);
4724     MediaPlayListProxyModel myPlayListProxyModel;
4725     myPlayListProxyModel.setPlayListModel(&myPlayList);
4726     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4727     DatabaseInterface myDatabaseContent;
4728     TracksListener myListener(&myDatabaseContent);
4729 
4730     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4731     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4732 
4733     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4734 
4735     connect(&myListener, &TracksListener::trackHasChanged,
4736             &myPlayList, &MediaPlayList::trackChanged,
4737             Qt::QueuedConnection);
4738     connect(&myListener, &TracksListener::tracksListAdded,
4739             &myPlayList, &MediaPlayList::tracksListAdded,
4740             Qt::QueuedConnection);
4741     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4742             &myListener, &TracksListener::trackByNameInList,
4743             Qt::QueuedConnection);
4744     connect(&myPlayList, &MediaPlayList::newEntryInList,
4745             &myListener, &TracksListener::newEntryInList,
4746             Qt::QueuedConnection);
4747     connect(&myPlayList, &MediaPlayList::newUrlInList,
4748             &myListener, &TracksListener::newUrlInList,
4749             Qt::QueuedConnection);
4750     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4751             &myListener, &TracksListener::tracksAdded);
4752 
4753     QCOMPARE(currentTrackChangedSpy.count(), 0);
4754     QCOMPARE(playListFinishedSpy.count(), 0);
4755 
4756     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4757 
4758     QCOMPARE(currentTrackChangedSpy.count(), 0);
4759     QCOMPARE(playListFinishedSpy.count(), 0);
4760 
4761     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4762                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4763                                    QStringLiteral("track1"), {}}}, {}, {});
4764 
4765     QCOMPARE(currentTrackChangedSpy.count(), 1);
4766     QCOMPARE(playListFinishedSpy.count(), 0);
4767 
4768     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4769 
4770     myPlayListProxyModel.removeRow(0);
4771 
4772     QCOMPARE(currentTrackChangedSpy.count(), 2);
4773     QCOMPARE(playListFinishedSpy.count(), 1);
4774 
4775     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex());
4776 }
4777 
testBringUpCase()4778 void MediaPlayListProxyModelTest::testBringUpCase()
4779 {
4780     MediaPlayList myPlayList;
4781     QAbstractItemModelTester testModel(&myPlayList);
4782     MediaPlayListProxyModel myPlayListProxyModel;
4783     myPlayListProxyModel.setPlayListModel(&myPlayList);
4784     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4785     DatabaseInterface myDatabaseContent;
4786     TracksListener myListener(&myDatabaseContent);
4787 
4788     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4789     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4790 
4791     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4792 
4793     connect(&myListener, &TracksListener::trackHasChanged,
4794             &myPlayList, &MediaPlayList::trackChanged,
4795             Qt::QueuedConnection);
4796     connect(&myListener, &TracksListener::tracksListAdded,
4797             &myPlayList, &MediaPlayList::tracksListAdded,
4798             Qt::QueuedConnection);
4799     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4800             &myListener, &TracksListener::trackByNameInList,
4801             Qt::QueuedConnection);
4802     connect(&myPlayList, &MediaPlayList::newEntryInList,
4803             &myListener, &TracksListener::newEntryInList,
4804             Qt::QueuedConnection);
4805     connect(&myPlayList, &MediaPlayList::newUrlInList,
4806             &myListener, &TracksListener::newUrlInList,
4807             Qt::QueuedConnection);
4808     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4809             &myListener, &TracksListener::tracksAdded);
4810 
4811     QCOMPARE(currentTrackChangedSpy.count(), 0);
4812     QCOMPARE(playListFinishedSpy.count(), 0);
4813 
4814     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4815 
4816     QCOMPARE(currentTrackChangedSpy.count(), 0);
4817     QCOMPARE(playListFinishedSpy.count(), 0);
4818 
4819     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4820                                     {DataTypes::DatabaseIdRole, myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1)}},
4821                                    QStringLiteral("track1"), {}}}, {}, {});
4822 
4823     QCOMPARE(currentTrackChangedSpy.count(), 1);
4824     QCOMPARE(playListFinishedSpy.count(), 0);
4825 
4826     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4827 }
4828 
testBringUpCaseFromNewAlbum()4829 void MediaPlayListProxyModelTest::testBringUpCaseFromNewAlbum()
4830 {
4831     MediaPlayList myPlayList;
4832     QAbstractItemModelTester testModel(&myPlayList);
4833     MediaPlayListProxyModel myPlayListProxyModel;
4834     myPlayListProxyModel.setPlayListModel(&myPlayList);
4835     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4836     DatabaseInterface myDatabaseContent;
4837     TracksListener myListener(&myDatabaseContent);
4838 
4839     QSignalSpy currentTrackChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::currentTrackChanged);
4840     QSignalSpy playListFinishedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::playListFinished);
4841 
4842     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4843 
4844     connect(&myListener, &TracksListener::trackHasChanged,
4845             &myPlayList, &MediaPlayList::trackChanged,
4846             Qt::QueuedConnection);
4847     connect(&myListener, &TracksListener::tracksListAdded,
4848             &myPlayList, &MediaPlayList::tracksListAdded,
4849             Qt::QueuedConnection);
4850     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4851             &myListener, &TracksListener::trackByNameInList,
4852             Qt::QueuedConnection);
4853     connect(&myPlayList, &MediaPlayList::newEntryInList,
4854             &myListener, &TracksListener::newEntryInList,
4855             Qt::QueuedConnection);
4856     connect(&myPlayList, &MediaPlayList::newUrlInList,
4857             &myListener, &TracksListener::newUrlInList,
4858             Qt::QueuedConnection);
4859     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4860             &myListener, &TracksListener::tracksAdded);
4861 
4862     QCOMPARE(currentTrackChangedSpy.count(), 0);
4863     QCOMPARE(playListFinishedSpy.count(), 0);
4864 
4865     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4866 
4867     QCOMPARE(currentTrackChangedSpy.count(), 0);
4868     QCOMPARE(playListFinishedSpy.count(), 0);
4869 
4870     auto newTrackID = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
4871                                                                              QStringLiteral("album2"), 1, 1);
4872 
4873     QVERIFY(newTrackID != 0);
4874 
4875     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4876                                     {DataTypes::DatabaseIdRole, newTrackID}}, QStringLiteral("track1"), {}}}, {}, {});
4877 
4878     QCOMPARE(currentTrackChangedSpy.count(), 1);
4879     QCOMPARE(playListFinishedSpy.count(), 0);
4880 
4881     QCOMPARE(myPlayListProxyModel.currentTrack(), QPersistentModelIndex(myPlayListProxyModel.index(0, 0)));
4882 }
4883 
testSetData()4884 void MediaPlayListProxyModelTest::testSetData()
4885 {
4886     MediaPlayList myPlayList;
4887     QAbstractItemModelTester testModel(&myPlayList);
4888     MediaPlayListProxyModel myPlayListProxyModel;
4889     myPlayListProxyModel.setPlayListModel(&myPlayList);
4890     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
4891     DatabaseInterface myDatabaseContent;
4892     TracksListener myListener(&myDatabaseContent);
4893 
4894     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
4895     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
4896     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
4897     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
4898     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
4899     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
4900     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
4901     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
4902     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
4903     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
4904     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
4905 
4906     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4907     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4908     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4909     QCOMPARE(rowsRemovedSpy.count(), 0);
4910     QCOMPARE(rowsMovedSpy.count(), 0);
4911     QCOMPARE(rowsInsertedSpy.count(), 0);
4912     QCOMPARE(persistentStateChangedSpy.count(), 0);
4913     QCOMPARE(dataChangedSpy.count(), 0);
4914     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4915     QCOMPARE(newEntryInListSpy.count(), 0);
4916 
4917     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
4918 
4919     connect(&myListener, &TracksListener::trackHasChanged,
4920             &myPlayList, &MediaPlayList::trackChanged,
4921             Qt::QueuedConnection);
4922     connect(&myListener, &TracksListener::tracksListAdded,
4923             &myPlayList, &MediaPlayList::tracksListAdded,
4924             Qt::QueuedConnection);
4925     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
4926             &myListener, &TracksListener::trackByNameInList,
4927             Qt::QueuedConnection);
4928     connect(&myPlayList, &MediaPlayList::newEntryInList,
4929             &myListener, &TracksListener::newEntryInList,
4930             Qt::QueuedConnection);
4931     connect(&myPlayList, &MediaPlayList::newUrlInList,
4932             &myListener, &TracksListener::newUrlInList,
4933             Qt::QueuedConnection);
4934     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
4935             &myListener, &TracksListener::tracksAdded);
4936 
4937     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
4938 
4939     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4940     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4941     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
4942     QCOMPARE(rowsRemovedSpy.count(), 0);
4943     QCOMPARE(rowsMovedSpy.count(), 0);
4944     QCOMPARE(rowsInsertedSpy.count(), 0);
4945     QCOMPARE(persistentStateChangedSpy.count(), 0);
4946     QCOMPARE(dataChangedSpy.count(), 0);
4947     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4948     QCOMPARE(newEntryInListSpy.count(), 0);
4949 
4950     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
4951                                                                                QStringLiteral("album3"), 1, 1);
4952     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4953                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
4954 
4955     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4956     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4957     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4958     QCOMPARE(rowsRemovedSpy.count(), 0);
4959     QCOMPARE(rowsMovedSpy.count(), 0);
4960     QCOMPARE(rowsInsertedSpy.count(), 1);
4961     QCOMPARE(persistentStateChangedSpy.count(), 1);
4962     QCOMPARE(dataChangedSpy.count(), 0);
4963     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4964     QCOMPARE(newEntryInListSpy.count(), 1);
4965 
4966     QCOMPARE(dataChangedSpy.wait(), true);
4967 
4968     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4969     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4970     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
4971     QCOMPARE(rowsRemovedSpy.count(), 0);
4972     QCOMPARE(rowsMovedSpy.count(), 0);
4973     QCOMPARE(rowsInsertedSpy.count(), 1);
4974     QCOMPARE(persistentStateChangedSpy.count(), 1);
4975     QCOMPARE(dataChangedSpy.count(), 1);
4976     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4977     QCOMPARE(newEntryInListSpy.count(), 1);
4978 
4979     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
4980 
4981     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
4982                                                                                 QStringLiteral("album1"), 1, 1);
4983     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
4984                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
4985 
4986     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
4987     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
4988     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
4989     QCOMPARE(rowsRemovedSpy.count(), 0);
4990     QCOMPARE(rowsMovedSpy.count(), 0);
4991     QCOMPARE(rowsInsertedSpy.count(), 2);
4992     QCOMPARE(persistentStateChangedSpy.count(), 2);
4993     QCOMPARE(dataChangedSpy.count(), 1);
4994     QCOMPARE(newTrackByNameInListSpy.count(), 0);
4995     QCOMPARE(newEntryInListSpy.count(), 2);
4996 
4997     QCOMPARE(dataChangedSpy.wait(), true);
4998 
4999     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5000     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5001     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5002     QCOMPARE(rowsRemovedSpy.count(), 0);
5003     QCOMPARE(rowsMovedSpy.count(), 0);
5004     QCOMPARE(rowsInsertedSpy.count(), 2);
5005     QCOMPARE(persistentStateChangedSpy.count(), 2);
5006     QCOMPARE(dataChangedSpy.count(), 2);
5007     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5008     QCOMPARE(newEntryInListSpy.count(), 2);
5009 
5010     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5011     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5012 
5013     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
5014                                                                                QStringLiteral("album3"), 2, 1);
5015     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5016                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5017 
5018     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5019     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5020     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5021     QCOMPARE(rowsRemovedSpy.count(), 0);
5022     QCOMPARE(rowsMovedSpy.count(), 0);
5023     QCOMPARE(rowsInsertedSpy.count(), 3);
5024     QCOMPARE(persistentStateChangedSpy.count(), 3);
5025     QCOMPARE(dataChangedSpy.count(), 2);
5026     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5027     QCOMPARE(newEntryInListSpy.count(), 3);
5028 
5029     QCOMPARE(dataChangedSpy.wait(), true);
5030 
5031     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5032     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5033     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5034     QCOMPARE(rowsRemovedSpy.count(), 0);
5035     QCOMPARE(rowsMovedSpy.count(), 0);
5036     QCOMPARE(rowsInsertedSpy.count(), 3);
5037     QCOMPARE(persistentStateChangedSpy.count(), 3);
5038     QCOMPARE(dataChangedSpy.count(), 3);
5039     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5040     QCOMPARE(newEntryInListSpy.count(), 3);
5041 
5042     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5043     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5044     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5045 
5046     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::IsPlayingRole), true);
5047 
5048     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5049     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5050     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5051     QCOMPARE(rowsRemovedSpy.count(), 0);
5052     QCOMPARE(rowsMovedSpy.count(), 0);
5053     QCOMPARE(rowsInsertedSpy.count(), 3);
5054     QCOMPARE(persistentStateChangedSpy.count(), 3);
5055     QCOMPARE(dataChangedSpy.count(), 4);
5056     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5057     QCOMPARE(newEntryInListSpy.count(), 3);
5058 
5059     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5060     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), false);
5061     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(2, 0), MediaPlayList::ColumnsRoles::IsPlayingRole).toBool(), true);
5062 
5063     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(2, 0), true, MediaPlayList::ColumnsRoles::SecondaryTextRole), false);
5064 
5065     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5066     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5067     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5068     QCOMPARE(rowsRemovedSpy.count(), 0);
5069     QCOMPARE(rowsMovedSpy.count(), 0);
5070     QCOMPARE(rowsInsertedSpy.count(), 3);
5071     QCOMPARE(persistentStateChangedSpy.count(), 3);
5072     QCOMPARE(dataChangedSpy.count(), 4);
5073     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5074     QCOMPARE(newEntryInListSpy.count(), 3);
5075 
5076     QCOMPARE(myPlayListProxyModel.setData(myPlayListProxyModel.index(4, 0), true, MediaPlayList::ColumnsRoles::TitleRole), false);
5077 
5078     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5079     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5080     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5081     QCOMPARE(rowsRemovedSpy.count(), 0);
5082     QCOMPARE(rowsMovedSpy.count(), 0);
5083     QCOMPARE(rowsInsertedSpy.count(), 3);
5084     QCOMPARE(persistentStateChangedSpy.count(), 3);
5085     QCOMPARE(dataChangedSpy.count(), 4);
5086     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5087     QCOMPARE(newEntryInListSpy.count(), 3);
5088 
5089     QCOMPARE(myPlayListProxyModel.setData({}, true, MediaPlayList::ColumnsRoles::TitleRole), false);
5090 
5091     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5092     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5093     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5094     QCOMPARE(rowsRemovedSpy.count(), 0);
5095     QCOMPARE(rowsMovedSpy.count(), 0);
5096     QCOMPARE(rowsInsertedSpy.count(), 3);
5097     QCOMPARE(persistentStateChangedSpy.count(), 3);
5098     QCOMPARE(dataChangedSpy.count(), 4);
5099     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5100     QCOMPARE(newEntryInListSpy.count(), 3);
5101 }
5102 
testHasHeader()5103 void MediaPlayListProxyModelTest::testHasHeader()
5104 {
5105     MediaPlayList myPlayList;
5106     QAbstractItemModelTester testModel(&myPlayList);
5107     MediaPlayListProxyModel myPlayListProxyModel;
5108     myPlayListProxyModel.setPlayListModel(&myPlayList);
5109     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5110     DatabaseInterface myDatabaseContent;
5111     TracksListener myListener(&myDatabaseContent);
5112 
5113     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5114     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5115     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5116     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5117     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5118     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5119     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5120     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5121     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5122     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5123     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5124 
5125     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5126     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5127     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5128     QCOMPARE(rowsRemovedSpy.count(), 0);
5129     QCOMPARE(rowsMovedSpy.count(), 0);
5130     QCOMPARE(rowsInsertedSpy.count(), 0);
5131     QCOMPARE(persistentStateChangedSpy.count(), 0);
5132     QCOMPARE(dataChangedSpy.count(), 0);
5133     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5134     QCOMPARE(newEntryInListSpy.count(), 0);
5135 
5136     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5137 
5138     connect(&myListener, &TracksListener::trackHasChanged,
5139             &myPlayList, &MediaPlayList::trackChanged,
5140             Qt::QueuedConnection);
5141     connect(&myListener, &TracksListener::tracksListAdded,
5142             &myPlayList, &MediaPlayList::tracksListAdded,
5143             Qt::QueuedConnection);
5144     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5145             &myListener, &TracksListener::trackByNameInList,
5146             Qt::QueuedConnection);
5147     connect(&myPlayList, &MediaPlayList::newEntryInList,
5148             &myListener, &TracksListener::newEntryInList,
5149             Qt::QueuedConnection);
5150     connect(&myPlayList, &MediaPlayList::newUrlInList,
5151             &myListener, &TracksListener::newUrlInList,
5152             Qt::QueuedConnection);
5153     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5154             &myListener, &TracksListener::tracksAdded);
5155 
5156     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5157 
5158     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5159     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5160     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5161     QCOMPARE(rowsRemovedSpy.count(), 0);
5162     QCOMPARE(rowsMovedSpy.count(), 0);
5163     QCOMPARE(rowsInsertedSpy.count(), 0);
5164     QCOMPARE(persistentStateChangedSpy.count(), 0);
5165     QCOMPARE(dataChangedSpy.count(), 0);
5166     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5167     QCOMPARE(newEntryInListSpy.count(), 0);
5168 
5169     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5170     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5171                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5172 
5173     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5174     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5175     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5176     QCOMPARE(rowsRemovedSpy.count(), 0);
5177     QCOMPARE(rowsMovedSpy.count(), 0);
5178     QCOMPARE(rowsInsertedSpy.count(), 1);
5179     QCOMPARE(persistentStateChangedSpy.count(), 1);
5180     QCOMPARE(dataChangedSpy.count(), 0);
5181     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5182     QCOMPARE(newEntryInListSpy.count(), 1);
5183 
5184     QCOMPARE(dataChangedSpy.wait(), true);
5185 
5186     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5187     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5188     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5189     QCOMPARE(rowsRemovedSpy.count(), 0);
5190     QCOMPARE(rowsMovedSpy.count(), 0);
5191     QCOMPARE(rowsInsertedSpy.count(), 1);
5192     QCOMPARE(persistentStateChangedSpy.count(), 1);
5193     QCOMPARE(dataChangedSpy.count(), 1);
5194     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5195     QCOMPARE(newEntryInListSpy.count(), 1);
5196 
5197     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
5198     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5199                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5200 
5201     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5202     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5203     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5204     QCOMPARE(rowsRemovedSpy.count(), 0);
5205     QCOMPARE(rowsMovedSpy.count(), 0);
5206     QCOMPARE(rowsInsertedSpy.count(), 2);
5207     QCOMPARE(persistentStateChangedSpy.count(), 2);
5208     QCOMPARE(dataChangedSpy.count(), 1);
5209     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5210     QCOMPARE(newEntryInListSpy.count(), 2);
5211 
5212     QCOMPARE(dataChangedSpy.wait(), true);
5213 
5214     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5215     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5216     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5217     QCOMPARE(rowsRemovedSpy.count(), 0);
5218     QCOMPARE(rowsMovedSpy.count(), 0);
5219     QCOMPARE(rowsInsertedSpy.count(), 2);
5220     QCOMPARE(persistentStateChangedSpy.count(), 2);
5221     QCOMPARE(dataChangedSpy.count(), 2);
5222     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5223     QCOMPARE(newEntryInListSpy.count(), 2);
5224 
5225     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5226     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5227                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5228 
5229     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5230     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5231     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5232     QCOMPARE(rowsRemovedSpy.count(), 0);
5233     QCOMPARE(rowsMovedSpy.count(), 0);
5234     QCOMPARE(rowsInsertedSpy.count(), 3);
5235     QCOMPARE(persistentStateChangedSpy.count(), 3);
5236     QCOMPARE(dataChangedSpy.count(), 2);
5237     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5238     QCOMPARE(newEntryInListSpy.count(), 3);
5239 
5240     QCOMPARE(dataChangedSpy.wait(), true);
5241 
5242     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5243     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5244     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5245     QCOMPARE(rowsRemovedSpy.count(), 0);
5246     QCOMPARE(rowsMovedSpy.count(), 0);
5247     QCOMPARE(rowsInsertedSpy.count(), 3);
5248     QCOMPARE(persistentStateChangedSpy.count(), 3);
5249     QCOMPARE(dataChangedSpy.count(), 3);
5250     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5251     QCOMPARE(newEntryInListSpy.count(), 3);
5252 
5253     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5254     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5255                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5256 
5257     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5258     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5259     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5260     QCOMPARE(rowsRemovedSpy.count(), 0);
5261     QCOMPARE(rowsMovedSpy.count(), 0);
5262     QCOMPARE(rowsInsertedSpy.count(), 4);
5263     QCOMPARE(persistentStateChangedSpy.count(), 4);
5264     QCOMPARE(dataChangedSpy.count(), 3);
5265     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5266     QCOMPARE(newEntryInListSpy.count(), 4);
5267 
5268     QCOMPARE(dataChangedSpy.wait(), true);
5269 
5270     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5271     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5272     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5273     QCOMPARE(rowsRemovedSpy.count(), 0);
5274     QCOMPARE(rowsMovedSpy.count(), 0);
5275     QCOMPARE(rowsInsertedSpy.count(), 4);
5276     QCOMPARE(persistentStateChangedSpy.count(), 4);
5277     QCOMPARE(dataChangedSpy.count(), 4);
5278     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5279     QCOMPARE(newEntryInListSpy.count(), 4);
5280 
5281     myPlayListProxyModel.removeRow(2);
5282 
5283     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
5284     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5285     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5286     QCOMPARE(rowsRemovedSpy.count(), 1);
5287     QCOMPARE(rowsMovedSpy.count(), 0);
5288     QCOMPARE(rowsInsertedSpy.count(), 4);
5289     QCOMPARE(persistentStateChangedSpy.count(), 5);
5290     QCOMPARE(dataChangedSpy.count(), 4);
5291     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5292     QCOMPARE(newEntryInListSpy.count(), 4);
5293 }
5294 
testHasHeaderWithRemove()5295 void MediaPlayListProxyModelTest::testHasHeaderWithRemove()
5296 {
5297     MediaPlayList myPlayList;
5298     QAbstractItemModelTester testModel(&myPlayList);
5299     MediaPlayListProxyModel myPlayListProxyModel;
5300     myPlayListProxyModel.setPlayListModel(&myPlayList);
5301     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5302     DatabaseInterface myDatabaseContent;
5303     TracksListener myListener(&myDatabaseContent);
5304 
5305     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5306     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5307     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5308     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5309     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5310     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5311     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5312     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
5313     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5314     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5315     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5316 
5317     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5318     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5319     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5320     QCOMPARE(rowsRemovedSpy.count(), 0);
5321     QCOMPARE(rowsMovedSpy.count(), 0);
5322     QCOMPARE(rowsInsertedSpy.count(), 0);
5323     QCOMPARE(persistentStateChangedSpy.count(), 0);
5324     QCOMPARE(dataChangedSpy.count(), 0);
5325     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5326     QCOMPARE(newEntryInListSpy.count(), 0);
5327 
5328     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5329 
5330     connect(&myListener, &TracksListener::trackHasChanged,
5331             &myPlayList, &MediaPlayList::trackChanged,
5332             Qt::QueuedConnection);
5333     connect(&myListener, &TracksListener::tracksListAdded,
5334             &myPlayList, &MediaPlayList::tracksListAdded,
5335             Qt::QueuedConnection);
5336     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5337             &myListener, &TracksListener::trackByNameInList,
5338             Qt::QueuedConnection);
5339     connect(&myPlayList, &MediaPlayList::newEntryInList,
5340             &myListener, &TracksListener::newEntryInList,
5341             Qt::QueuedConnection);
5342     connect(&myPlayList, &MediaPlayList::newUrlInList,
5343             &myListener, &TracksListener::newUrlInList,
5344             Qt::QueuedConnection);
5345     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5346             &myListener, &TracksListener::tracksAdded);
5347 
5348     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5349 
5350     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5351     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5352     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5353     QCOMPARE(rowsRemovedSpy.count(), 0);
5354     QCOMPARE(rowsMovedSpy.count(), 0);
5355     QCOMPARE(rowsInsertedSpy.count(), 0);
5356     QCOMPARE(persistentStateChangedSpy.count(), 0);
5357     QCOMPARE(dataChangedSpy.count(), 0);
5358     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5359     QCOMPARE(newEntryInListSpy.count(), 0);
5360 
5361     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5362     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5363                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5364 
5365     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5366     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5367     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5368     QCOMPARE(rowsRemovedSpy.count(), 0);
5369     QCOMPARE(rowsMovedSpy.count(), 0);
5370     QCOMPARE(rowsInsertedSpy.count(), 1);
5371     QCOMPARE(persistentStateChangedSpy.count(), 1);
5372     QCOMPARE(dataChangedSpy.count(), 0);
5373     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5374     QCOMPARE(newEntryInListSpy.count(), 1);
5375 
5376     QCOMPARE(dataChangedSpy.wait(), true);
5377 
5378     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5379     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5380     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5381     QCOMPARE(rowsRemovedSpy.count(), 0);
5382     QCOMPARE(rowsMovedSpy.count(), 0);
5383     QCOMPARE(rowsInsertedSpy.count(), 1);
5384     QCOMPARE(persistentStateChangedSpy.count(), 1);
5385     QCOMPARE(dataChangedSpy.count(), 1);
5386     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5387     QCOMPARE(newEntryInListSpy.count(), 1);
5388 
5389     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5390     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5391                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5392 
5393     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5394     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5395     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5396     QCOMPARE(rowsRemovedSpy.count(), 0);
5397     QCOMPARE(rowsMovedSpy.count(), 0);
5398     QCOMPARE(rowsInsertedSpy.count(), 2);
5399     QCOMPARE(persistentStateChangedSpy.count(), 2);
5400     QCOMPARE(dataChangedSpy.count(), 1);
5401     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5402     QCOMPARE(newEntryInListSpy.count(), 2);
5403 
5404     QCOMPARE(dataChangedSpy.wait(), true);
5405 
5406     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5407     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5408     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5409     QCOMPARE(rowsRemovedSpy.count(), 0);
5410     QCOMPARE(rowsMovedSpy.count(), 0);
5411     QCOMPARE(rowsInsertedSpy.count(), 2);
5412     QCOMPARE(persistentStateChangedSpy.count(), 2);
5413     QCOMPARE(dataChangedSpy.count(), 2);
5414     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5415     QCOMPARE(newEntryInListSpy.count(), 2);
5416 
5417     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
5418     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5419                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5420 
5421     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5422     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5423     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5424     QCOMPARE(rowsRemovedSpy.count(), 0);
5425     QCOMPARE(rowsMovedSpy.count(), 0);
5426     QCOMPARE(rowsInsertedSpy.count(), 3);
5427     QCOMPARE(persistentStateChangedSpy.count(), 3);
5428     QCOMPARE(dataChangedSpy.count(), 2);
5429     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5430     QCOMPARE(newEntryInListSpy.count(), 3);
5431 
5432     QCOMPARE(dataChangedSpy.wait(), true);
5433 
5434     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5435     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5436     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5437     QCOMPARE(rowsRemovedSpy.count(), 0);
5438     QCOMPARE(rowsMovedSpy.count(), 0);
5439     QCOMPARE(rowsInsertedSpy.count(), 3);
5440     QCOMPARE(persistentStateChangedSpy.count(), 3);
5441     QCOMPARE(dataChangedSpy.count(), 3);
5442     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5443     QCOMPARE(newEntryInListSpy.count(), 3);
5444 
5445     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5446     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5447                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5448 
5449     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5450     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5451     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5452     QCOMPARE(rowsRemovedSpy.count(), 0);
5453     QCOMPARE(rowsMovedSpy.count(), 0);
5454     QCOMPARE(rowsInsertedSpy.count(), 4);
5455     QCOMPARE(persistentStateChangedSpy.count(), 4);
5456     QCOMPARE(dataChangedSpy.count(), 3);
5457     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5458     QCOMPARE(newEntryInListSpy.count(), 4);
5459 
5460     QCOMPARE(dataChangedSpy.wait(), true);
5461 
5462     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5463     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5464     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5465     QCOMPARE(rowsRemovedSpy.count(), 0);
5466     QCOMPARE(rowsMovedSpy.count(), 0);
5467     QCOMPARE(rowsInsertedSpy.count(), 4);
5468     QCOMPARE(persistentStateChangedSpy.count(), 4);
5469     QCOMPARE(dataChangedSpy.count(), 4);
5470     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5471     QCOMPARE(newEntryInListSpy.count(), 4);
5472 
5473     myPlayListProxyModel.removeRow(2);
5474 
5475     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1);
5476     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5477     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5478     QCOMPARE(rowsRemovedSpy.count(), 1);
5479     QCOMPARE(rowsMovedSpy.count(), 0);
5480     QCOMPARE(rowsInsertedSpy.count(), 4);
5481     QCOMPARE(persistentStateChangedSpy.count(), 5);
5482     QCOMPARE(dataChangedSpy.count(), 4);
5483     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5484     QCOMPARE(newEntryInListSpy.count(), 4);
5485 
5486     myPlayListProxyModel.removeRow(0);
5487 
5488     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 2);
5489     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5490     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5491     QCOMPARE(rowsRemovedSpy.count(), 2);
5492     QCOMPARE(rowsMovedSpy.count(), 0);
5493     QCOMPARE(rowsInsertedSpy.count(), 4);
5494     QCOMPARE(persistentStateChangedSpy.count(), 6);
5495     QCOMPARE(dataChangedSpy.count(), 4);
5496     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5497     QCOMPARE(newEntryInListSpy.count(), 4);
5498 }
5499 
testHasHeaderMoveFirst()5500 void MediaPlayListProxyModelTest::testHasHeaderMoveFirst()
5501 {
5502     MediaPlayList myPlayList;
5503     QAbstractItemModelTester testModel(&myPlayList);
5504     MediaPlayListProxyModel myPlayListProxyModel;
5505     myPlayListProxyModel.setPlayListModel(&myPlayList);
5506     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5507     DatabaseInterface myDatabaseContent;
5508     TracksListener myListener(&myDatabaseContent);
5509 
5510     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5511     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5512     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5513     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5514     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5515     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5516     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5517     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5518     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5519     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5520     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5521 
5522     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5523     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5524     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5525     QCOMPARE(rowsRemovedSpy.count(), 0);
5526     QCOMPARE(rowsMovedSpy.count(), 0);
5527     QCOMPARE(rowsInsertedSpy.count(), 0);
5528     QCOMPARE(persistentStateChangedSpy.count(), 0);
5529     QCOMPARE(dataChangedSpy.count(), 0);
5530     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5531     QCOMPARE(newEntryInListSpy.count(), 0);
5532 
5533     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5534 
5535     connect(&myListener, &TracksListener::trackHasChanged,
5536             &myPlayList, &MediaPlayList::trackChanged,
5537             Qt::QueuedConnection);
5538     connect(&myListener, &TracksListener::tracksListAdded,
5539             &myPlayList, &MediaPlayList::tracksListAdded,
5540             Qt::QueuedConnection);
5541     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5542             &myListener, &TracksListener::trackByNameInList,
5543             Qt::QueuedConnection);
5544     connect(&myPlayList, &MediaPlayList::newEntryInList,
5545             &myListener, &TracksListener::newEntryInList,
5546             Qt::QueuedConnection);
5547     connect(&myPlayList, &MediaPlayList::newUrlInList,
5548             &myListener, &TracksListener::newUrlInList,
5549             Qt::QueuedConnection);
5550     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5551             &myListener, &TracksListener::tracksAdded);
5552 
5553     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5554 
5555     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5556     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5557     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5558     QCOMPARE(rowsRemovedSpy.count(), 0);
5559     QCOMPARE(rowsMovedSpy.count(), 0);
5560     QCOMPARE(rowsInsertedSpy.count(), 0);
5561     QCOMPARE(persistentStateChangedSpy.count(), 0);
5562     QCOMPARE(dataChangedSpy.count(), 0);
5563     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5564     QCOMPARE(newEntryInListSpy.count(), 0);
5565 
5566     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5567     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5568                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5569 
5570     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5571     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5572     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5573     QCOMPARE(rowsRemovedSpy.count(), 0);
5574     QCOMPARE(rowsMovedSpy.count(), 0);
5575     QCOMPARE(rowsInsertedSpy.count(), 1);
5576     QCOMPARE(persistentStateChangedSpy.count(), 1);
5577     QCOMPARE(dataChangedSpy.count(), 0);
5578     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5579     QCOMPARE(newEntryInListSpy.count(), 1);
5580 
5581     QCOMPARE(dataChangedSpy.wait(), true);
5582 
5583     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5584     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5585     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5586     QCOMPARE(rowsRemovedSpy.count(), 0);
5587     QCOMPARE(rowsMovedSpy.count(), 0);
5588     QCOMPARE(rowsInsertedSpy.count(), 1);
5589     QCOMPARE(persistentStateChangedSpy.count(), 1);
5590     QCOMPARE(dataChangedSpy.count(), 1);
5591     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5592     QCOMPARE(newEntryInListSpy.count(), 1);
5593 
5594     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5595     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5596                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5597 
5598     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5599     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5600     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5601     QCOMPARE(rowsRemovedSpy.count(), 0);
5602     QCOMPARE(rowsMovedSpy.count(), 0);
5603     QCOMPARE(rowsInsertedSpy.count(), 2);
5604     QCOMPARE(persistentStateChangedSpy.count(), 2);
5605     QCOMPARE(dataChangedSpy.count(), 1);
5606     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5607     QCOMPARE(newEntryInListSpy.count(), 2);
5608 
5609     QCOMPARE(dataChangedSpy.wait(), true);
5610 
5611     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5612     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5613     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5614     QCOMPARE(rowsRemovedSpy.count(), 0);
5615     QCOMPARE(rowsMovedSpy.count(), 0);
5616     QCOMPARE(rowsInsertedSpy.count(), 2);
5617     QCOMPARE(persistentStateChangedSpy.count(), 2);
5618     QCOMPARE(dataChangedSpy.count(), 2);
5619     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5620     QCOMPARE(newEntryInListSpy.count(), 2);
5621 
5622     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5623     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5624                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5625 
5626     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5627     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5628     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5629     QCOMPARE(rowsRemovedSpy.count(), 0);
5630     QCOMPARE(rowsMovedSpy.count(), 0);
5631     QCOMPARE(rowsInsertedSpy.count(), 3);
5632     QCOMPARE(persistentStateChangedSpy.count(), 3);
5633     QCOMPARE(dataChangedSpy.count(), 2);
5634     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5635     QCOMPARE(newEntryInListSpy.count(), 3);
5636 
5637     QCOMPARE(dataChangedSpy.wait(), true);
5638 
5639     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5640     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5641     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5642     QCOMPARE(rowsRemovedSpy.count(), 0);
5643     QCOMPARE(rowsMovedSpy.count(), 0);
5644     QCOMPARE(rowsInsertedSpy.count(), 3);
5645     QCOMPARE(persistentStateChangedSpy.count(), 3);
5646     QCOMPARE(dataChangedSpy.count(), 3);
5647     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5648     QCOMPARE(newEntryInListSpy.count(), 3);
5649 
5650     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
5651     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5652                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5653 
5654     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5655     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5656     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5657     QCOMPARE(rowsRemovedSpy.count(), 0);
5658     QCOMPARE(rowsMovedSpy.count(), 0);
5659     QCOMPARE(rowsInsertedSpy.count(), 4);
5660     QCOMPARE(persistentStateChangedSpy.count(), 4);
5661     QCOMPARE(dataChangedSpy.count(), 3);
5662     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5663     QCOMPARE(newEntryInListSpy.count(), 4);
5664 
5665     QCOMPARE(dataChangedSpy.wait(), true);
5666 
5667     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5668     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5669     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5670     QCOMPARE(rowsRemovedSpy.count(), 0);
5671     QCOMPARE(rowsMovedSpy.count(), 0);
5672     QCOMPARE(rowsInsertedSpy.count(), 4);
5673     QCOMPARE(persistentStateChangedSpy.count(), 4);
5674     QCOMPARE(dataChangedSpy.count(), 4);
5675     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5676     QCOMPARE(newEntryInListSpy.count(), 4);
5677 
5678     myPlayListProxyModel.moveRow(0, 3);
5679 
5680     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5681     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
5682     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5683     QCOMPARE(rowsRemovedSpy.count(), 0);
5684     QCOMPARE(rowsMovedSpy.count(), 1);
5685     QCOMPARE(rowsInsertedSpy.count(), 4);
5686     QCOMPARE(persistentStateChangedSpy.count(), 5);
5687     QCOMPARE(dataChangedSpy.count(), 4);
5688     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5689     QCOMPARE(newEntryInListSpy.count(), 4);
5690 }
5691 
testHasHeaderMoveAnother()5692 void MediaPlayListProxyModelTest::testHasHeaderMoveAnother()
5693 {
5694     MediaPlayList myPlayList;
5695     QAbstractItemModelTester testModel(&myPlayList);
5696     MediaPlayListProxyModel myPlayListProxyModel;
5697     myPlayListProxyModel.setPlayListModel(&myPlayList);
5698     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5699     DatabaseInterface myDatabaseContent;
5700     TracksListener myListener(&myDatabaseContent);
5701 
5702     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5703     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5704     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5705     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5706     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5707     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5708     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5709     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5710     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5711     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5712     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5713 
5714     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5715     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5716     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5717     QCOMPARE(rowsRemovedSpy.count(), 0);
5718     QCOMPARE(rowsMovedSpy.count(), 0);
5719     QCOMPARE(rowsInsertedSpy.count(), 0);
5720     QCOMPARE(persistentStateChangedSpy.count(), 0);
5721     QCOMPARE(dataChangedSpy.count(), 0);
5722     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5723     QCOMPARE(newEntryInListSpy.count(), 0);
5724 
5725     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5726 
5727     connect(&myListener, &TracksListener::trackHasChanged,
5728             &myPlayList, &MediaPlayList::trackChanged,
5729             Qt::QueuedConnection);
5730     connect(&myListener, &TracksListener::tracksListAdded,
5731             &myPlayList, &MediaPlayList::tracksListAdded,
5732             Qt::QueuedConnection);
5733     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5734             &myListener, &TracksListener::trackByNameInList,
5735             Qt::QueuedConnection);
5736     connect(&myPlayList, &MediaPlayList::newEntryInList,
5737             &myListener, &TracksListener::newEntryInList,
5738             Qt::QueuedConnection);
5739     connect(&myPlayList, &MediaPlayList::newUrlInList,
5740             &myListener, &TracksListener::newUrlInList,
5741             Qt::QueuedConnection);
5742     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5743             &myListener, &TracksListener::tracksAdded);
5744 
5745     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5746 
5747     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5748     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5749     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5750     QCOMPARE(rowsRemovedSpy.count(), 0);
5751     QCOMPARE(rowsMovedSpy.count(), 0);
5752     QCOMPARE(rowsInsertedSpy.count(), 0);
5753     QCOMPARE(persistentStateChangedSpy.count(), 0);
5754     QCOMPARE(dataChangedSpy.count(), 0);
5755     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5756     QCOMPARE(newEntryInListSpy.count(), 0);
5757 
5758     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
5759     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5760                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5761 
5762     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5763     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5764     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5765     QCOMPARE(rowsRemovedSpy.count(), 0);
5766     QCOMPARE(rowsMovedSpy.count(), 0);
5767     QCOMPARE(rowsInsertedSpy.count(), 1);
5768     QCOMPARE(persistentStateChangedSpy.count(), 1);
5769     QCOMPARE(dataChangedSpy.count(), 0);
5770     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5771     QCOMPARE(newEntryInListSpy.count(), 1);
5772 
5773     QCOMPARE(dataChangedSpy.wait(), true);
5774 
5775     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5776     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5777     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5778     QCOMPARE(rowsRemovedSpy.count(), 0);
5779     QCOMPARE(rowsMovedSpy.count(), 0);
5780     QCOMPARE(rowsInsertedSpy.count(), 1);
5781     QCOMPARE(persistentStateChangedSpy.count(), 1);
5782     QCOMPARE(dataChangedSpy.count(), 1);
5783     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5784     QCOMPARE(newEntryInListSpy.count(), 1);
5785 
5786     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
5787     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5788                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5789 
5790     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5791     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5792     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5793     QCOMPARE(rowsRemovedSpy.count(), 0);
5794     QCOMPARE(rowsMovedSpy.count(), 0);
5795     QCOMPARE(rowsInsertedSpy.count(), 2);
5796     QCOMPARE(persistentStateChangedSpy.count(), 2);
5797     QCOMPARE(dataChangedSpy.count(), 1);
5798     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5799     QCOMPARE(newEntryInListSpy.count(), 2);
5800 
5801     QCOMPARE(dataChangedSpy.wait(), true);
5802 
5803     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5804     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5805     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5806     QCOMPARE(rowsRemovedSpy.count(), 0);
5807     QCOMPARE(rowsMovedSpy.count(), 0);
5808     QCOMPARE(rowsInsertedSpy.count(), 2);
5809     QCOMPARE(persistentStateChangedSpy.count(), 2);
5810     QCOMPARE(dataChangedSpy.count(), 2);
5811     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5812     QCOMPARE(newEntryInListSpy.count(), 2);
5813 
5814     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
5815     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5816                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
5817 
5818     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5819     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5820     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5821     QCOMPARE(rowsRemovedSpy.count(), 0);
5822     QCOMPARE(rowsMovedSpy.count(), 0);
5823     QCOMPARE(rowsInsertedSpy.count(), 3);
5824     QCOMPARE(persistentStateChangedSpy.count(), 3);
5825     QCOMPARE(dataChangedSpy.count(), 2);
5826     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5827     QCOMPARE(newEntryInListSpy.count(), 3);
5828 
5829     QCOMPARE(dataChangedSpy.wait(), true);
5830 
5831     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5832     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5833     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
5834     QCOMPARE(rowsRemovedSpy.count(), 0);
5835     QCOMPARE(rowsMovedSpy.count(), 0);
5836     QCOMPARE(rowsInsertedSpy.count(), 3);
5837     QCOMPARE(persistentStateChangedSpy.count(), 3);
5838     QCOMPARE(dataChangedSpy.count(), 3);
5839     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5840     QCOMPARE(newEntryInListSpy.count(), 3);
5841 
5842     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
5843     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5844                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
5845 
5846     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5847     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5848     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5849     QCOMPARE(rowsRemovedSpy.count(), 0);
5850     QCOMPARE(rowsMovedSpy.count(), 0);
5851     QCOMPARE(rowsInsertedSpy.count(), 4);
5852     QCOMPARE(persistentStateChangedSpy.count(), 4);
5853     QCOMPARE(dataChangedSpy.count(), 3);
5854     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5855     QCOMPARE(newEntryInListSpy.count(), 4);
5856 
5857     QCOMPARE(dataChangedSpy.wait(), true);
5858 
5859     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5860     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5861     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5862     QCOMPARE(rowsRemovedSpy.count(), 0);
5863     QCOMPARE(rowsMovedSpy.count(), 0);
5864     QCOMPARE(rowsInsertedSpy.count(), 4);
5865     QCOMPARE(persistentStateChangedSpy.count(), 4);
5866     QCOMPARE(dataChangedSpy.count(), 4);
5867     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5868     QCOMPARE(newEntryInListSpy.count(), 4);
5869 
5870     myPlayListProxyModel.moveRow(3, 0);
5871 
5872     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5873     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
5874     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
5875     QCOMPARE(rowsRemovedSpy.count(), 0);
5876     QCOMPARE(rowsMovedSpy.count(), 1);
5877     QCOMPARE(rowsInsertedSpy.count(), 4);
5878     QCOMPARE(persistentStateChangedSpy.count(), 5);
5879     QCOMPARE(dataChangedSpy.count(), 4);
5880     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5881     QCOMPARE(newEntryInListSpy.count(), 4);
5882 }
5883 
testHasHeaderAlbumWithSameTitle()5884 void MediaPlayListProxyModelTest::testHasHeaderAlbumWithSameTitle()
5885 {
5886     MediaPlayList myPlayList;
5887     QAbstractItemModelTester testModel(&myPlayList);
5888     MediaPlayListProxyModel myPlayListProxyModel;
5889     myPlayListProxyModel.setPlayListModel(&myPlayList);
5890     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
5891     DatabaseInterface myDatabaseContent;
5892     TracksListener myListener(&myDatabaseContent);
5893 
5894     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
5895     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
5896     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
5897     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
5898     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
5899     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
5900     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
5901     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
5902     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
5903     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
5904     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
5905 
5906     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5907     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5908     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5909     QCOMPARE(rowsRemovedSpy.count(), 0);
5910     QCOMPARE(rowsMovedSpy.count(), 0);
5911     QCOMPARE(rowsInsertedSpy.count(), 0);
5912     QCOMPARE(persistentStateChangedSpy.count(), 0);
5913     QCOMPARE(dataChangedSpy.count(), 0);
5914     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5915     QCOMPARE(newEntryInListSpy.count(), 0);
5916 
5917     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
5918 
5919     connect(&myListener, &TracksListener::trackHasChanged,
5920             &myPlayList, &MediaPlayList::trackChanged,
5921             Qt::QueuedConnection);
5922     connect(&myListener, &TracksListener::tracksListAdded,
5923             &myPlayList, &MediaPlayList::tracksListAdded,
5924             Qt::QueuedConnection);
5925     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
5926             &myListener, &TracksListener::trackByNameInList,
5927             Qt::QueuedConnection);
5928     connect(&myPlayList, &MediaPlayList::newEntryInList,
5929             &myListener, &TracksListener::newEntryInList,
5930             Qt::QueuedConnection);
5931     connect(&myPlayList, &MediaPlayList::newUrlInList,
5932             &myListener, &TracksListener::newUrlInList,
5933             Qt::QueuedConnection);
5934     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
5935             &myListener, &TracksListener::tracksAdded);
5936 
5937     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
5938 
5939     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5940     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5941     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
5942     QCOMPARE(rowsRemovedSpy.count(), 0);
5943     QCOMPARE(rowsMovedSpy.count(), 0);
5944     QCOMPARE(rowsInsertedSpy.count(), 0);
5945     QCOMPARE(persistentStateChangedSpy.count(), 0);
5946     QCOMPARE(dataChangedSpy.count(), 0);
5947     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5948     QCOMPARE(newEntryInListSpy.count(), 0);
5949 
5950     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist2"),
5951                                                                                QStringLiteral("album3"), 1, 1);
5952     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5953                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
5954 
5955     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5956     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5957     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5958     QCOMPARE(rowsRemovedSpy.count(), 0);
5959     QCOMPARE(rowsMovedSpy.count(), 0);
5960     QCOMPARE(rowsInsertedSpy.count(), 1);
5961     QCOMPARE(persistentStateChangedSpy.count(), 1);
5962     QCOMPARE(dataChangedSpy.count(), 0);
5963     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5964     QCOMPARE(newEntryInListSpy.count(), 1);
5965 
5966     QCOMPARE(dataChangedSpy.wait(), true);
5967 
5968     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5969     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5970     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
5971     QCOMPARE(rowsRemovedSpy.count(), 0);
5972     QCOMPARE(rowsMovedSpy.count(), 0);
5973     QCOMPARE(rowsInsertedSpy.count(), 1);
5974     QCOMPARE(persistentStateChangedSpy.count(), 1);
5975     QCOMPARE(dataChangedSpy.count(), 1);
5976     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5977     QCOMPARE(newEntryInListSpy.count(), 1);
5978 
5979     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"),
5980                                                                                 QStringLiteral("album1"), 1, 1);
5981     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
5982                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
5983 
5984     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5985     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5986     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
5987     QCOMPARE(rowsRemovedSpy.count(), 0);
5988     QCOMPARE(rowsMovedSpy.count(), 0);
5989     QCOMPARE(rowsInsertedSpy.count(), 2);
5990     QCOMPARE(persistentStateChangedSpy.count(), 2);
5991     QCOMPARE(dataChangedSpy.count(), 1);
5992     QCOMPARE(newTrackByNameInListSpy.count(), 0);
5993     QCOMPARE(newEntryInListSpy.count(), 2);
5994 
5995     QCOMPARE(dataChangedSpy.wait(), true);
5996 
5997     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
5998     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
5999     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6000     QCOMPARE(rowsRemovedSpy.count(), 0);
6001     QCOMPARE(rowsMovedSpy.count(), 0);
6002     QCOMPARE(rowsInsertedSpy.count(), 2);
6003     QCOMPARE(persistentStateChangedSpy.count(), 2);
6004     QCOMPARE(dataChangedSpy.count(), 2);
6005     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6006     QCOMPARE(newEntryInListSpy.count(), 2);
6007 
6008     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist2"),
6009                                                                                QStringLiteral("album3"), 2, 1);
6010     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6011                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6012 
6013     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6014     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6015     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6016     QCOMPARE(rowsRemovedSpy.count(), 0);
6017     QCOMPARE(rowsMovedSpy.count(), 0);
6018     QCOMPARE(rowsInsertedSpy.count(), 3);
6019     QCOMPARE(persistentStateChangedSpy.count(), 3);
6020     QCOMPARE(dataChangedSpy.count(), 2);
6021     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6022     QCOMPARE(newEntryInListSpy.count(), 3);
6023 
6024     QCOMPARE(dataChangedSpy.wait(), true);
6025 
6026     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6027     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6028     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6029     QCOMPARE(rowsRemovedSpy.count(), 0);
6030     QCOMPARE(rowsMovedSpy.count(), 0);
6031     QCOMPARE(rowsInsertedSpy.count(), 3);
6032     QCOMPARE(persistentStateChangedSpy.count(), 3);
6033     QCOMPARE(dataChangedSpy.count(), 3);
6034     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6035     QCOMPARE(newEntryInListSpy.count(), 3);
6036 
6037     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist2"),
6038                                                                                 QStringLiteral("album3"), 3, 1);
6039     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6040                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6041 
6042     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6043     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6044     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6045     QCOMPARE(rowsRemovedSpy.count(), 0);
6046     QCOMPARE(rowsMovedSpy.count(), 0);
6047     QCOMPARE(rowsInsertedSpy.count(), 4);
6048     QCOMPARE(persistentStateChangedSpy.count(), 4);
6049     QCOMPARE(dataChangedSpy.count(), 3);
6050     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6051     QCOMPARE(newEntryInListSpy.count(), 4);
6052 
6053     QCOMPARE(dataChangedSpy.wait(), true);
6054 
6055     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6056     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6057     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6058     QCOMPARE(rowsRemovedSpy.count(), 0);
6059     QCOMPARE(rowsMovedSpy.count(), 0);
6060     QCOMPARE(rowsInsertedSpy.count(), 4);
6061     QCOMPARE(persistentStateChangedSpy.count(), 4);
6062     QCOMPARE(dataChangedSpy.count(), 4);
6063     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6064     QCOMPARE(newEntryInListSpy.count(), 4);
6065 
6066     auto fithTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track9"), QStringLiteral("artist2"),
6067                                                                               QStringLiteral("album3"), 9, 1);
6068     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6069                                     {DataTypes::DatabaseIdRole, fithTrackId}}, {}, {}}}, {}, {});
6070 
6071     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6072     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6073     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
6074     QCOMPARE(rowsRemovedSpy.count(), 0);
6075     QCOMPARE(rowsMovedSpy.count(), 0);
6076     QCOMPARE(rowsInsertedSpy.count(), 5);
6077     QCOMPARE(persistentStateChangedSpy.count(), 5);
6078     QCOMPARE(dataChangedSpy.count(), 4);
6079     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6080     QCOMPARE(newEntryInListSpy.count(), 5);
6081 
6082     QCOMPARE(dataChangedSpy.wait(), true);
6083 
6084     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6085     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6086     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 5);
6087     QCOMPARE(rowsRemovedSpy.count(), 0);
6088     QCOMPARE(rowsMovedSpy.count(), 0);
6089     QCOMPARE(rowsInsertedSpy.count(), 5);
6090     QCOMPARE(persistentStateChangedSpy.count(), 5);
6091     QCOMPARE(dataChangedSpy.count(), 5);
6092     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6093     QCOMPARE(newEntryInListSpy.count(), 5);
6094 
6095     auto sixthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist7"),
6096                                                                                QStringLiteral("album3"), 1, 1);
6097     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6098                                     {DataTypes::DatabaseIdRole, sixthTrackId}}, {}, {}}}, {}, {});
6099 
6100     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6101     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6102     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
6103     QCOMPARE(rowsRemovedSpy.count(), 0);
6104     QCOMPARE(rowsMovedSpy.count(), 0);
6105     QCOMPARE(rowsInsertedSpy.count(), 6);
6106     QCOMPARE(persistentStateChangedSpy.count(), 6);
6107     QCOMPARE(dataChangedSpy.count(), 5);
6108     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6109     QCOMPARE(newEntryInListSpy.count(), 6);
6110 
6111     QCOMPARE(dataChangedSpy.wait(), true);
6112 
6113     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6114     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6115     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6);
6116     QCOMPARE(rowsRemovedSpy.count(), 0);
6117     QCOMPARE(rowsMovedSpy.count(), 0);
6118     QCOMPARE(rowsInsertedSpy.count(), 6);
6119     QCOMPARE(persistentStateChangedSpy.count(), 6);
6120     QCOMPARE(dataChangedSpy.count(), 6);
6121     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6122     QCOMPARE(newEntryInListSpy.count(), 6);
6123 }
6124 
testHasHeaderMoveFirstLikeQml()6125 void MediaPlayListProxyModelTest::testHasHeaderMoveFirstLikeQml()
6126 {
6127     MediaPlayList myPlayList;
6128     QAbstractItemModelTester testModel(&myPlayList);
6129     MediaPlayListProxyModel myPlayListProxyModel;
6130     myPlayListProxyModel.setPlayListModel(&myPlayList);
6131     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6132     DatabaseInterface myDatabaseContent;
6133     TracksListener myListener(&myDatabaseContent);
6134 
6135     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6136     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6137     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6138     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6139     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6140     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6141     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6142     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6143     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6144     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6145     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6146 
6147     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6148     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6149     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6150     QCOMPARE(rowsRemovedSpy.count(), 0);
6151     QCOMPARE(rowsMovedSpy.count(), 0);
6152     QCOMPARE(rowsInsertedSpy.count(), 0);
6153     QCOMPARE(persistentStateChangedSpy.count(), 0);
6154     QCOMPARE(dataChangedSpy.count(), 0);
6155     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6156     QCOMPARE(newEntryInListSpy.count(), 0);
6157 
6158     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6159 
6160     connect(&myListener, &TracksListener::trackHasChanged,
6161             &myPlayList, &MediaPlayList::trackChanged,
6162             Qt::QueuedConnection);
6163     connect(&myListener, &TracksListener::tracksListAdded,
6164             &myPlayList, &MediaPlayList::tracksListAdded,
6165             Qt::QueuedConnection);
6166     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6167             &myListener, &TracksListener::trackByNameInList,
6168             Qt::QueuedConnection);
6169     connect(&myPlayList, &MediaPlayList::newEntryInList,
6170             &myListener, &TracksListener::newEntryInList,
6171             Qt::QueuedConnection);
6172     connect(&myPlayList, &MediaPlayList::newUrlInList,
6173             &myListener, &TracksListener::newUrlInList,
6174             Qt::QueuedConnection);
6175     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6176             &myListener, &TracksListener::tracksAdded);
6177 
6178     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6179 
6180     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6181     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6182     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6183     QCOMPARE(rowsRemovedSpy.count(), 0);
6184     QCOMPARE(rowsMovedSpy.count(), 0);
6185     QCOMPARE(rowsInsertedSpy.count(), 0);
6186     QCOMPARE(persistentStateChangedSpy.count(), 0);
6187     QCOMPARE(dataChangedSpy.count(), 0);
6188     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6189     QCOMPARE(newEntryInListSpy.count(), 0);
6190 
6191     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6192     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6193                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6194 
6195     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6196     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6197     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6198     QCOMPARE(rowsRemovedSpy.count(), 0);
6199     QCOMPARE(rowsMovedSpy.count(), 0);
6200     QCOMPARE(rowsInsertedSpy.count(), 1);
6201     QCOMPARE(persistentStateChangedSpy.count(), 1);
6202     QCOMPARE(dataChangedSpy.count(), 0);
6203     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6204     QCOMPARE(newEntryInListSpy.count(), 1);
6205 
6206     QCOMPARE(dataChangedSpy.wait(), true);
6207 
6208     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6209     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6210     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6211     QCOMPARE(rowsRemovedSpy.count(), 0);
6212     QCOMPARE(rowsMovedSpy.count(), 0);
6213     QCOMPARE(rowsInsertedSpy.count(), 1);
6214     QCOMPARE(persistentStateChangedSpy.count(), 1);
6215     QCOMPARE(dataChangedSpy.count(), 1);
6216     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6217     QCOMPARE(newEntryInListSpy.count(), 1);
6218 
6219     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6220     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6221                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6222 
6223     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6224     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6225     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6226     QCOMPARE(rowsRemovedSpy.count(), 0);
6227     QCOMPARE(rowsMovedSpy.count(), 0);
6228     QCOMPARE(rowsInsertedSpy.count(), 2);
6229     QCOMPARE(persistentStateChangedSpy.count(), 2);
6230     QCOMPARE(dataChangedSpy.count(), 1);
6231     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6232     QCOMPARE(newEntryInListSpy.count(), 2);
6233 
6234     QCOMPARE(dataChangedSpy.wait(), true);
6235 
6236     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6237     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6238     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6239     QCOMPARE(rowsRemovedSpy.count(), 0);
6240     QCOMPARE(rowsMovedSpy.count(), 0);
6241     QCOMPARE(rowsInsertedSpy.count(), 2);
6242     QCOMPARE(persistentStateChangedSpy.count(), 2);
6243     QCOMPARE(dataChangedSpy.count(), 2);
6244     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6245     QCOMPARE(newEntryInListSpy.count(), 2);
6246 
6247     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
6248     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6249                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6250 
6251     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6252     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6253     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6254     QCOMPARE(rowsRemovedSpy.count(), 0);
6255     QCOMPARE(rowsMovedSpy.count(), 0);
6256     QCOMPARE(rowsInsertedSpy.count(), 3);
6257     QCOMPARE(persistentStateChangedSpy.count(), 3);
6258     QCOMPARE(dataChangedSpy.count(), 2);
6259     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6260     QCOMPARE(newEntryInListSpy.count(), 3);
6261 
6262     QCOMPARE(dataChangedSpy.wait(), true);
6263 
6264     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6265     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6266     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6267     QCOMPARE(rowsRemovedSpy.count(), 0);
6268     QCOMPARE(rowsMovedSpy.count(), 0);
6269     QCOMPARE(rowsInsertedSpy.count(), 3);
6270     QCOMPARE(persistentStateChangedSpy.count(), 3);
6271     QCOMPARE(dataChangedSpy.count(), 3);
6272     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6273     QCOMPARE(newEntryInListSpy.count(), 3);
6274 
6275     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6276     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6277                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6278 
6279     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6280     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6281     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6282     QCOMPARE(rowsRemovedSpy.count(), 0);
6283     QCOMPARE(rowsMovedSpy.count(), 0);
6284     QCOMPARE(rowsInsertedSpy.count(), 4);
6285     QCOMPARE(persistentStateChangedSpy.count(), 4);
6286     QCOMPARE(dataChangedSpy.count(), 3);
6287     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6288     QCOMPARE(newEntryInListSpy.count(), 4);
6289 
6290     QCOMPARE(dataChangedSpy.wait(), true);
6291 
6292     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6293     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6294     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6295     QCOMPARE(rowsRemovedSpy.count(), 0);
6296     QCOMPARE(rowsMovedSpy.count(), 0);
6297     QCOMPARE(rowsInsertedSpy.count(), 4);
6298     QCOMPARE(persistentStateChangedSpy.count(), 4);
6299     QCOMPARE(dataChangedSpy.count(), 4);
6300     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6301     QCOMPARE(newEntryInListSpy.count(), 4);
6302 
6303     myPlayListProxyModel.moveRow(0, 3);
6304 
6305     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6306     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6307     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6308     QCOMPARE(rowsRemovedSpy.count(), 0);
6309     QCOMPARE(rowsMovedSpy.count(), 1);
6310     QCOMPARE(rowsInsertedSpy.count(), 4);
6311     QCOMPARE(persistentStateChangedSpy.count(), 5);
6312     QCOMPARE(dataChangedSpy.count(), 4);
6313     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6314     QCOMPARE(newEntryInListSpy.count(), 4);
6315 }
6316 
testHasHeaderMoveAnotherLikeQml()6317 void MediaPlayListProxyModelTest::testHasHeaderMoveAnotherLikeQml()
6318 {
6319     MediaPlayList myPlayList;
6320     QAbstractItemModelTester testModel(&myPlayList);
6321     MediaPlayListProxyModel myPlayListProxyModel;
6322     myPlayListProxyModel.setPlayListModel(&myPlayList);
6323     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6324     DatabaseInterface myDatabaseContent;
6325     TracksListener myListener(&myDatabaseContent);
6326 
6327     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6328     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6329     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6330     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6331     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6332     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6333     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6334     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6335     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6336     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6337     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6338 
6339     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6340     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6341     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6342     QCOMPARE(rowsRemovedSpy.count(), 0);
6343     QCOMPARE(rowsMovedSpy.count(), 0);
6344     QCOMPARE(rowsInsertedSpy.count(), 0);
6345     QCOMPARE(persistentStateChangedSpy.count(), 0);
6346     QCOMPARE(dataChangedSpy.count(), 0);
6347     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6348     QCOMPARE(newEntryInListSpy.count(), 0);
6349 
6350     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6351 
6352     connect(&myListener, &TracksListener::trackHasChanged,
6353             &myPlayList, &MediaPlayList::trackChanged,
6354             Qt::QueuedConnection);
6355     connect(&myListener, &TracksListener::tracksListAdded,
6356             &myPlayList, &MediaPlayList::tracksListAdded,
6357             Qt::QueuedConnection);
6358     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6359             &myListener, &TracksListener::trackByNameInList,
6360             Qt::QueuedConnection);
6361     connect(&myPlayList, &MediaPlayList::newEntryInList,
6362             &myListener, &TracksListener::newEntryInList,
6363             Qt::QueuedConnection);
6364     connect(&myPlayList, &MediaPlayList::newUrlInList,
6365             &myListener, &TracksListener::newUrlInList,
6366             Qt::QueuedConnection);
6367     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6368             &myListener, &TracksListener::tracksAdded);
6369 
6370     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6371 
6372     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6373     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6374     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6375     QCOMPARE(rowsRemovedSpy.count(), 0);
6376     QCOMPARE(rowsMovedSpy.count(), 0);
6377     QCOMPARE(rowsInsertedSpy.count(), 0);
6378     QCOMPARE(persistentStateChangedSpy.count(), 0);
6379     QCOMPARE(dataChangedSpy.count(), 0);
6380     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6381     QCOMPARE(newEntryInListSpy.count(), 0);
6382 
6383     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6384     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6385                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6386 
6387     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6388     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6389     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6390     QCOMPARE(rowsRemovedSpy.count(), 0);
6391     QCOMPARE(rowsMovedSpy.count(), 0);
6392     QCOMPARE(rowsInsertedSpy.count(), 1);
6393     QCOMPARE(persistentStateChangedSpy.count(), 1);
6394     QCOMPARE(dataChangedSpy.count(), 0);
6395     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6396     QCOMPARE(newEntryInListSpy.count(), 1);
6397 
6398     QCOMPARE(dataChangedSpy.wait(), true);
6399 
6400     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6401     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6402     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6403     QCOMPARE(rowsRemovedSpy.count(), 0);
6404     QCOMPARE(rowsMovedSpy.count(), 0);
6405     QCOMPARE(rowsInsertedSpy.count(), 1);
6406     QCOMPARE(persistentStateChangedSpy.count(), 1);
6407     QCOMPARE(dataChangedSpy.count(), 1);
6408     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6409     QCOMPARE(newEntryInListSpy.count(), 1);
6410 
6411     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6412     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6413                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6414 
6415     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6416     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6417     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6418     QCOMPARE(rowsRemovedSpy.count(), 0);
6419     QCOMPARE(rowsMovedSpy.count(), 0);
6420     QCOMPARE(rowsInsertedSpy.count(), 2);
6421     QCOMPARE(persistentStateChangedSpy.count(), 2);
6422     QCOMPARE(dataChangedSpy.count(), 1);
6423     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6424     QCOMPARE(newEntryInListSpy.count(), 2);
6425 
6426     QCOMPARE(dataChangedSpy.wait(), true);
6427 
6428     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6429     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6430     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6431     QCOMPARE(rowsRemovedSpy.count(), 0);
6432     QCOMPARE(rowsMovedSpy.count(), 0);
6433     QCOMPARE(rowsInsertedSpy.count(), 2);
6434     QCOMPARE(persistentStateChangedSpy.count(), 2);
6435     QCOMPARE(dataChangedSpy.count(), 2);
6436     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6437     QCOMPARE(newEntryInListSpy.count(), 2);
6438 
6439     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
6440     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6441                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6442 
6443     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6444     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6445     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6446     QCOMPARE(rowsRemovedSpy.count(), 0);
6447     QCOMPARE(rowsMovedSpy.count(), 0);
6448     QCOMPARE(rowsInsertedSpy.count(), 3);
6449     QCOMPARE(persistentStateChangedSpy.count(), 3);
6450     QCOMPARE(dataChangedSpy.count(), 2);
6451     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6452     QCOMPARE(newEntryInListSpy.count(), 3);
6453 
6454     QCOMPARE(dataChangedSpy.wait(), true);
6455 
6456     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6457     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6458     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6459     QCOMPARE(rowsRemovedSpy.count(), 0);
6460     QCOMPARE(rowsMovedSpy.count(), 0);
6461     QCOMPARE(rowsInsertedSpy.count(), 3);
6462     QCOMPARE(persistentStateChangedSpy.count(), 3);
6463     QCOMPARE(dataChangedSpy.count(), 3);
6464     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6465     QCOMPARE(newEntryInListSpy.count(), 3);
6466 
6467     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6468     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6469                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6470 
6471     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6472     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6473     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6474     QCOMPARE(rowsRemovedSpy.count(), 0);
6475     QCOMPARE(rowsMovedSpy.count(), 0);
6476     QCOMPARE(rowsInsertedSpy.count(), 4);
6477     QCOMPARE(persistentStateChangedSpy.count(), 4);
6478     QCOMPARE(dataChangedSpy.count(), 3);
6479     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6480     QCOMPARE(newEntryInListSpy.count(), 4);
6481 
6482     QCOMPARE(dataChangedSpy.wait(), true);
6483 
6484     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6485     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6486     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6487     QCOMPARE(rowsRemovedSpy.count(), 0);
6488     QCOMPARE(rowsMovedSpy.count(), 0);
6489     QCOMPARE(rowsInsertedSpy.count(), 4);
6490     QCOMPARE(persistentStateChangedSpy.count(), 4);
6491     QCOMPARE(dataChangedSpy.count(), 4);
6492     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6493     QCOMPARE(newEntryInListSpy.count(), 4);
6494 
6495     myPlayListProxyModel.moveRow(3, 0);
6496 
6497     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6498     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6499     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6500     QCOMPARE(rowsRemovedSpy.count(), 0);
6501     QCOMPARE(rowsMovedSpy.count(), 1);
6502     QCOMPARE(rowsInsertedSpy.count(), 4);
6503     QCOMPARE(persistentStateChangedSpy.count(), 5);
6504     QCOMPARE(dataChangedSpy.count(), 4);
6505     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6506     QCOMPARE(newEntryInListSpy.count(), 4);
6507 }
6508 
testHasHeaderYetAnotherMoveLikeQml()6509 void MediaPlayListProxyModelTest::testHasHeaderYetAnotherMoveLikeQml()
6510 {
6511     MediaPlayList myPlayList;
6512     QAbstractItemModelTester testModel(&myPlayList);
6513     MediaPlayListProxyModel myPlayListProxyModel;
6514     myPlayListProxyModel.setPlayListModel(&myPlayList);
6515     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6516     DatabaseInterface myDatabaseContent;
6517     TracksListener myListener(&myDatabaseContent);
6518 
6519     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6520     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6521     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6522     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6523     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6524     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6525     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6526     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayList::dataChanged);
6527     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6528     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6529     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6530 
6531     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6532     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6533     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6534     QCOMPARE(rowsRemovedSpy.count(), 0);
6535     QCOMPARE(rowsMovedSpy.count(), 0);
6536     QCOMPARE(rowsInsertedSpy.count(), 0);
6537     QCOMPARE(persistentStateChangedSpy.count(), 0);
6538     QCOMPARE(dataChangedSpy.count(), 0);
6539     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6540     QCOMPARE(newEntryInListSpy.count(), 0);
6541 
6542     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6543 
6544     connect(&myListener, &TracksListener::trackHasChanged,
6545             &myPlayList, &MediaPlayList::trackChanged,
6546             Qt::QueuedConnection);
6547     connect(&myListener, &TracksListener::tracksListAdded,
6548             &myPlayList, &MediaPlayList::tracksListAdded,
6549             Qt::QueuedConnection);
6550     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6551             &myListener, &TracksListener::trackByNameInList,
6552             Qt::QueuedConnection);
6553     connect(&myPlayList, &MediaPlayList::newEntryInList,
6554             &myListener, &TracksListener::newEntryInList,
6555             Qt::QueuedConnection);
6556     connect(&myPlayList, &MediaPlayList::newUrlInList,
6557             &myListener, &TracksListener::newUrlInList,
6558             Qt::QueuedConnection);
6559     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6560             &myListener, &TracksListener::tracksAdded);
6561 
6562     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6563 
6564     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6565     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6566     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6567     QCOMPARE(rowsRemovedSpy.count(), 0);
6568     QCOMPARE(rowsMovedSpy.count(), 0);
6569     QCOMPARE(rowsInsertedSpy.count(), 0);
6570     QCOMPARE(persistentStateChangedSpy.count(), 0);
6571     QCOMPARE(dataChangedSpy.count(), 0);
6572     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6573     QCOMPARE(newEntryInListSpy.count(), 0);
6574 
6575     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
6576     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6577                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
6578 
6579     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6580     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6581     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6582     QCOMPARE(rowsRemovedSpy.count(), 0);
6583     QCOMPARE(rowsMovedSpy.count(), 0);
6584     QCOMPARE(rowsInsertedSpy.count(), 1);
6585     QCOMPARE(persistentStateChangedSpy.count(), 1);
6586     QCOMPARE(dataChangedSpy.count(), 0);
6587     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6588     QCOMPARE(newEntryInListSpy.count(), 1);
6589 
6590     QCOMPARE(dataChangedSpy.wait(), true);
6591 
6592     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6593     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6594     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6595     QCOMPARE(rowsRemovedSpy.count(), 0);
6596     QCOMPARE(rowsMovedSpy.count(), 0);
6597     QCOMPARE(rowsInsertedSpy.count(), 1);
6598     QCOMPARE(persistentStateChangedSpy.count(), 1);
6599     QCOMPARE(dataChangedSpy.count(), 1);
6600     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6601     QCOMPARE(newEntryInListSpy.count(), 1);
6602 
6603     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
6604     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6605                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
6606 
6607     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6608     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6609     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6610     QCOMPARE(rowsRemovedSpy.count(), 0);
6611     QCOMPARE(rowsMovedSpy.count(), 0);
6612     QCOMPARE(rowsInsertedSpy.count(), 2);
6613     QCOMPARE(persistentStateChangedSpy.count(), 2);
6614     QCOMPARE(dataChangedSpy.count(), 1);
6615     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6616     QCOMPARE(newEntryInListSpy.count(), 2);
6617 
6618     QCOMPARE(dataChangedSpy.wait(), true);
6619 
6620     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6621     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6622     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
6623     QCOMPARE(rowsRemovedSpy.count(), 0);
6624     QCOMPARE(rowsMovedSpy.count(), 0);
6625     QCOMPARE(rowsInsertedSpy.count(), 2);
6626     QCOMPARE(persistentStateChangedSpy.count(), 2);
6627     QCOMPARE(dataChangedSpy.count(), 2);
6628     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6629     QCOMPARE(newEntryInListSpy.count(), 2);
6630 
6631     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album1"), 1, 1);
6632     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6633                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
6634 
6635     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6636     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6637     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6638     QCOMPARE(rowsRemovedSpy.count(), 0);
6639     QCOMPARE(rowsMovedSpy.count(), 0);
6640     QCOMPARE(rowsInsertedSpy.count(), 3);
6641     QCOMPARE(persistentStateChangedSpy.count(), 3);
6642     QCOMPARE(dataChangedSpy.count(), 2);
6643     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6644     QCOMPARE(newEntryInListSpy.count(), 3);
6645 
6646     QCOMPARE(dataChangedSpy.wait(), true);
6647 
6648     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6649     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6650     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
6651     QCOMPARE(rowsRemovedSpy.count(), 0);
6652     QCOMPARE(rowsMovedSpy.count(), 0);
6653     QCOMPARE(rowsInsertedSpy.count(), 3);
6654     QCOMPARE(persistentStateChangedSpy.count(), 3);
6655     QCOMPARE(dataChangedSpy.count(), 3);
6656     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6657     QCOMPARE(newEntryInListSpy.count(), 3);
6658 
6659     auto fourthTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track4"), QStringLiteral("artist1"), QStringLiteral("album2"), 4, 1);
6660     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6661                                     {DataTypes::DatabaseIdRole, fourthTrackId}}, {}, {}}}, {}, {});
6662 
6663     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6664     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6665     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6666     QCOMPARE(rowsRemovedSpy.count(), 0);
6667     QCOMPARE(rowsMovedSpy.count(), 0);
6668     QCOMPARE(rowsInsertedSpy.count(), 4);
6669     QCOMPARE(persistentStateChangedSpy.count(), 4);
6670     QCOMPARE(dataChangedSpy.count(), 3);
6671     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6672     QCOMPARE(newEntryInListSpy.count(), 4);
6673 
6674     QCOMPARE(dataChangedSpy.wait(), true);
6675 
6676     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6677     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6678     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6679     QCOMPARE(rowsRemovedSpy.count(), 0);
6680     QCOMPARE(rowsMovedSpy.count(), 0);
6681     QCOMPARE(rowsInsertedSpy.count(), 4);
6682     QCOMPARE(persistentStateChangedSpy.count(), 4);
6683     QCOMPARE(dataChangedSpy.count(), 4);
6684     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6685     QCOMPARE(newEntryInListSpy.count(), 4);
6686 
6687     myPlayListProxyModel.moveRow(0, 2);
6688 
6689     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6690     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
6691     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6692     QCOMPARE(rowsRemovedSpy.count(), 0);
6693     QCOMPARE(rowsMovedSpy.count(), 1);
6694     QCOMPARE(rowsInsertedSpy.count(), 4);
6695     QCOMPARE(persistentStateChangedSpy.count(), 5);
6696     QCOMPARE(dataChangedSpy.count(), 4);
6697     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6698     QCOMPARE(newEntryInListSpy.count(), 4);
6699 
6700     myPlayListProxyModel.moveRow(2, 0);
6701 
6702     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6703     QCOMPARE(rowsAboutToBeMovedSpy.count(), 2);
6704     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 4);
6705     QCOMPARE(rowsRemovedSpy.count(), 0);
6706     QCOMPARE(rowsMovedSpy.count(), 2);
6707     QCOMPARE(rowsInsertedSpy.count(), 4);
6708     QCOMPARE(persistentStateChangedSpy.count(), 6);
6709     QCOMPARE(dataChangedSpy.count(), 4);
6710     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6711     QCOMPARE(newEntryInListSpy.count(), 4);
6712 }
6713 
enqueueFiles()6714 void MediaPlayListProxyModelTest::enqueueFiles()
6715 {
6716     MediaPlayList myPlayList;
6717     QAbstractItemModelTester testModel(&myPlayList);
6718     MediaPlayListProxyModel myPlayListProxyModel;
6719     myPlayListProxyModel.setPlayListModel(&myPlayList);
6720     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6721     DatabaseInterface myDatabaseContent;
6722     TracksListener myListener(&myDatabaseContent);
6723 
6724     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6725     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6726     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6727     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6728     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6729     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6730     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6731     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
6732     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6733     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6734     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6735 
6736     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6737     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6738     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6739     QCOMPARE(rowsRemovedSpy.count(), 0);
6740     QCOMPARE(rowsMovedSpy.count(), 0);
6741     QCOMPARE(rowsInsertedSpy.count(), 0);
6742     QCOMPARE(persistentStateChangedSpy.count(), 0);
6743     QCOMPARE(dataChangedSpy.count(), 0);
6744     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6745     QCOMPARE(newEntryInListSpy.count(), 0);
6746     QCOMPARE(newUrlInListSpy.count(), 0);
6747 
6748     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6749 
6750     connect(&myListener, &TracksListener::trackHasChanged,
6751             &myPlayList, &MediaPlayList::trackChanged,
6752             Qt::QueuedConnection);
6753     connect(&myListener, &TracksListener::tracksListAdded,
6754             &myPlayList, &MediaPlayList::tracksListAdded,
6755             Qt::QueuedConnection);
6756     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6757             &myListener, &TracksListener::trackByNameInList,
6758             Qt::QueuedConnection);
6759     connect(&myPlayList, &MediaPlayList::newEntryInList,
6760             &myListener, &TracksListener::newEntryInList,
6761             Qt::QueuedConnection);
6762     connect(&myPlayList, &MediaPlayList::newUrlInList,
6763             &myListener, &TracksListener::newUrlInList,
6764             Qt::QueuedConnection);
6765     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6766             &myListener, &TracksListener::tracksAdded);
6767 
6768     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6769 
6770     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6771     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6772     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6773     QCOMPARE(rowsRemovedSpy.count(), 0);
6774     QCOMPARE(rowsMovedSpy.count(), 0);
6775     QCOMPARE(rowsInsertedSpy.count(), 0);
6776     QCOMPARE(persistentStateChangedSpy.count(), 0);
6777     QCOMPARE(dataChangedSpy.count(), 0);
6778     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6779     QCOMPARE(newEntryInListSpy.count(), 0);
6780     QCOMPARE(newUrlInListSpy.count(), 0);
6781 
6782     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6783                                     {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral("/$1"))}}, {}, {}},
6784                                   {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6785                                     {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral("/$2"))}}, {}, {}}}, {}, {});
6786 
6787     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6788     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6789     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6790     QCOMPARE(rowsRemovedSpy.count(), 0);
6791     QCOMPARE(rowsMovedSpy.count(), 0);
6792     QCOMPARE(rowsInsertedSpy.count(), 1);
6793     QCOMPARE(persistentStateChangedSpy.count(), 1);
6794     QCOMPARE(dataChangedSpy.count(), 0);
6795     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6796     QCOMPARE(newEntryInListSpy.count(), 0);
6797     QCOMPARE(newUrlInListSpy.count(), 2);
6798 
6799     QCOMPARE(myPlayListProxyModel.rowCount(), 2);
6800 
6801     QCOMPARE(dataChangedSpy.wait(300), true);
6802 
6803     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6804     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6805     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6806     QCOMPARE(rowsRemovedSpy.count(), 0);
6807     QCOMPARE(rowsMovedSpy.count(), 0);
6808     QCOMPARE(rowsInsertedSpy.count(), 1);
6809     QCOMPARE(persistentStateChangedSpy.count(), 1);
6810     QCOMPARE(dataChangedSpy.count(), 2);
6811     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6812     QCOMPARE(newEntryInListSpy.count(), 0);
6813     QCOMPARE(newUrlInListSpy.count(), 2);
6814 
6815     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1"));
6816     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
6817     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1"));
6818     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
6819     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
6820     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1);
6821     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2"));
6822     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album1"));
6823     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
6824     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2);
6825     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 2);
6826     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 2);
6827 }
6828 
enqueueSampleFiles()6829 void MediaPlayListProxyModelTest::enqueueSampleFiles()
6830 {
6831     MediaPlayList myPlayList;
6832     QAbstractItemModelTester testModel(&myPlayList);
6833     MediaPlayListProxyModel myPlayListProxyModel;
6834     myPlayListProxyModel.setPlayListModel(&myPlayList);
6835     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6836     DatabaseInterface myDatabaseContent;
6837     TracksListener myListener(&myDatabaseContent);
6838 
6839     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6840     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6841     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6842     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6843     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6844     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6845     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6846     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
6847     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6848     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6849     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6850 
6851     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6852     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6853     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6854     QCOMPARE(rowsRemovedSpy.count(), 0);
6855     QCOMPARE(rowsMovedSpy.count(), 0);
6856     QCOMPARE(rowsInsertedSpy.count(), 0);
6857     QCOMPARE(persistentStateChangedSpy.count(), 0);
6858     QCOMPARE(dataChangedSpy.count(), 0);
6859     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6860     QCOMPARE(newEntryInListSpy.count(), 0);
6861     QCOMPARE(newUrlInListSpy.count(), 0);
6862 
6863     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6864 
6865     connect(&myListener, &TracksListener::trackHasChanged,
6866             &myPlayList, &MediaPlayList::trackChanged,
6867             Qt::QueuedConnection);
6868     connect(&myListener, &TracksListener::tracksListAdded,
6869             &myPlayList, &MediaPlayList::tracksListAdded,
6870             Qt::QueuedConnection);
6871     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
6872             &myListener, &TracksListener::trackByNameInList,
6873             Qt::QueuedConnection);
6874     connect(&myPlayList, &MediaPlayList::newEntryInList,
6875             &myListener, &TracksListener::newEntryInList,
6876             Qt::QueuedConnection);
6877     connect(&myPlayList, &MediaPlayList::newUrlInList,
6878             &myListener, &TracksListener::newUrlInList,
6879             Qt::QueuedConnection);
6880     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
6881             &myListener, &TracksListener::tracksAdded);
6882 
6883     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
6884 
6885     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6886     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6887     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6888     QCOMPARE(rowsRemovedSpy.count(), 0);
6889     QCOMPARE(rowsMovedSpy.count(), 0);
6890     QCOMPARE(rowsInsertedSpy.count(), 0);
6891     QCOMPARE(persistentStateChangedSpy.count(), 0);
6892     QCOMPARE(dataChangedSpy.count(), 0);
6893     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6894     QCOMPARE(newEntryInListSpy.count(), 0);
6895     QCOMPARE(newUrlInListSpy.count(), 0);
6896 
6897     myPlayListProxyModel.enqueue({
6898                                      {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6899                                        {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test.ogg"))}}, {}, {}},
6900                                      {{{DataTypes::ElementTypeRole, ElisaUtils::Track},
6901                                        {DataTypes::ResourceRole, QUrl::fromLocalFile(QStringLiteral(MEDIAPLAYLIST_TESTS_SAMPLE_FILES_PATH) + QStringLiteral("/test2.ogg"))}}, {}, {}}},
6902                                  {}, {});
6903 
6904     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6905     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6906     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6907     QCOMPARE(rowsRemovedSpy.count(), 0);
6908     QCOMPARE(rowsMovedSpy.count(), 0);
6909     QCOMPARE(rowsInsertedSpy.count(), 1);
6910     QCOMPARE(persistentStateChangedSpy.count(), 1);
6911     QCOMPARE(dataChangedSpy.count(), 0);
6912     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6913     QCOMPARE(newEntryInListSpy.count(), 0);
6914     QCOMPARE(newUrlInListSpy.count(), 2);
6915 
6916     QCOMPARE(myPlayListProxyModel.rowCount(), 2);
6917 
6918     while (dataChangedSpy.count() < 2) {
6919         QCOMPARE(dataChangedSpy.wait(), true);
6920     }
6921 
6922     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6923     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6924     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
6925     QCOMPARE(rowsRemovedSpy.count(), 0);
6926     QCOMPARE(rowsMovedSpy.count(), 0);
6927     QCOMPARE(rowsInsertedSpy.count(), 1);
6928     QCOMPARE(persistentStateChangedSpy.count(), 1);
6929     QCOMPARE(dataChangedSpy.count(), 2);
6930     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6931     QCOMPARE(newEntryInListSpy.count(), 0);
6932     QCOMPARE(newUrlInListSpy.count(), 2);
6933 
6934 #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND
6935     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title"));
6936     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test"));
6937     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist"));
6938     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
6939     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
6940     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
6941     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("Title2"));
6942     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("Test2"));
6943     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("Artist2"));
6944     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 1);
6945     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1);
6946     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 1000);
6947 #else
6948     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test.ogg"));
6949     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
6950     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
6951     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
6952     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
6953     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(0, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
6954     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("test2.ogg"));
6955     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral(""));
6956     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral(""));
6957     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), -1);
6958     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), -1);
6959     QCOMPARE(myPlayListProxyModel.data(myPlayListProxyModel.index(1, 0), MediaPlayList::DurationRole).toTime().msecsSinceStartOfDay(), 0);
6960 #endif
6961 }
6962 
enqueueEmpty()6963 void MediaPlayListProxyModelTest::enqueueEmpty()
6964 {
6965     MediaPlayList myPlayList;
6966     QAbstractItemModelTester testModel(&myPlayList);
6967     MediaPlayListProxyModel myPlayListProxyModel;
6968     myPlayListProxyModel.setPlayListModel(&myPlayList);
6969     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
6970     DatabaseInterface myDatabaseContent;
6971     TracksListener myListener(&myDatabaseContent);
6972 
6973     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
6974     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
6975     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
6976     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
6977     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
6978     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
6979     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
6980     QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayListProxyModel::dataChanged);
6981     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
6982     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
6983     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
6984 
6985     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
6986     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
6987     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
6988     QCOMPARE(rowsRemovedSpy.count(), 0);
6989     QCOMPARE(rowsMovedSpy.count(), 0);
6990     QCOMPARE(rowsInsertedSpy.count(), 0);
6991     QCOMPARE(persistentStateChangedSpy.count(), 0);
6992     QCOMPARE(dataChangedSpy.count(), 0);
6993     QCOMPARE(newTrackByNameInListSpy.count(), 0);
6994     QCOMPARE(newEntryInListSpy.count(), 0);
6995 
6996     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
6997 
6998     connect(&myListener, &TracksListener::trackHasChanged,
6999             &myPlayList, &MediaPlayList::trackChanged,
7000             Qt::QueuedConnection);
7001     connect(&myListener, &TracksListener::tracksListAdded,
7002             &myPlayList, &MediaPlayList::tracksListAdded,
7003             Qt::QueuedConnection);
7004     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
7005             &myListener, &TracksListener::trackByNameInList,
7006             Qt::QueuedConnection);
7007     connect(&myPlayList, &MediaPlayList::newEntryInList,
7008             &myListener, &TracksListener::newEntryInList,
7009             Qt::QueuedConnection);
7010     connect(&myPlayList, &MediaPlayList::newUrlInList,
7011             &myListener, &TracksListener::newUrlInList,
7012             Qt::QueuedConnection);
7013     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
7014             &myListener, &TracksListener::tracksAdded);
7015 
7016     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
7017 
7018     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7019     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7020     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7021     QCOMPARE(rowsRemovedSpy.count(), 0);
7022     QCOMPARE(rowsMovedSpy.count(), 0);
7023     QCOMPARE(rowsInsertedSpy.count(), 0);
7024     QCOMPARE(persistentStateChangedSpy.count(), 0);
7025     QCOMPARE(dataChangedSpy.count(), 0);
7026     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7027     QCOMPARE(newEntryInListSpy.count(), 0);
7028 
7029     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {});
7030 
7031     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7032     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7033     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7034     QCOMPARE(rowsRemovedSpy.count(), 0);
7035     QCOMPARE(rowsMovedSpy.count(), 0);
7036     QCOMPARE(rowsInsertedSpy.count(), 0);
7037     QCOMPARE(persistentStateChangedSpy.count(), 0);
7038     QCOMPARE(dataChangedSpy.count(), 0);
7039     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7040     QCOMPARE(newEntryInListSpy.count(), 0);
7041 
7042     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, {}, {});
7043 
7044     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7045     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7046     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7047     QCOMPARE(rowsRemovedSpy.count(), 0);
7048     QCOMPARE(rowsMovedSpy.count(), 0);
7049     QCOMPARE(rowsInsertedSpy.count(), 0);
7050     QCOMPARE(persistentStateChangedSpy.count(), 0);
7051     QCOMPARE(dataChangedSpy.count(), 0);
7052     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7053     QCOMPARE(newEntryInListSpy.count(), 0);
7054 
7055     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay);
7056 
7057     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7058     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7059     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7060     QCOMPARE(rowsRemovedSpy.count(), 0);
7061     QCOMPARE(rowsMovedSpy.count(), 0);
7062     QCOMPARE(rowsInsertedSpy.count(), 0);
7063     QCOMPARE(persistentStateChangedSpy.count(), 0);
7064     QCOMPARE(dataChangedSpy.count(), 0);
7065     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7066     QCOMPARE(newEntryInListSpy.count(), 0);
7067 
7068     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{}, ElisaUtils::AppendPlayList, ElisaUtils::DoNotTriggerPlay);
7069 
7070     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7071     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7072     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7073     QCOMPARE(rowsRemovedSpy.count(), 0);
7074     QCOMPARE(rowsMovedSpy.count(), 0);
7075     QCOMPARE(rowsInsertedSpy.count(), 0);
7076     QCOMPARE(persistentStateChangedSpy.count(), 0);
7077     QCOMPARE(dataChangedSpy.count(), 0);
7078     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7079     QCOMPARE(newEntryInListSpy.count(), 0);
7080 
7081     myPlayListProxyModel.enqueue(DataTypes::EntryDataList{},
7082                                  ElisaUtils::AppendPlayList,
7083                                  ElisaUtils::DoNotTriggerPlay);
7084 
7085     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7086     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7087     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7088     QCOMPARE(rowsRemovedSpy.count(), 0);
7089     QCOMPARE(rowsMovedSpy.count(), 0);
7090     QCOMPARE(rowsInsertedSpy.count(), 0);
7091     QCOMPARE(persistentStateChangedSpy.count(), 0);
7092     QCOMPARE(dataChangedSpy.count(), 0);
7093     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7094     QCOMPARE(newEntryInListSpy.count(), 0);
7095 }
7096 
testMoveAndShuffle()7097 void MediaPlayListProxyModelTest::testMoveAndShuffle()
7098 {
7099     MediaPlayList myPlayList;
7100     QAbstractItemModelTester testModel(&myPlayList);
7101     MediaPlayListProxyModel myPlayListProxyModel;
7102     myPlayListProxyModel.setPlayListModel(&myPlayList);
7103     QAbstractItemModelTester testProxyModel(&myPlayListProxyModel);
7104     DatabaseInterface myDatabaseContent;
7105     TracksListener myListener(&myDatabaseContent);
7106 
7107     QSignalSpy rowsAboutToBeMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeMoved);
7108     QSignalSpy rowsAboutToBeRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeRemoved);
7109     QSignalSpy rowsAboutToBeInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsAboutToBeInserted);
7110     QSignalSpy rowsMovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsMoved);
7111     QSignalSpy rowsRemovedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsRemoved);
7112     QSignalSpy rowsInsertedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::rowsInserted);
7113     QSignalSpy persistentStateChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::persistentStateChanged);
7114     QSignalSpy dataChangedSpy(&myPlayListProxyModel, &MediaPlayListProxyModel::dataChanged);
7115     QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList);
7116     QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
7117     QSignalSpy newUrlInListSpy(&myPlayList, &MediaPlayList::newUrlInList);
7118 
7119     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7120     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7121     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7122     QCOMPARE(rowsRemovedSpy.count(), 0);
7123     QCOMPARE(rowsMovedSpy.count(), 0);
7124     QCOMPARE(rowsInsertedSpy.count(), 0);
7125     QCOMPARE(persistentStateChangedSpy.count(), 0);
7126     QCOMPARE(dataChangedSpy.count(), 0);
7127     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7128     QCOMPARE(newEntryInListSpy.count(), 0);
7129 
7130     myDatabaseContent.init(QStringLiteral("testDbDirectContent"));
7131 
7132     connect(&myListener, &TracksListener::trackHasChanged,
7133             &myPlayList, &MediaPlayList::trackChanged,
7134             Qt::QueuedConnection);
7135     connect(&myListener, &TracksListener::tracksListAdded,
7136             &myPlayList, &MediaPlayList::tracksListAdded,
7137             Qt::QueuedConnection);
7138     connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
7139             &myListener, &TracksListener::trackByNameInList,
7140             Qt::QueuedConnection);
7141     connect(&myPlayList, &MediaPlayList::newEntryInList,
7142             &myListener, &TracksListener::newEntryInList,
7143             Qt::QueuedConnection);
7144     connect(&myPlayList, &MediaPlayList::newUrlInList,
7145             &myListener, &TracksListener::newUrlInList,
7146             Qt::QueuedConnection);
7147     connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
7148             &myListener, &TracksListener::tracksAdded);
7149 
7150     myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
7151 
7152     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7153     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7154     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
7155     QCOMPARE(rowsRemovedSpy.count(), 0);
7156     QCOMPARE(rowsMovedSpy.count(), 0);
7157     QCOMPARE(rowsInsertedSpy.count(), 0);
7158     QCOMPARE(persistentStateChangedSpy.count(), 0);
7159     QCOMPARE(dataChangedSpy.count(), 0);
7160     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7161     QCOMPARE(newEntryInListSpy.count(), 0);
7162 
7163     auto firstTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track1"), QStringLiteral("artist1"), QStringLiteral("album2"), 1, 1);
7164     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7165                                     {DataTypes::DatabaseIdRole, firstTrackId}}, {}, {}}}, {}, {});
7166 
7167     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7168     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7169     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
7170     QCOMPARE(rowsRemovedSpy.count(), 0);
7171     QCOMPARE(rowsMovedSpy.count(), 0);
7172     QCOMPARE(rowsInsertedSpy.count(), 1);
7173     QCOMPARE(persistentStateChangedSpy.count(), 1);
7174     QCOMPARE(dataChangedSpy.count(), 0);
7175     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7176     QCOMPARE(newEntryInListSpy.count(), 1);
7177 
7178     QCOMPARE(dataChangedSpy.wait(), true);
7179 
7180     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7181     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7182     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
7183     QCOMPARE(rowsRemovedSpy.count(), 0);
7184     QCOMPARE(rowsMovedSpy.count(), 0);
7185     QCOMPARE(rowsInsertedSpy.count(), 1);
7186     QCOMPARE(persistentStateChangedSpy.count(), 1);
7187     QCOMPARE(dataChangedSpy.count(), 1);
7188     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7189     QCOMPARE(newEntryInListSpy.count(), 1);
7190 
7191     auto secondTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track2"), QStringLiteral("artist1"), QStringLiteral("album2"), 2, 1);
7192     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7193                                     {DataTypes::DatabaseIdRole, secondTrackId}}, {}, {}}}, {}, {});
7194 
7195     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7196     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7197     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
7198     QCOMPARE(rowsRemovedSpy.count(), 0);
7199     QCOMPARE(rowsMovedSpy.count(), 0);
7200     QCOMPARE(rowsInsertedSpy.count(), 2);
7201     QCOMPARE(persistentStateChangedSpy.count(), 2);
7202     QCOMPARE(dataChangedSpy.count(), 1);
7203     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7204     QCOMPARE(newEntryInListSpy.count(), 2);
7205 
7206     QCOMPARE(dataChangedSpy.wait(), true);
7207 
7208     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7209     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7210     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 2);
7211     QCOMPARE(rowsRemovedSpy.count(), 0);
7212     QCOMPARE(rowsMovedSpy.count(), 0);
7213     QCOMPARE(rowsInsertedSpy.count(), 2);
7214     QCOMPARE(persistentStateChangedSpy.count(), 2);
7215     QCOMPARE(dataChangedSpy.count(), 2);
7216     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7217     QCOMPARE(newEntryInListSpy.count(), 2);
7218 
7219     auto thirdTrackId = myDatabaseContent.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track3"), QStringLiteral("artist1"), QStringLiteral("album2"), 3, 1);
7220     myPlayListProxyModel.enqueue({{{{DataTypes::ElementTypeRole, ElisaUtils::Track},
7221                                     {DataTypes::DatabaseIdRole, thirdTrackId}}, {}, {}}}, {}, {});
7222 
7223     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7224     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7225     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7226     QCOMPARE(rowsRemovedSpy.count(), 0);
7227     QCOMPARE(rowsMovedSpy.count(), 0);
7228     QCOMPARE(rowsInsertedSpy.count(), 3);
7229     QCOMPARE(persistentStateChangedSpy.count(), 3);
7230     QCOMPARE(dataChangedSpy.count(), 2);
7231     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7232     QCOMPARE(newEntryInListSpy.count(), 3);
7233 
7234     QCOMPARE(dataChangedSpy.wait(), true);
7235 
7236     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7237     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7238     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7239     QCOMPARE(rowsRemovedSpy.count(), 0);
7240     QCOMPARE(rowsMovedSpy.count(), 0);
7241     QCOMPARE(rowsInsertedSpy.count(), 3);
7242     QCOMPARE(persistentStateChangedSpy.count(), 3);
7243     QCOMPARE(dataChangedSpy.count(), 3);
7244     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7245     QCOMPARE(newEntryInListSpy.count(), 3);
7246 
7247     myPlayListProxyModel.setShufflePlayList(true);
7248 
7249     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7250     QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
7251     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7252     QCOMPARE(rowsRemovedSpy.count(), 0);
7253     QCOMPARE(rowsMovedSpy.count(), 0);
7254     QCOMPARE(rowsInsertedSpy.count(), 3);
7255     QCOMPARE(persistentStateChangedSpy.count(), 4);
7256     QCOMPARE(dataChangedSpy.count(), 3);
7257     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7258     QCOMPARE(newEntryInListSpy.count(), 3);
7259 
7260     myPlayListProxyModel.moveRow(2, 0);
7261 
7262     QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
7263     QCOMPARE(rowsAboutToBeMovedSpy.count(), 1);
7264     QCOMPARE(rowsAboutToBeInsertedSpy.count(), 3);
7265     QCOMPARE(rowsRemovedSpy.count(), 0);
7266     QCOMPARE(rowsMovedSpy.count(), 1);
7267     QCOMPARE(rowsInsertedSpy.count(), 3);
7268     QCOMPARE(persistentStateChangedSpy.count(), 4);
7269     QCOMPARE(dataChangedSpy.count(), 3);
7270     QCOMPARE(newTrackByNameInListSpy.count(), 0);
7271     QCOMPARE(newEntryInListSpy.count(), 3);
7272 }
7273 
7274 QTEST_GUILESS_MAIN(MediaPlayListProxyModelTest)
7275 
7276 
7277 #include "moc_mediaplaylistproxymodeltest.cpp"
7278