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);
        }
Exemplo n.º 2
0
 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");
        }
Exemplo n.º 6
0
 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();
        }
Exemplo n.º 8
0
        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();
        }
Exemplo n.º 12
0
        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();
        }
Exemplo n.º 13
0
        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();
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        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;
                    }
            }
        }
Exemplo n.º 22
0
        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();
        }
Exemplo n.º 23
0
        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);
        }
Exemplo n.º 24
0
        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();
        }