public void PlaylistChangedEventHandler_WhenTitleIsSet_SendsPropertyChangedEvent() { // Arrange var song = new SongModel { Title = "Some Song" }; var playlistChangedEvent = new PlaylistChangedEventArgs(new[] { song }, song, 0); var mocker = new AutoMocker(); mocker.Use(Enumerable.Empty <IApplicationInitializer>()); var target = mocker.CreateInstance <ApplicationViewModel>(); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act Messenger.Default.Send(playlistChangedEvent); // Assert var expectedProperties = new[] { nameof(ApplicationViewModel.Title), }; propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties); }
private static void Current_PlaylistChanged(MediaController sender, PlaylistChangedEventArgs args) { if (UDPServer.Current.ClientList?.Count > 0) { SendUpdateList(args.NewList); } }
public void PlaylistChangedEventHandler_IfCurrentSongIsNull_ReturnsDefaultTitle() { // Arrange var song = new SongModel { Title = "Some Song" }; var playlistChangedEventWithCurrentSong = new PlaylistChangedEventArgs(new[] { song }, song, 0); var playlistChangedEventWithNoCurrentSong = new PlaylistChangedEventArgs(new[] { song }, null, null); var mocker = new AutoMocker(); mocker.Use(Enumerable.Empty <IApplicationInitializer>()); var target = mocker.CreateInstance <ApplicationViewModel>(); Messenger.Default.Send(playlistChangedEventWithCurrentSong); target.Title.Should().NotBe("Panda Player"); // Act Messenger.Default.Send(playlistChangedEventWithNoCurrentSong); // Assert target.Title.Should().Be("Panda Player"); }
public void PlaylistChangedEventHandler_IfCurrentSongHasArtist_ReturnsCorrectTitle() { // Arrange var song = new SongModel { Title = "Some Song", Artist = new ArtistModel { Name = "Some Artist", }, }; var playlistChangedEvent = new PlaylistChangedEventArgs(new[] { song }, song, 0); var mocker = new AutoMocker(); mocker.Use(Enumerable.Empty <IApplicationInitializer>()); var target = mocker.CreateInstance <ApplicationViewModel>(); // Act Messenger.Default.Send(playlistChangedEvent); // Assert target.Title.Should().Be("1/1 - Some Artist - Some Song"); }
public void PlaylistChangedEventHandler_PlaylistHasMultipleSongs_SetsTrackNumberInfoCorrectly() { // Arrange var songs = new[] { new SongModel { Title = "First Song" }, new SongModel { Title = "Second Song" }, new SongModel { Title = "Third Song" }, }; var playlistChangedEvent = new PlaylistChangedEventArgs(songs, songs[1], 1); var mocker = new AutoMocker(); mocker.Use(Enumerable.Empty <IApplicationInitializer>()); var target = mocker.CreateInstance <ApplicationViewModel>(); // Act Messenger.Default.Send(playlistChangedEvent); // Assert target.Title.Should().Be("2/3 - Second Song"); }
private void QueueControllerOnPlaylistChangedEvent(object sender, PlaylistChangedEventArgs playlistChangedEventArgs) { if (!_ignoreQueueControllerUpdates) { SetQueue(); } }
public async Task RemoveSongsFromPlaylist_ForSongsFromTheList_RemovesSongsFromPlaylist() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, new SongModel { Id = new ItemId("3") }, new SongModel { Id = new ItemId("4") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act await target.RemoveSongsFromPlaylist(new[] { target.SongItems[0], target.SongItems[2], target.SongItems[4] }, CancellationToken.None); // Assert var expectedLeftSongs = new[] { songs[1], songs[3], }; target.Songs.Should().BeEquivalentTo(expectedLeftSongs, x => x.WithStrictOrdering()); target.CurrentSong.Should().BeNull(); playlistChangedEventArgs.VerifyPlaylistEvent(expectedLeftSongs, null); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
private void UpdatePlaylist(IList <MultimediaItem> playlist) { actualPlaylist.Clear(); foreach (MultimediaItem multimedia in playlist) { actualPlaylist.Add(multimedia); } PlaylistChangedEventArgs eventArgs = new PlaylistChangedEventArgs(new List <MultimediaItem>(actualPlaylist)); messageQueue.Post(() => PlaylistChanged(this, eventArgs)); }
public async Task AddingSongsToPlaylistNextEventHandler_ForNonEmptyPlaylistWhenCurrentSongIsNotSet_AddsSongsAtPlaylistStart() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, }; var songsToAdd = new[] { new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); target.CurrentSong.Should().BeNull(); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act Messenger.Default.Send(new AddingSongsToPlaylistNextEventArgs(songsToAdd)); // Assert var expectedSongs = songsToAdd.Concat(songs).ToList(); target.Songs.Should().BeEquivalentTo(expectedSongs, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(songsToAdd[0]); playlistChangedEventArgs.VerifyPlaylistEvent(expectedSongs, 0); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
public async Task RemoveSongsFromPlaylist_CurrentSongIsNotRemoved_LeavesCurrentSongUnchanged() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, new SongModel { Id = new ItemId("3") }, new SongModel { Id = new ItemId("4") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); target.CurrentSong.Should().Be(songs[2]); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act await target.RemoveSongsFromPlaylist(new[] { target.SongItems[1], target.SongItems[3] }, CancellationToken.None); // Assert target.CurrentSong.Should().Be(songs[2]); target.SongItems.Where(x => x.IsCurrentlyPlayed).Should().HaveCount(1); target.SongItems[1].IsCurrentlyPlayed.Should().BeTrue(); playlistChangedEventArgs.CurrentSong.Should().Be(songs[2]); playlistChangedEventArgs.CurrentSongIndex.Should().Be(1); }
public async Task SetPlaylistSongs_ForNonEmptyPlaylist_SetsPlaylistSongsCorrectly() { // Arrange var oldSongs = new[] { new SongModel { Id = new ItemId("0") }, }; var newSongs = new[] { new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(oldSongs, CancellationToken.None); target.CurrentSong.Should().Be(oldSongs[0]); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act await target.SetPlaylistSongs(newSongs, CancellationToken.None); // Assert target.Songs.Should().BeEquivalentTo(newSongs, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(newSongs[0]); playlistChangedEventArgs.VerifyPlaylistEvent(newSongs, 0); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
private void OnPlaylistChanged(object sender, PlaylistChangedEventArgs e) { switch (e.Action) { case PlaylistChangeAction.Add: Playlists.Add(e.Playlist); break; case PlaylistChangeAction.Remove: Playlists.Remove(e.Playlist); break; default: return; } Bindings.Update(); }
public void OnPlaylistChanged(object sender, PlaylistChangedEventArgs eventArgs) { IList <MultimediaItem> playlist = eventArgs.Playlist; Items.Clear(); foreach (MultimediaItem multimedia in playlist) { MultimediaViewModel viewModel = new MultimediaViewModel(multimedia); Items.Add(viewModel); } if (Items.Count > 0) { Items.RemoveAt(0); } NotifyPropertyChanged("Items"); }
public async Task SwitchToNextSong_IfCurrentSongIsInListMiddle_SwitchesToNextSong() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); target.CurrentSong.Should().Be(songs[1]); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act await target.SwitchToNextSong(CancellationToken.None); // Assert target.CurrentSong.Should().Be(songs[2]); target.SongItems[1].IsCurrentlyPlayed.Should().BeFalse(); target.SongItems[2].IsCurrentlyPlayed.Should().BeTrue(); playlistChangedEventArgs.VerifyPlaylistEvent(songs, 2); }
public async Task PlayFromSong_ForSongFromTheList_SetsThisSongAsCurrentAndSendsPlayPlaylistStartingFromSongEvent() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); PlayPlaylistStartingFromSongEventArgs playPlaylistEventArgs = null; Messenger.Default.Register <PlayPlaylistStartingFromSongEventArgs>(this, e => e.RegisterEvent(ref playPlaylistEventArgs)); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act await target.PlayFromSong(target.SongItems[1], CancellationToken.None); // Assert target.CurrentSong.Should().Be(songs[1]); target.SongItems[1].IsCurrentlyPlayed.Should().BeTrue(); playPlaylistEventArgs.Should().NotBeNull(); playlistChangedEventArgs.VerifyPlaylistEvent(songs, 1); }
public async Task ClearPlaylist_ForNonEmptyPlaylist_ClearsPlaylistCorrectly() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act await target.ClearPlaylist(CancellationToken.None); // Assert target.Songs.Should().BeEmpty(); target.CurrentSong.Should().BeNull(); playlistChangedEventArgs.VerifyPlaylistEvent(Array.Empty <SongModel>(), null); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
private void OnPlaylistChanged(object sender, PlaylistChangedEventArgs e) { switch (e.Action) { case PlaylistChangeAction.Content: if (e.NewTitle == Playlist.Title) { Playlist = e.Playlist; Bindings.Update(); } return; case PlaylistChangeAction.Rename: if (e.OldTitle == Playlist.Title || e.NewTitle == Playlist.Title) { Playlist = e.Playlist; Bindings.Update(); } break; } }
public async Task SwitchToNextSong_CurrentSongIsNotSet_ThrowsInvalidOperationException() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); target.CurrentSong.Should().BeNull(); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act Func <Task> call = () => target.SwitchToNextSong(CancellationToken.None); // Assert await call.Should().ThrowAsync <InvalidOperationException>(); }
public async Task AddSongsNext_ForEmptyPlaylist_FillsPlaylistWithPassedSongs() { // Arrange var songsToAdd = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act await target.AddSongsNext(songsToAdd, CancellationToken.None); // Assert target.Songs.Should().BeEquivalentTo(songsToAdd, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(songsToAdd[0]); playlistChangedEventArgs.VerifyPlaylistEvent(songsToAdd, 0); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
public async Task SwitchToNextSong_SendsPlaylistChangedEvent() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("song 0") }, new SongModel { Id = new ItemId("song 1") }, new SongModel { Id = new ItemId("song 2") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PersistentPlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act await target.SwitchToNextSong(CancellationToken.None); // Assert playlistChangedEventArgs.VerifyPlaylistEvent(songs, 2); }
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ) { var jObject = JObject.Load(reader); var eventName = jObject["event"].Value<string>(); var jReader = jObject.CreateReader(); switch (eventName) { case EventArgs.MuteChangedEventArgs.EventName: { var args = new MuteChangedEventArgs(); serializer.Populate(jReader, args); return args; } // ** Can't receive "on_event" ? ** //case EventArgs.OnEventEventArgs.EventName: // { // var args = new OnEventEventArgs(); // serializer.Populate(jReader, args); // return args; // } case EventArgs.OptionsChangedEventArgs.EventName: { var args = new OptionsChangedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.PlaybackStateChangedEventArgs.EventName: { var args = new PlaybackStateChangedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.PlaylistChangedEventArgs.EventName: { var args = new PlaylistChangedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.PlaylistDeletedEventArgs.EventName: { var args = new PlaylistDeletedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.PlaylistsLoadedEventArgs.EventName: { var args = new PlaylistsLoadedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.SeekedEventArgs.EventName: { var args = new SeekedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.StreamTitleChangedEventArgs.EventName: { var args = new StreamTitleChangedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.TracklistChangedEventArgs.EventName: { var args = new TracklistChangedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.TrackPlaybackEndedEventArgs.EventName: { var args = new TrackPlaybackEndedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.TrackPlaybackPausedEventArgs.EventName: { var args = new TrackPlaybackPausedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.TrackPlaybackResumedEventArgs.EventName: { var args = new TrackPlaybackResumedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.TrackPlaybackStartedEventArgs.EventName: { var args = new TrackPlaybackStartedEventArgs(); serializer.Populate(jReader, args); return args; } case EventArgs.VolumeChangedEventArgs.EventName: { var args = new VolumeChangedEventArgs(); serializer.Populate(jReader, args); return args; } default: { var args = new UnexpectedEventEventArgs(); serializer.Populate(jReader, args); return args; } } }
public void ApplicationLoadedEventHandler_IfValidPlaylistSessionDataExist_LoadsPlaylistSongsCorrectly() { // Arrange var playlistData = new PlaylistData { Songs = new[] { new PlaylistSongData { Id = "song 0" }, new PlaylistSongData { Id = "song 1" }, new PlaylistSongData { Id = "song 2" }, new PlaylistSongData { Id = "song 3" }, }, CurrentSongIndex = 1, }; var songIds = new[] { new ItemId("song 0"), new ItemId("song 1"), new ItemId("song 2"), new ItemId("song 3"), }; var songs = new[] { new SongModel { Id = new ItemId("song 0") }, new SongModel { Id = new ItemId("song 1") }, new SongModel { Id = new ItemId("song 2") }, new SongModel { Id = new ItemId("song 3") }, }; // ISongsService.GetSongs() does not guarantee songs order. var songsReturnedByService = new[] { songs[3], songs[2], songs[0], songs[1] }; var sessionServiceStub = new Mock <ISessionDataService>(); sessionServiceStub.Setup(x => x.GetData <PlaylistData>("SongPlaylistData", It.IsAny <CancellationToken>())).ReturnsAsync(playlistData); var songServiceStub = new Mock <ISongsService>(); songServiceStub.Setup(x => x.GetSongs(songIds, It.IsAny <CancellationToken>())).ReturnsAsync(songsReturnedByService); var mocker = new AutoMocker(); mocker.Use(sessionServiceStub); mocker.Use(songServiceStub); var target = mocker.CreateInstance <PersistentPlaylistViewModel>(); PlaylistLoadedEventArgs playlistLoadedEvent = null; Messenger.Default.Register <PlaylistLoadedEventArgs>(this, e => e.RegisterEvent(ref playlistLoadedEvent)); NoPlaylistLoadedEventArgs noPlaylistLoadedEvent = null; Messenger.Default.Register <NoPlaylistLoadedEventArgs>(this, e => e.RegisterEvent(ref noPlaylistLoadedEvent)); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act Messenger.Default.Send(new ApplicationLoadedEventArgs()); // Assert target.Songs.Should().BeEquivalentTo(songs, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(songs[1]); playlistLoadedEvent.VerifyPlaylistEvent(songs, 1); noPlaylistLoadedEvent.Should().BeNull(); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }
public void ApplicationLoadedEventHandler_IfSomeSongsAreDeleted_SkipsDeletedSongsFromLoading() { // Arrange var playlistData = new PlaylistData { Songs = new[] { new PlaylistSongData { Id = "active song 0" }, new PlaylistSongData { Id = "deleted song 1" }, new PlaylistSongData { Id = "active song 2" }, new PlaylistSongData { Id = "deleted song 3" }, }, // Current song index is set between deleted songs, so that we could test index adjustment. CurrentSongIndex = 2, }; var loadedSongs = new[] { new SongModel { Id = new ItemId("active song 2") }, new SongModel { // Song title for deleted song is logged differently depending on whether it has track number or not. // That's why first deleted song has track number and 2nd does not. Id = new ItemId("deleted song 1"), TrackNumber = 1, DeleteDate = new DateTime(2021, 07, 11), }, new SongModel { Id = new ItemId("active song 0") }, new SongModel { Id = new ItemId("deleted song 3"), TrackNumber = null, DeleteDate = new DateTime(2021, 07, 11), }, }; var sessionServiceStub = new Mock <ISessionDataService>(); sessionServiceStub.Setup(x => x.GetData <PlaylistData>("SongPlaylistData", It.IsAny <CancellationToken>())).ReturnsAsync(playlistData); var songServiceStub = new Mock <ISongsService>(); songServiceStub.Setup(x => x.GetSongs(It.IsAny <IEnumerable <ItemId> >(), It.IsAny <CancellationToken>())).ReturnsAsync(loadedSongs); var mocker = new AutoMocker(); mocker.Use(sessionServiceStub); mocker.Use(songServiceStub); var target = mocker.CreateInstance <PersistentPlaylistViewModel>(); PlaylistLoadedEventArgs playlistLoadedEvent = null; Messenger.Default.Register <PlaylistLoadedEventArgs>(this, e => e.RegisterEvent(ref playlistLoadedEvent)); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act Messenger.Default.Send(new ApplicationLoadedEventArgs()); // Assert var expectedSongs = new[] { loadedSongs[2], loadedSongs[0], }; target.Songs.Should().BeEquivalentTo(expectedSongs, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(expectedSongs[1]); playlistLoadedEvent.VerifyPlaylistEvent(expectedSongs, 1); }
public void ApplicationLoadedEventHandler_IfCurrentSongInPlaylistDataIsNotSet_LoadsPlaylistCorrectly() { // Arrange var playlistData = new PlaylistData { Songs = new[] { new PlaylistSongData { Id = "song 0" }, new PlaylistSongData { Id = "song 1" }, }, CurrentSongIndex = null, }; var songs = new[] { new SongModel { Id = new ItemId("song 0") }, new SongModel { Id = new ItemId("song 1") }, }; var sessionServiceStub = new Mock <ISessionDataService>(); sessionServiceStub.Setup(x => x.GetData <PlaylistData>("SongPlaylistData", It.IsAny <CancellationToken>())).ReturnsAsync(playlistData); var songServiceStub = new Mock <ISongsService>(); songServiceStub.Setup(x => x.GetSongs(It.IsAny <IEnumerable <ItemId> >(), It.IsAny <CancellationToken>())).ReturnsAsync(songs); var mocker = new AutoMocker(); mocker.Use(sessionServiceStub); mocker.Use(songServiceStub); var target = mocker.CreateInstance <PersistentPlaylistViewModel>(); PlaylistLoadedEventArgs playlistLoadedEvent = null; Messenger.Default.Register <PlaylistLoadedEventArgs>(this, e => e.RegisterEvent(ref playlistLoadedEvent)); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); // Act Messenger.Default.Send(new ApplicationLoadedEventArgs()); // Assert target.Songs.Should().BeEquivalentTo(songs, x => x.WithStrictOrdering()); target.CurrentSong.Should().BeNull(); playlistLoadedEvent.VerifyPlaylistEvent(songs, null); }
public async Task AddSongsNext_ForNonEmptyPlaylistWhenCurrentSongIsSet_DoesNotChangeCurrentSong() { // Arrange var songs = new[] { new SongModel { Id = new ItemId("0") }, new SongModel { Id = new ItemId("1") }, new SongModel { Id = new ItemId("2") }, }; var songsToAdd = new[] { new SongModel { Id = new ItemId("3") }, new SongModel { Id = new ItemId("4") }, }; var mocker = new AutoMocker(); var target = mocker.CreateInstance <PlaylistViewModel>(); await target.SetPlaylistSongs(songs, CancellationToken.None); await target.SwitchToNextSong(CancellationToken.None); target.CurrentSong.Should().Be(songs[1]); PlaylistChangedEventArgs playlistChangedEventArgs = null; Messenger.Default.Register <PlaylistChangedEventArgs>(this, e => e.RegisterEvent(ref playlistChangedEventArgs)); var propertyChangedEvents = new List <PropertyChangedEventArgs>(); target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e); // Act await target.AddSongsNext(songsToAdd, CancellationToken.None); // Assert var expectedSongs = new[] { songs[0], songs[1], songsToAdd[0], songsToAdd[1], songs[2], }; target.Songs.Should().BeEquivalentTo(expectedSongs, x => x.WithStrictOrdering()); target.CurrentSong.Should().Be(songs[1]); playlistChangedEventArgs.VerifyPlaylistEvent(expectedSongs, 1); propertyChangedEvents.VerifySongListPropertyChangedEvents(); }