public SamplePlaylistViewModel() : base(new MockPlaylistView())
 {
     var musicFiles = new[] 
     {
         new SampleMusicFile(new MusicMetadata(new TimeSpan(0, 3, 45), 320000)
         {
             Artists = new[] { @"Culture Beat" },
             Title = @"Serenity (Epilog)",
         }, @"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity"),
         new SampleMusicFile(new MusicMetadata(new TimeSpan(0, 2, 2), 320000)
         {
             Artists = new[] { "First artist", "Second artist" },
             Title = "This track has a very long title. Let's see how the UI handles this.",
         }, ""),
         new SampleMusicFile(new MusicMetadata(new TimeSpan(1, 33, 0), 320000)
         {
             Artists = new string[0],
             Title = "",
         }, @"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity"),
         new MusicFile(x => { throw new InvalidOperationException("Sample exception."); }, @"C:\corruptfile.mp3")
     };
     var playlistManager = new PlaylistManager();
     playlistManager.AddItems(musicFiles.Select(x => new PlaylistItem(x)));
     PlaylistManager = playlistManager;
     playlistManager.CurrentItem = playlistManager.Items.First();
 }
        public void PreviousAndNextDuringAddRemoveItems()
        {
            var manager = new PlaylistManager();
            manager.AddAndReplaceItems(threeItems);
            
            manager.CurrentItem = threeItems[0];
            manager.NextItem();

            Assert.IsTrue(manager.CanNextItem);
            AssertHelper.PropertyChangedEvent(manager, x => x.CanNextItem, () => manager.RemoveItems(new[] { threeItems[2] }));
            Assert.IsFalse(manager.CanNextItem);
            AssertHelper.PropertyChangedEvent(manager, x => x.CanNextItem, () => manager.AddItems(new[] { threeItems[2] }));
            Assert.IsTrue(manager.CanNextItem);

            manager.NextItem();
            Assert.AreEqual(threeItems[2], manager.CurrentItem);
            manager.PreviousItem();
            Assert.AreEqual(threeItems[1], manager.CurrentItem);

            Assert.IsTrue(manager.CanPreviousItem);
            AssertHelper.PropertyChangedEvent(manager, x => x.CanPreviousItem, () => manager.RemoveItems(new[] { threeItems[0] }));
            Assert.IsFalse(manager.CanPreviousItem);
        }
        public void TotalDurationWithMetadataLoading()
        {
            var manager = new PlaylistManager();
            Assert.AreEqual(TimeSpan.Zero, manager.TotalDuration);
            var firstFile = new MockMusicFile(new MusicMetadata(TimeSpan.FromSeconds(10), 0), "");
            manager.AddAndReplaceItems(new[] { new PlaylistItem(firstFile) });
            
            var secondMetadata = new MusicMetadata(TimeSpan.FromSeconds(20), 0);
            var secondFile = new MusicFile(async x =>
            {
                await Task.Delay(10);
                return secondMetadata;
            }, "");

            manager.AddItems(new[] { new PlaylistItem(secondFile) });
            Assert.IsTrue(manager.IsTotalDurationEstimated);
            Assert.AreEqual(TimeSpan.FromSeconds(20), manager.TotalDuration);
            AssertHelper.PropertyChangedEvent(manager, x => x.TotalDuration, () => secondFile.GetMetadataAsync().GetResult());
            Assert.IsFalse(manager.IsTotalDurationEstimated);
            Assert.AreEqual(TimeSpan.FromSeconds(30), manager.TotalDuration);

            var thirdFile = new MockMusicFile(new MusicMetadata(TimeSpan.FromSeconds(30), 0), "");
            AssertHelper.PropertyChangedEvent(manager, x => x.TotalDuration, () => manager.AddItems(new[] { new PlaylistItem(thirdFile) }));
            Assert.AreEqual(TimeSpan.FromSeconds(60), manager.TotalDuration);
        }
        public void AddRemoveAndMoveItems()
        {
            var manager = new PlaylistManager();
            Assert.AreEqual(0, manager.Items.Count);

            manager.AddItems(threeItems);
            Assert.AreEqual(3, manager.Items.Count);

            manager.RemoveItems(new[] { threeItems[2] });
            Assert.AreEqual(2, manager.Items.Count);

            manager.AddAndReplaceItems(threeItems);
            Assert.AreEqual(3, manager.Items.Count);

            manager.MoveItems(2, new[] { manager.Items[0] });
            Assert.IsTrue(manager.Items.SequenceEqual(new[] { threeItems[1], threeItems[2], threeItems[0] }));
        }