2
* Copyright (C) 2015 Canonical, Ltd.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation; version 3.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
#include "tst_mediaplaylist.h"
18
#include "aalutility.h"
23
#include <QMediaPlayer>
24
#include <QMediaPlaylist>
26
#include <QtTest/QtTest>
28
void tst_MediaPlaylist::initTestCase()
32
void tst_MediaPlaylist::cleanupTestCase()
36
void tst_MediaPlaylist::init()
38
// NOTE: This sleep is currently needed in order to give media-hub a bit of time
39
// between our different tests to cleanup and come back in a state where it can
40
// respond to our requests.
44
void tst_MediaPlaylist::constructDestroyRepeat()
46
for (int i=0; i<25; i++)
48
QMediaPlayer *player = new QMediaPlayer;
49
QMediaPlaylist *playlist = new QMediaPlaylist;
50
player->setPlaylist(playlist);
57
void tst_MediaPlaylist::addTwoTracksAndVerify()
59
QMediaPlayer *player = new QMediaPlayer;
60
QMediaPlaylist *playlist = new QMediaPlaylist;
61
player->setPlaylist(playlist);
63
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
64
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
66
QCOMPARE(playlist->mediaCount(), 2);
72
void tst_MediaPlaylist::insertTracksAtPositionAndVerify()
74
QMediaPlayer *player = new QMediaPlayer;
75
QMediaPlaylist *playlist = new QMediaPlaylist;
76
player->setPlaylist(playlist);
80
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
81
waitTrackInserted(playlist);
82
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
83
waitTrackInserted(playlist);
84
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile1.ogg")));
85
waitTrackInserted(playlist);
86
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile2.ogg")));
87
waitTrackInserted(playlist);
88
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile3.ogg")));
89
waitTrackInserted(playlist);
90
qDebug() << "** addMedia took" << timer.elapsed() << "milliseconds";
92
QCOMPARE(playlist->mediaCount(), 5);
94
const QMediaContent insertedTrack(QUrl("file://" + QFINDTESTDATA("testdata/testfile4.ogg")));
95
playlist->insertMedia(2, insertedTrack);
96
waitTrackInserted(playlist);
98
qDebug() << "playlist->media(2):" << playlist->media(2).canonicalUrl();
99
qDebug() << "insertedTrack:" << insertedTrack.canonicalUrl();
100
QCOMPARE(playlist->media(2), insertedTrack);
106
void tst_MediaPlaylist::moveTrackAndVerify()
108
QMediaPlayer *player = new QMediaPlayer;
109
QMediaPlaylist *playlist = new QMediaPlaylist;
110
player->setPlaylist(playlist);
114
QList<QMediaContent> content;
115
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
116
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
117
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile1.ogg")));
118
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile2.ogg")));
119
const QMediaContent newLastTrack(QUrl("file://" + QFINDTESTDATA("testdata/testfile3.ogg")));
120
content.push_back(newLastTrack);
121
const QMediaContent insertedTrack(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
122
content.push_back(insertedTrack);
123
playlist->addMedia(content);
124
waitTrackInserted(playlist);
125
qDebug() << "** addMedia took" << timer.elapsed() << "milliseconds";
127
QCOMPARE(playlist->mediaCount(), 6);
129
connectSignal(playlist, Signals::MediaRemoved);
130
connectSignal(playlist, Signals::MediaInserted);
131
playlist->moveMedia(5, 2);
133
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaRemoved);
134
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaInserted);
135
QCOMPARE(playlist->mediaCount(), 6);
141
void tst_MediaPlaylist::movePlayingTrackAndVerify()
143
QMediaPlayer *player = new QMediaPlayer;
144
QMediaPlaylist *playlist = new QMediaPlaylist;
145
player->setPlaylist(playlist);
149
QList<QMediaContent> content;
150
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
151
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
152
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile1.ogg")));
153
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile2.ogg")));
154
const QMediaContent newLastTrack(QUrl("file://" + QFINDTESTDATA("testdata/testfile3.ogg")));
155
content.push_back(newLastTrack);
156
const QMediaContent insertedTrack(QUrl("file://" + QFINDTESTDATA("testdata/Ubuntu.ogg")));
157
content.push_back(insertedTrack);
158
playlist->addMedia(content);
159
waitTrackInserted(playlist);
160
qDebug() << "** addMedia took" << timer.elapsed() << "milliseconds";
162
playlist->setCurrentIndex(5);
163
waitCurrentIndexChange(playlist);
164
QCOMPARE(playlist->currentIndex(), 5);
168
QCOMPARE(playlist->mediaCount(), 6);
172
connectSignal(playlist, Signals::MediaRemoved);
173
connectSignal(playlist, Signals::MediaInserted);
174
playlist->moveMedia(5, 2);
176
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaRemoved);
177
qDebug() << "Verifying the presence of MediaInserted signal in deque";
178
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaInserted);
179
QCOMPARE(playlist->mediaCount(), 6);
181
waitCurrentIndexChange(playlist);
183
QCOMPARE(player->state(), QMediaPlayer::State::PlayingState);
184
QCOMPARE(playlist->currentIndex(), 2);
190
void tst_MediaPlaylist::addListOfTracksAndVerify()
192
QMediaPlayer *player = new QMediaPlayer;
193
QMediaPlaylist *playlist = new QMediaPlaylist;
194
player->setPlaylist(playlist);
196
QList<QMediaContent> content;
197
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
198
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
200
playlist->addMedia(content);
202
QCOMPARE(playlist->mediaCount(), 2);
208
void tst_MediaPlaylist::addLargeListOfTracksAndVerify()
210
QMediaPlayer *player = new QMediaPlayer;
211
QMediaPlaylist *playlist = new QMediaPlaylist;
212
player->setPlaylist(playlist);
214
// Total number of tracks added will be iterations * 5
215
const uint16_t iterations = 20;
218
for (uint16_t i=0; i<iterations; i++)
220
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
221
waitTrackInserted(playlist);
222
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
223
waitTrackInserted(playlist);
224
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
225
waitTrackInserted(playlist);
226
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
227
waitTrackInserted(playlist);
228
playlist->addMedia(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
229
waitTrackInserted(playlist);
231
qDebug() << "** addMedia loop took" << timer.elapsed() << "milliseconds";
233
QCOMPARE(playlist->mediaCount(), iterations * 5);
239
void tst_MediaPlaylist::addLargeListOfTracksAtOnceAndVerify()
241
QMediaPlayer *player = new QMediaPlayer;
242
QMediaPlaylist *playlist = new QMediaPlaylist;
243
player->setPlaylist(playlist);
245
QList<QMediaContent> content;
249
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
250
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
251
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
252
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
253
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
254
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
255
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
256
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
257
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
258
content.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
263
playlist->addMedia(content);
264
qDebug() << "** addMedia(QList) took" << timer.elapsed() << "milliseconds";
266
waitTrackInserted(playlist);
267
QCOMPARE(playlist->mediaCount(), i * 10);
273
void tst_MediaPlaylist::addTwoListsOfTracksAtOnceAndVerify()
275
QMediaPlayer *player = new QMediaPlayer;
276
QMediaPlaylist *playlist = new QMediaPlaylist;
277
player->setPlaylist(playlist);
279
QList<QMediaContent> content1;
280
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
281
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
282
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
283
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
284
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
285
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
286
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
287
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
288
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
289
content1.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
291
QList<QMediaContent> content2;
292
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
293
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
294
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
295
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
296
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile.mp4")));
297
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile.ogg")));
298
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile1.ogg")));
299
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile2.ogg")));
300
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile3.ogg")));
301
content2.push_back(QUrl(QFINDTESTDATA("testdata/testfile4.ogg")));
305
playlist->addMedia(content1);
306
qDebug() << "** First list addMedia(QList) took" << timer.elapsed() << "milliseconds";
308
waitTrackInserted(playlist);
309
QCOMPARE(playlist->mediaCount(), 10);
313
playlist->addMedia(content2);
314
qDebug() << "** Second list addMedia(QList) took" << timer.elapsed() << "milliseconds";
316
waitTrackInserted(playlist);
317
QCOMPARE(playlist->mediaCount(), 20);
323
void tst_MediaPlaylist::goToNextTrack()
325
QMediaPlayer *player = new QMediaPlayer;
326
QMediaPlaylist *playlist = new QMediaPlaylist;
327
player->setPlaylist(playlist);
329
const QUrl audio(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
330
const QUrl video(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
331
qDebug() << "audio URL: " << audio.toString();
332
qDebug() << "video URL: " << video.toString();
333
playlist->addMedia(audio);
334
playlist->addMedia(video);
336
QCOMPARE(playlist->mediaCount(), 2);
340
QCoreApplication::processEvents();
342
const QUrl audioToVerify(playlist->currentMedia().canonicalUrl());
343
QCOMPARE(audioToVerify, audio);
347
QCoreApplication::processEvents();
349
const QUrl videoToVerify(playlist->currentMedia().canonicalUrl());
350
QCOMPARE(videoToVerify, video);
356
void tst_MediaPlaylist::goToPreviousTrack()
358
QMediaPlayer *player = new QMediaPlayer;
359
QMediaPlaylist *playlist = new QMediaPlaylist;
360
player->setPlaylist(playlist);
362
const QUrl audio1(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
363
const QUrl audio2(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
364
playlist->addMedia(audio1);
365
playlist->addMedia(audio2);
367
QCOMPARE(playlist->mediaCount(), 2);
368
playlist->setCurrentIndex(1);
372
QCoreApplication::processEvents();
374
const QUrl audio2ToVerify(playlist->currentMedia().canonicalUrl());
375
QCOMPARE(audio2ToVerify, audio2);
377
playlist->previous();
379
QCoreApplication::processEvents();
381
const QUrl audio1ToVerify(playlist->currentMedia().canonicalUrl());
382
QCOMPARE(audio2ToVerify, audio1);
383
QCOMPARE(playlist->currentIndex(), 0);
389
void tst_MediaPlaylist::verifyMedia()
391
QMediaPlayer *player = new QMediaPlayer;
392
QMediaPlaylist *playlist = new QMediaPlaylist;
393
player->setPlaylist(playlist);
395
const QUrl audio(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
396
const QUrl video(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
397
qDebug() << "audio URL: " << audio.toString();
398
qDebug() << "video URL: " << video.toString();
399
playlist->addMedia(audio);
400
playlist->addMedia(video);
402
QCOMPARE(playlist->mediaCount(), 2);
404
const QUrl audioToVerify(playlist->media(0).canonicalUrl());
405
QCOMPARE(audioToVerify, audio);
407
const QUrl videoToVerify(playlist->media(1).canonicalUrl());
408
QCOMPARE(videoToVerify, video);
414
void tst_MediaPlaylist::removeTrackAndVerify()
416
QMediaPlayer *player = new QMediaPlayer;
417
QMediaPlaylist *playlist = new QMediaPlaylist;
418
player->setPlaylist(playlist);
420
playlist->addMedia(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
421
const QUrl video(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
422
playlist->addMedia(video);
424
waitTrackInserted(playlist);
425
QCOMPARE(playlist->mediaCount(), 2);
427
playlist->removeMedia(0);
429
QCOMPARE(playlist->mediaCount(), 1);
431
const QUrl videoToVerify(playlist->media(0).canonicalUrl());
432
QCOMPARE(videoToVerify, video);
438
void tst_MediaPlaylist::removeCurrentNonPlayingTrackAndVerify()
440
QMediaPlayer *player = new QMediaPlayer;
441
QMediaPlaylist *playlist = new QMediaPlaylist;
442
player->setPlaylist(playlist);
444
QList<QMediaContent> content1;
445
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
446
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile1.ogg")));
447
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile2.ogg")));
448
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile3.ogg")));
449
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile4.ogg")));
450
playlist->addMedia(content1);
451
const QUrl track(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
452
playlist->addMedia(track);
454
waitTrackInserted(playlist);
455
QCOMPARE(playlist->mediaCount(), 6);
457
playlist->setCurrentIndex(2);
458
// Wait for the currentMediaChanged signal to be emited
459
waitTrackChange(playlist);
460
// We should not be automatically playing
461
QCOMPARE(player->state(), QMediaPlayer::State::StoppedState);
462
QCOMPARE(playlist->currentIndex(), 2);
464
playlist->removeMedia(2);
466
// We should still not be playing
467
QCOMPARE(player->state(), QMediaPlayer::State::StoppedState);
469
QCOMPARE(playlist->mediaCount(), 5);
471
const QUrl trackToVerify(playlist->media(4).canonicalUrl());
472
QCOMPARE(trackToVerify, track);
478
void tst_MediaPlaylist::removeCurrentPlayingTrackAndVerify()
480
QMediaPlayer *player = new QMediaPlayer;
481
QMediaPlaylist *playlist = new QMediaPlaylist;
482
player->setPlaylist(playlist);
484
QList<QMediaContent> content1;
485
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
486
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile1.ogg")));
487
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile2.ogg")));
488
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile3.ogg")));
489
content1.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile4.ogg")));
490
playlist->addMedia(content1);
491
const QUrl track(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
492
playlist->addMedia(track);
494
waitTrackInserted(playlist);
495
QCOMPARE(playlist->mediaCount(), 6);
499
playlist->setCurrentIndex(2);
500
// Wait for the currentMediaChanged signal to be emited
501
waitTrackChange(playlist);
503
QCOMPARE(player->state(), QMediaPlayer::State::PlayingState);
504
QCOMPARE(playlist->currentIndex(), 2);
506
playlist->removeMedia(2);
508
// We should still be playing
509
QCOMPARE(player->state(), QMediaPlayer::State::PlayingState);
511
QCOMPARE(playlist->mediaCount(), 5);
513
const QUrl trackToVerify(playlist->media(4).canonicalUrl());
514
QCOMPARE(trackToVerify, track);
520
void tst_MediaPlaylist::removeLastCurrentPlayingTrackAndVerify()
522
QMediaPlayer *player = new QMediaPlayer;
523
QMediaPlaylist *playlist = new QMediaPlaylist;
524
player->setPlaylist(playlist);
526
const QUrl track(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
527
playlist->addMedia(track);
529
waitTrackInserted(playlist);
530
QCOMPARE(playlist->mediaCount(), 1);
534
playlist->setCurrentIndex(0);
535
qDebug() << "Waiting for playback status to change to playing";
536
// Wait for the currentMediaChanged signal to be emited
537
waitTrackChange(playlist);
539
QCOMPARE(player->state(), QMediaPlayer::State::PlayingState);
541
qDebug() << "Removing track index 0";
542
playlist->removeMedia(0);
544
waitTrackRemoved(playlist);
545
// We should no longer be playing
546
QCOMPARE(player->state(), QMediaPlayer::State::StoppedState);
548
QCOMPARE(playlist->mediaCount(), 0);
554
void tst_MediaPlaylist::verifyCurrentIndex()
556
QMediaPlayer *player = new QMediaPlayer;
557
QMediaPlaylist *playlist = new QMediaPlaylist;
558
player->setPlaylist(playlist);
560
QList<QMediaContent> content;
561
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
562
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
563
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
564
playlist->addMedia(content);
566
waitTrackInserted(playlist);
567
QCOMPARE(playlist->mediaCount(), 3);
569
qDebug() << "Setting current index to be 1";
570
playlist->setCurrentIndex(1);
572
// Wait for the currentMediaChanged signal to be emited
573
waitTrackChange(playlist);
575
qDebug() << "Checking if current index is 1";
576
QCOMPARE(playlist->currentIndex(), 1);
582
void tst_MediaPlaylist::verifyNextIndex()
584
QMediaPlayer *player = new QMediaPlayer;
585
QMediaPlaylist *playlist = new QMediaPlaylist;
586
player->setPlaylist(playlist);
588
QList<QMediaContent> content;
589
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
590
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
591
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
592
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
593
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
594
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
595
playlist->addMedia(content);
597
waitTrackInserted(playlist);
598
QCOMPARE(playlist->mediaCount(), 6);
600
QCOMPARE(playlist->nextIndex(1), 1);
601
QCOMPARE(playlist->nextIndex(4), 4);
602
QCOMPARE(playlist->nextIndex(6), 0);
603
QCOMPARE(playlist->nextIndex(7), 1);
604
QCOMPARE(playlist->nextIndex(11), 5);
610
void tst_MediaPlaylist::verifyPreviousIndex()
612
QMediaPlayer *player = new QMediaPlayer;
613
QMediaPlaylist *playlist = new QMediaPlaylist;
614
player->setPlaylist(playlist);
616
QList<QMediaContent> content;
617
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
618
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
619
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
620
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
621
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
622
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
623
playlist->addMedia(content);
625
waitTrackInserted(playlist);
626
QCOMPARE(playlist->mediaCount(), 6);
628
QCOMPARE(playlist->previousIndex(1), 5);
629
QCOMPARE(playlist->previousIndex(4), 2);
630
QCOMPARE(playlist->previousIndex(6), 0);
631
QCOMPARE(playlist->previousIndex(11), 1);
632
QCOMPARE(playlist->previousIndex(21), 3);
633
QCOMPARE(playlist->previousIndex(19), 5);
639
void tst_MediaPlaylist::verifyPlaybackModeCurrentItemInLoop()
641
QMediaPlayer *player = new QMediaPlayer;
642
QMediaPlaylist *playlist = new QMediaPlaylist;
643
player->setPlaylist(playlist);
645
connectSignal(playlist, Signals::MediaInserted);
647
QList<QMediaContent> content;
648
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
649
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
650
playlist->addMedia(content);
652
// Wait until the first track is set as the current one
653
waitTrackChange(playlist);
654
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaInserted);
655
QCOMPARE(playlist->mediaCount(), 2);
657
waitPlaybackModeChange(playlist, [playlist]()
659
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
664
// Wait for the currentMediaChanged signal to be emited
665
waitTrackChange(playlist);
667
QCOMPARE(playlist->currentIndex(), 0);
673
void tst_MediaPlaylist::verifyPlaybackModeSequential()
675
QMediaPlayer *player = new QMediaPlayer;
676
QMediaPlaylist *playlist = new QMediaPlaylist;
677
player->setPlaylist(playlist);
679
connectSignal(playlist, Signals::MediaInserted);
681
QList<QMediaContent> content;
682
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
683
content.push_back(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
684
playlist->addMedia(content);
686
// Wait until the first track is set as the current one
687
waitTrackChange(playlist);
688
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaInserted);
689
QCOMPARE(playlist->mediaCount(), 2);
691
waitPlaybackModeChange(playlist, [playlist]()
693
playlist->setPlaybackMode(QMediaPlaylist::Sequential);
698
// Wait until the second track is selected
699
waitTrackChange(playlist);
701
QCOMPARE(playlist->currentIndex(), 1);
707
void tst_MediaPlaylist::playReusePlayTrackList()
709
QMediaPlayer *player = new QMediaPlayer;
710
QMediaPlaylist *playlist = new QMediaPlaylist;
711
player->setPlaylist(playlist);
713
const QUrl audio(QUrl("file://" + QFINDTESTDATA("testdata/testfile.ogg")));
714
const QUrl video(QUrl("file://" + QFINDTESTDATA("testdata/testfile.mp4")));
716
for (int i = 0; i < 5; ++i) {
717
playlist->addMedia(audio);
718
waitTrackInserted(playlist);
719
playlist->addMedia(video);
720
waitTrackInserted(playlist);
721
playlist->addMedia(audio);
722
waitTrackInserted(playlist);
723
QCOMPARE(playlist->mediaCount(), 3);
727
const QUrl audioToVerify(playlist->currentMedia().canonicalUrl());
728
QCOMPARE(audioToVerify, audio);
732
connectSignal(playlist, Signals::MediaRemoved);
735
Q_ASSERT(m_signalsDeque.pop_front() == Signals::MediaRemoved);
737
QCOMPARE(playlist->mediaCount(), 0);
745
void tst_MediaPlaylist::wait_for_signal(std::future<R> const& f)
747
while (!is_ready<R>(f))
749
// Make sure we don't block the main QEventLoop, which
750
// would hinder receiving the currentMediaChanged event above
751
QCoreApplication::processEvents();
752
std::this_thread::yield();
756
void tst_MediaPlaylist::waitTrackChange(QMediaPlaylist *playlist)
758
QMediaContent current_media;
759
std::promise<QMediaContent> promise;
760
std::future<QMediaContent> future{promise.get_future()};
762
QMetaObject::Connection c = connect(playlist, &QMediaPlaylist::currentMediaChanged,
763
[&](const QMediaContent& content)
765
qDebug() << "currentMediaChanged to: " << content.canonicalUrl().toString();
766
current_media = content;
767
promise.set_value(current_media);
768
// Make sure the promise is not fulfilled twice
769
QObject::disconnect(c);
772
wait_for_signal(future);
775
void tst_MediaPlaylist::waitTrackInserted(QMediaPlaylist *playlist)
778
std::promise<int> promise;
779
std::future<int> future{promise.get_future()};
781
QMetaObject::Connection c = connect(playlist, &QMediaPlaylist::mediaInserted,
782
[&](int start, int end)
784
qDebug() << "mediaInserted start: " << start << ", end: " << end;
786
promise.set_value(index);
787
// Make sure the promise is not fulfilled twice
788
QObject::disconnect(c);
791
wait_for_signal(future);
794
void tst_MediaPlaylist::waitTrackRemoved(QMediaPlaylist *playlist)
797
std::promise<int> promise;
798
std::future<int> future{promise.get_future()};
800
QMetaObject::Connection c = connect(playlist, &QMediaPlaylist::mediaRemoved,
801
[&](int start, int end)
803
qDebug() << "mediaRemoved start: " << start << ", end: " << end;
805
promise.set_value(index);
806
// Make sure the promise is not fulfilled twice
807
QObject::disconnect(c);
810
wait_for_signal(future);
813
void tst_MediaPlaylist::waitPlaybackModeChange(QMediaPlaylist *playlist,
814
const std::function<void()>& action)
816
QMediaPlaylist::PlaybackMode current_mode;
817
std::promise<QMediaPlaylist::PlaybackMode> promise;
818
std::future<QMediaPlaylist::PlaybackMode> future{promise.get_future()};
820
QMetaObject::Connection c = connect(playlist, &QMediaPlaylist::playbackModeChanged,
821
[&](QMediaPlaylist::PlaybackMode mode)
823
qDebug() << "playbackModeChanged to: " << mode;
825
promise.set_value(current_mode);
826
// Make sure the promise is not fulfilled twice
827
QObject::disconnect(c);
832
wait_for_signal(future);
835
void tst_MediaPlaylist::waitCurrentIndexChange(QMediaPlaylist *playlist)
838
std::promise<int> promise;
839
std::future<int> future{promise.get_future()};
841
QMetaObject::Connection c = connect(playlist, &QMediaPlaylist::currentIndexChanged,
844
qDebug() << "currentIndexChanged index: " << i;
846
promise.set_value(index);
847
// Make sure the promise is not fulfilled twice
848
QObject::disconnect(c);
851
wait_for_signal(future);
854
void tst_MediaPlaylist::connectSignal(QMediaPlaylist *playlist, Signals signal)
858
case Signals::Unknown:
860
case Signals::CurrentMediaChanged:
862
connect(playlist, &QMediaPlaylist::currentMediaChanged, [&](const QMediaContent& content)
865
qDebug() << "Pushing CurrentMediaChanged onto m_signalsDeque";
866
m_signalsDeque.push_back(signal);
870
case Signals::MediaInserted:
872
connect(playlist, &QMediaPlaylist::mediaInserted, [&](int start, int end)
876
qDebug() << "Pushing MediaInserted onto m_signalsDeque";
877
m_signalsDeque.push_back(signal);
881
case Signals::MediaRemoved:
883
connect(playlist, &QMediaPlaylist::mediaRemoved, [&](int index)
886
qDebug() << "Pushing MediaRemoved onto m_signalsDeque";
887
m_signalsDeque.push_back(signal);
892
qWarning() << "Unknown signal type, can't add to queue:" << signal;
896
QTEST_GUILESS_MAIN(tst_MediaPlaylist)