diff --git a/autotests/manageaudioplayertest.h b/autotests/manageaudioplayertest.h --- a/autotests/manageaudioplayertest.h +++ b/autotests/manageaudioplayertest.h @@ -91,6 +91,8 @@ void testRestorePlayListAndSettingsAutomaticPlay(); + void playSingleAndClearPlayListTrack(); + }; #endif // MANAGEAUDIOPLAYERTEST_H diff --git a/autotests/manageaudioplayertest.cpp b/autotests/manageaudioplayertest.cpp --- a/autotests/manageaudioplayertest.cpp +++ b/autotests/manageaudioplayertest.cpp @@ -4726,6 +4726,433 @@ QCOMPARE(myPlayList.data(myPlayList.index(2, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); } +void ManageAudioPlayerTest::playSingleAndClearPlayListTrack() +{ + ManageAudioPlayer myPlayer; + QStandardItemModel myPlayList; + + QSignalSpy currentTrackChangedSpy(&myPlayer, &ManageAudioPlayer::currentTrackChanged); + QSignalSpy playListModelChangedSpy(&myPlayer, &ManageAudioPlayer::playListModelChanged); + QSignalSpy playerSourceChangedSpy(&myPlayer, &ManageAudioPlayer::playerSourceChanged); + QSignalSpy urlRoleChangedSpy(&myPlayer, &ManageAudioPlayer::urlRoleChanged); + QSignalSpy isPlayingRoleChangedSpy(&myPlayer, &ManageAudioPlayer::isPlayingRoleChanged); + QSignalSpy playerStatusChangedSpy(&myPlayer, &ManageAudioPlayer::playerStatusChanged); + QSignalSpy playerPlaybackStateChangedSpy(&myPlayer, &ManageAudioPlayer::playerPlaybackStateChanged); + QSignalSpy playerErrorChangedSpy(&myPlayer, &ManageAudioPlayer::playerErrorChanged); + QSignalSpy persistentStateChangedSpy(&myPlayer, &ManageAudioPlayer::persistentStateChanged); + QSignalSpy playerPlaySpy(&myPlayer, &ManageAudioPlayer::playerPlay); + QSignalSpy playerPauseSpy(&myPlayer, &ManageAudioPlayer::playerPause); + QSignalSpy playerStopSpy(&myPlayer, &ManageAudioPlayer::playerStop); + QSignalSpy skipNextTrackSpy(&myPlayer, &ManageAudioPlayer::skipNextTrack); + QSignalSpy seekSpy(&myPlayer, &ManageAudioPlayer::seek); + + myPlayList.appendRow(new QStandardItem); + + myPlayList.item(0, 0)->setData(QUrl::fromUserInput(QStringLiteral("file:///1.mp3")), ManageAudioPlayerTest::ResourceRole); + + QCOMPARE(currentTrackChangedSpy.count(), 0); + QCOMPARE(playListModelChangedSpy.count(), 0); + QCOMPARE(playerSourceChangedSpy.count(), 0); + QCOMPARE(urlRoleChangedSpy.count(), 0); + QCOMPARE(isPlayingRoleChangedSpy.count(), 0); + QCOMPARE(playerStatusChangedSpy.count(), 0); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + + myPlayer.setPlayListModel(&myPlayList); + + QCOMPARE(currentTrackChangedSpy.count(), 0); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 0); + QCOMPARE(urlRoleChangedSpy.count(), 0); + QCOMPARE(isPlayingRoleChangedSpy.count(), 0); + QCOMPARE(playerStatusChangedSpy.count(), 0); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + myPlayer.setCurrentTrack(myPlayList.index(0, 0)); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 0); + QCOMPARE(urlRoleChangedSpy.count(), 0); + QCOMPARE(isPlayingRoleChangedSpy.count(), 0); + QCOMPARE(playerStatusChangedSpy.count(), 0); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.currentTrack(), QPersistentModelIndex(myPlayList.index(0, 0))); + + myPlayer.setUrlRole(ManageAudioPlayerTest::ResourceRole); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 0); + QCOMPARE(playerStatusChangedSpy.count(), 0); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.urlRole(), static_cast(ManageAudioPlayerTest::ResourceRole)); + QCOMPARE(myPlayer.playerSource(), QUrl::fromUserInput(QStringLiteral("file:///1.mp3"))); + + myPlayer.setIsPlayingRole(ManageAudioPlayerTest::IsPlayingRole); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 0); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.isPlayingRole(), static_cast(ManageAudioPlayerTest::IsPlayingRole)); + + myPlayer.setPlayerStatus(QMediaPlayer::LoadingMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 1); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::LoadingMedia); + + myPlayer.setPlayerPlaybackState(ManageAudioPlayer::StoppedState); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 1); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + myPlayer.setPlayerError(QMediaPlayer::NoError); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 1); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + myPlayer.setPlayerStatus(QMediaPlayer::LoadedMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 2); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::LoadedMedia); + + myPlayer.setPlayerStatus(QMediaPlayer::BufferingMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 3); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::BufferingMedia); + + myPlayer.playPause(); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 3); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 0); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(playerPlaySpy.wait(), true); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 3); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 0); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + myPlayer.setPlayerPlaybackState(ManageAudioPlayer::PlayingState); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 3); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 1); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), true); + + QCOMPARE(myPlayer.playerPlaybackState(), static_cast(ManageAudioPlayer::PlayingState)); + + myPlayer.setPlayerStatus(QMediaPlayer::EndOfMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 1); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 4); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 1); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), true); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::EndOfMedia); + + myPlayer.setCurrentTrack({}); + + QCOMPARE(currentTrackChangedSpy.count(), 2); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 4); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 1); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 0); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), true); + + QCOMPARE(myPlayer.currentTrack(), QPersistentModelIndex{}); + + QCOMPARE(playerStopSpy.wait(300), true); + + QCOMPARE(currentTrackChangedSpy.count(), 2); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 1); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 4); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 1); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), true); + + myPlayer.setPlayerPlaybackState(ManageAudioPlayer::StoppedState); + + QCOMPARE(currentTrackChangedSpy.count(), 2); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 2); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 4); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 2); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerPlaybackState(), static_cast(ManageAudioPlayer::StoppedState)); + + myPlayer.setCurrentTrack(myPlayList.index(0, 0)); + + QCOMPARE(currentTrackChangedSpy.count(), 3); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 3); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 4); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 2); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.currentTrack(), QPersistentModelIndex(myPlayList.index(0, 0))); + + myPlayer.setPlayerStatus(QMediaPlayer::LoadingMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 3); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 3); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 5); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 2); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::LoadingMedia); + + myPlayer.setPlayerStatus(QMediaPlayer::LoadedMedia); + + QCOMPARE(currentTrackChangedSpy.count(), 3); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 3); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 6); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 2); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); + + QCOMPARE(myPlayer.playerStatus(), QMediaPlayer::LoadedMedia); + + QCOMPARE(playerPlaySpy.wait(300), false); + + QCOMPARE(currentTrackChangedSpy.count(), 3); + QCOMPARE(playListModelChangedSpy.count(), 1); + QCOMPARE(playerSourceChangedSpy.count(), 3); + QCOMPARE(urlRoleChangedSpy.count(), 1); + QCOMPARE(isPlayingRoleChangedSpy.count(), 1); + QCOMPARE(playerStatusChangedSpy.count(), 6); + QCOMPARE(playerPlaybackStateChangedSpy.count(), 2); + QCOMPARE(playerErrorChangedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(playerPlaySpy.count(), 1); + QCOMPARE(playerPauseSpy.count(), 0); + QCOMPARE(playerStopSpy.count(), 1); + QCOMPARE(skipNextTrackSpy.count(), 0); + QCOMPARE(seekSpy.count(), 0); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), ManageAudioPlayerTest::IsPlayingRole).toBool(), false); +} + void ManageAudioPlayerTest::playSingleTrack() { ManageAudioPlayer myPlayer; diff --git a/autotests/mediaplaylisttest.h b/autotests/mediaplaylisttest.h --- a/autotests/mediaplaylisttest.h +++ b/autotests/mediaplaylisttest.h @@ -137,6 +137,8 @@ void testEmptyEnqueue(); + void clearPlayListCase(); + private: QList mNewTracks; diff --git a/autotests/mediaplaylisttest.cpp b/autotests/mediaplaylisttest.cpp --- a/autotests/mediaplaylisttest.cpp +++ b/autotests/mediaplaylisttest.cpp @@ -380,6 +380,163 @@ QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:10")); } +void MediaPlayListTest::clearPlayListCase() +{ + MediaPlayList myPlayList; + ModelTest testModel(&myPlayList); + DatabaseInterface myDatabaseContent; + TracksListener myListener(&myDatabaseContent); + + QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeMoved); + QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeRemoved); + QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, &MediaPlayList::rowsAboutToBeInserted); + QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved); + QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved); + QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted); + QSignalSpy trackHasBeenAddedSpy(&myPlayList, &MediaPlayList::trackHasBeenAdded); + QSignalSpy persistentStateChangedSpy(&myPlayList, &MediaPlayList::persistentStateChanged); + QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged); + QSignalSpy newTrackByIdInListSpy(&myPlayList, &MediaPlayList::newTrackByIdInList); + QSignalSpy newTrackByNameInListSpy(&myPlayList, &MediaPlayList::newTrackByNameInList); + QSignalSpy newTrackByFileNameInListSpy(&myPlayList, &MediaPlayList::newTrackByFileNameInList); + QSignalSpy newArtistInListSpy(&myPlayList, &MediaPlayList::newArtistInList); + QSignalSpy currentTrackChangedSpy(&myPlayList, &MediaPlayList::currentTrackChanged); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 0); + QCOMPARE(trackHasBeenAddedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(newTrackByIdInListSpy.count(), 0); + QCOMPARE(newTrackByNameInListSpy.count(), 0); + QCOMPARE(newTrackByFileNameInListSpy.count(), 0); + QCOMPARE(newArtistInListSpy.count(), 0); + QCOMPARE(currentTrackChangedSpy.count(), 0); + + myDatabaseContent.init(QStringLiteral("testDbDirectContent")); + + connect(&myListener, &TracksListener::trackHasChanged, + &myPlayList, &MediaPlayList::trackChanged, + Qt::QueuedConnection); + connect(&myListener, &TracksListener::albumAdded, + &myPlayList, &MediaPlayList::albumAdded, + Qt::QueuedConnection); + connect(&myPlayList, &MediaPlayList::newTrackByIdInList, + &myListener, &TracksListener::trackByIdInList, + Qt::QueuedConnection); + connect(&myPlayList, &MediaPlayList::newTrackByNameInList, + &myListener, &TracksListener::trackByNameInList, + Qt::QueuedConnection); + connect(&myPlayList, &MediaPlayList::newTrackByFileNameInList, + &myListener, &TracksListener::trackByFileNameInList, + Qt::QueuedConnection); + connect(&myPlayList, &MediaPlayList::newArtistInList, + &myListener, &TracksListener::newArtistInList, + Qt::QueuedConnection); + connect(&myDatabaseContent, &DatabaseInterface::tracksAdded, + &myListener, &TracksListener::tracksAdded); + + myDatabaseContent.insertTracksList(mNewTracks, mNewCovers, QStringLiteral("autoTest")); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 0); + QCOMPARE(trackHasBeenAddedSpy.count(), 0); + QCOMPARE(persistentStateChangedSpy.count(), 0); + QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(newTrackByIdInListSpy.count(), 0); + QCOMPARE(newTrackByNameInListSpy.count(), 0); + QCOMPARE(newTrackByFileNameInListSpy.count(), 0); + QCOMPARE(newArtistInListSpy.count(), 0); + QCOMPARE(currentTrackChangedSpy.count(), 0); + + myPlayList.enqueue(myDatabaseContent.albumFromTitleAndArtist(QStringLiteral("album2"), QStringLiteral("artist1"))); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6); + QCOMPARE(rowsRemovedSpy.count(), 0); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 6); + QCOMPARE(trackHasBeenAddedSpy.count(), 6); + QCOMPARE(persistentStateChangedSpy.count(), 6); + QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(newTrackByIdInListSpy.count(), 6); + QCOMPARE(newTrackByNameInListSpy.count(), 0); + QCOMPARE(newTrackByFileNameInListSpy.count(), 0); + QCOMPARE(newArtistInListSpy.count(), 0); + QCOMPARE(currentTrackChangedSpy.count(), 1); + + QCOMPARE(myPlayList.rowCount(), 6); + + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track1")); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::TrackNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(0, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:05")); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track2")); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::TrackNumberRole).toInt(), 2); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(1, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:06")); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track3")); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::TrackNumberRole).toInt(), 3); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(2, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:07")); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track4")); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::TrackNumberRole).toInt(), 4); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(3, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:08")); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track5")); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1")); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::TrackNumberRole).toInt(), 5); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(4, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:09")); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TitleRole).toString(), QStringLiteral("track6")); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::AlbumRole).toString(), QStringLiteral("album2")); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::ArtistRole).toString(), QStringLiteral("artist1 and artist2")); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::TrackNumberRole).toInt(), 6); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DiscNumberRole).toInt(), 1); + QCOMPARE(myPlayList.data(myPlayList.index(5, 0), MediaPlayList::DurationRole).toString(), QStringLiteral("00:10")); + + QCOMPARE(myPlayList.currentTrack(), QPersistentModelIndex(myPlayList.index(0, 0))); + + myPlayList.clearPlayList(); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), 1); + QCOMPARE(rowsAboutToBeMovedSpy.count(), 0); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), 6); + QCOMPARE(rowsRemovedSpy.count(), 1); + QCOMPARE(rowsMovedSpy.count(), 0); + QCOMPARE(rowsInsertedSpy.count(), 6); + QCOMPARE(trackHasBeenAddedSpy.count(), 6); + QCOMPARE(persistentStateChangedSpy.count(), 6); + QCOMPARE(dataChangedSpy.count(), 0); + QCOMPARE(newTrackByIdInListSpy.count(), 6); + QCOMPARE(newTrackByNameInListSpy.count(), 0); + QCOMPARE(newTrackByFileNameInListSpy.count(), 0); + QCOMPARE(newArtistInListSpy.count(), 0); + QCOMPARE(currentTrackChangedSpy.count(), 2); + + QCOMPARE(myPlayList.rowCount(), 0); + + QCOMPARE(myPlayList.currentTrack().isValid(), false); +} + void MediaPlayListTest::enqueueArtistCase() { MediaPlayList myPlayList; diff --git a/src/manageaudioplayer.cpp b/src/manageaudioplayer.cpp --- a/src/manageaudioplayer.cpp +++ b/src/manageaudioplayer.cpp @@ -159,6 +159,9 @@ case PlayingState: case PausedState: triggerStop(); + if (mPlayingState && !mCurrentTrack.isValid()) { + mPlayingState = false; + } mSkippingCurrentTrack = true; break; } diff --git a/src/mediaplaylist.cpp b/src/mediaplaylist.cpp --- a/src/mediaplaylist.cpp +++ b/src/mediaplaylist.cpp @@ -821,6 +821,10 @@ d->mTrackData.clear(); endRemoveRows(); + d->mCurrentPlayListPosition = 0; + d->mCurrentTrack = QPersistentModelIndex{}; + notifyCurrentTrackChanged(); + Q_EMIT tracksCountChanged(); }