public void PlaylistFinishedEventHandler_AllSongsHaveRatingSet_DoesNotShowRatePlaylistSongsView()
        {
            // Arrange

            var songs = new[]
            {
                new SongModel {
                    Rating = RatingModel.R5
                },
                new SongModel {
                    Rating = RatingModel.R8
                },
            };

            var playlistFinishedEvent = new PlaylistFinishedEventArgs(songs);

            var mocker = new AutoMocker();

            mocker.Use(Enumerable.Empty <IApplicationInitializer>());
            var target = mocker.CreateInstance <ApplicationViewModel>();

            // Act

            Messenger.Default.Send(playlistFinishedEvent);

            // Assert

            mocker.GetMock <IViewNavigator>().Verify(x => x.ShowRatePlaylistSongsView(It.IsAny <IEnumerable <SongModel> >()), Times.Never);
        }
        public async Task SongPlaybackFinishedEventHandler_IfPlaylistHasMoreSongs_StartsPlayingNextSong()
        {
            // Arrange

            var songs = new[]
            {
                new SongModel {
                    Id = new ItemId("Song 1")
                },
                new SongModel {
                    Id = new ItemId("Song 2")
                },
            };

            var currentSongIndex = 0;

            var playlistStub = new Mock <IPlaylistViewModel>();

            playlistStub.Setup(x => x.Songs).Returns(songs);
            playlistStub.Setup(x => x.CurrentSong).Returns(() => songs[currentSongIndex]);
            playlistStub.Setup(x => x.SwitchToNextSong(It.IsAny <CancellationToken>())).Callback <CancellationToken>(_ => currentSongIndex++);

            var songPlayerMock = new Mock <ISongPlayerViewModel>();

            var mocker = new AutoMocker();

            mocker.Use(playlistStub);
            mocker.Use(songPlayerMock);

            var target = mocker.CreateInstance <PlaylistPlayerViewModel>();

            await target.ReversePlaying(CancellationToken.None);

            songPlayerMock.Invocations.Clear();

            PlaylistFinishedEventArgs playlistFinishedEvent = null;

            Messenger.Default.Register <PlaylistFinishedEventArgs>(this, e => e.RegisterEvent(ref playlistFinishedEvent));

            // Act

            Messenger.Default.Send(new SongPlaybackFinishedEventArgs());

            // Assert

            songPlayerMock.Verify(x => x.Play(songs[1], It.IsAny <CancellationToken>()), Times.Once);

            playlistFinishedEvent.Should().BeNull();
        }
        public async Task SongPlaybackFinishedEventHandler_IfPlaylistHasNoMoreSongs_SendsPlaylistFinishedEvent()
        {
            // Arrange

            var songs = new[]
            {
                new SongModel {
                    Id = new ItemId("Song 1")
                },
                new SongModel {
                    Id = new ItemId("Song 2")
                },
            };

            var currentSong = songs.Last();

            var playlistStub = new Mock <IPlaylistViewModel>();

            playlistStub.Setup(x => x.Songs).Returns(songs);
            playlistStub.Setup(x => x.CurrentSong).Returns(() => currentSong);
            playlistStub.Setup(x => x.SwitchToNextSong(It.IsAny <CancellationToken>())).Callback <CancellationToken>(_ => currentSong = null);

            var mocker = new AutoMocker();

            mocker.Use(playlistStub);

            var target = mocker.CreateInstance <PlaylistPlayerViewModel>();

            await target.ReversePlaying(CancellationToken.None);

            PlaylistFinishedEventArgs playlistFinishedEvent = null;

            Messenger.Default.Register <PlaylistFinishedEventArgs>(this, e => e.RegisterEvent(ref playlistFinishedEvent));

            // Act

            Messenger.Default.Send(new SongPlaybackFinishedEventArgs());

            // Assert

            playlistFinishedEvent.Should().NotBeNull();
            playlistFinishedEvent.Songs.Should().BeEquivalentTo(songs, x => x.WithStrictOrdering());
        }