public void PlayTestWithShadowsPlaybackStopped()
        {
            var helper = new PlayTestHelper();

            helper.Manager.PlaybackStopped += (sender, args) => {
                if (args.NextShadow == null)
                {
                    return;
                }
                args.Item       = args.NextShadow;
                args.NextShadow = null;
            };

            // queue with one item, add shadow
            helper.Enqueue(QueueItems[0]);
            helper.Manager.NextSongShadow = QueueItems[1];
            helper.Play(QueueItems[0], 0);

            // first song is playing, check that the shadow is preparing
            helper.CheckIsPreparing(QueueItems[1]);
            helper.InvokeSongEnd();

            // item gets filled in by event handler, is added to queue and plays now
            helper.Play(QueueItems[1], 1);
            helper.InvokeSongEnd();

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(0);
        }
        public void PlayTestMultipleSongsWithFailures()
        {
            var helper = new PlayTestHelper();

            foreach (var item in QueueItems)
            {
                helper.Enqueue(item);
            }

            // Let a few songs fail
            for (var i = 0; i < Iterations; ++i)
            {
                var queueItem = QueueItems[i];

                if (ShouldFailSong(i))
                {
                    helper.FailLoad(queueItem);
                    continue;
                }

                helper.Play(queueItem, i);
                helper.InvokeSongEnd();
            }

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(0);
        }
        public void PlayTestWithShadows()
        {
            var helper = new PlayTestHelper();

            // queue with one item, add shadow
            helper.Enqueue(QueueItems[0]);
            helper.Manager.NextSongShadow = QueueItems[1];
            helper.Play(QueueItems[0], 0);

            // first song is playing, check that the shadow is preparing
            helper.CheckIsPreparing(QueueItems[1]);
            helper.Enqueue(QueueItems[2]);

            // a new song is enqueued, check that it is preparing
            helper.CheckIsPreparing(QueueItems[2]);
            helper.CheckTasksCanceled(1);

            // next song index is valid
            helper.CheckNextSongIndex(1);

            helper.InvokeSongEnd();
            helper.Play(QueueItems[2], 1);

            // shadow is kept
            helper.CheckIsPreparing(QueueItems[1]);

            // next song index is still valid
            helper.CheckNextSongIndex(2);

            helper.InvokeSongEnd();
            helper.AssertAtEndOfQueue();

            // Add the shadow song when not playing and at end of queue
            helper.Enqueue(QueueItems[1]);
            helper.Play(QueueItems[1], 2);

            // shadow gets cleared after play
            Assert.AreSame(helper.Manager.NextSongShadow, null);
            helper.CheckIsPreparing(null);
            helper.CheckNextSongIndex(3);

            helper.InvokeSongEnd();

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(1);
        }
        public void SimplePlayTest()
        {
            var helper = new PlayTestHelper();

            var queueItem = QueueItems[0];

            helper.Enqueue(queueItem);
            helper.CheckIsPreparing(queueItem);
            helper.Play(queueItem, 0);
            helper.InvokeSongEnd();

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(0);
        }
        public void PlayTestMultipleSongsWithFailuresLoadBeforeSongEnd()
        {
            var helper = new PlayTestHelper();

            foreach (var item in QueueItems)
            {
                helper.Enqueue(item);
            }

            if (ShouldFailSong(0))
            {
                helper.FailLoad(QueueItems[0]);
            }

            // Let a few songs fail
            // current song is already prepared
            for (var i = 0; i < Iterations; ++i)
            {
                var queueItem = QueueItems[i];

                if (ShouldFailSong(i))
                {
                    continue;
                }

                helper.Play(queueItem, i);

                for (var j = i + 1; j < Iterations; ++j)
                {
                    if (ShouldFailSong(j))
                    {
                        helper.FailLoad(QueueItems[j]);
                    }
                    else
                    {
                        break;
                    }
                }

                helper.InvokeSongEnd();
            }

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(0);
        }
        public void PlayTestMultipleSongs()
        {
            var helper = new PlayTestHelper();

            foreach (var item in QueueItems)
            {
                helper.Enqueue(item);
            }

            for (var i = 0; i < Iterations; ++i)
            {
                var queueItem = QueueItems[i];
                helper.Play(queueItem, i);
                helper.InvokeSongEnd();
            }

            helper.AssertAtEndOfPlay();
            helper.CheckTasksCanceled(0);
        }
        public void ClearTest()
        {
            {
                var helper = new PlayTestHelper();

                helper.Enqueue(QueueItems[0]);
                helper.Clear();
            }

            {
                var helper = new PlayTestHelper();
                foreach (var item in QueueItems)
                {
                    helper.Enqueue(item);
                }

                helper.Play(QueueItems[0], 0);
                helper.InvokeSongEnd();
                helper.Clear();
            }

            {
                var helper = new PlayTestHelper();
                foreach (var item in QueueItems)
                {
                    helper.Enqueue(item);
                }

                helper.Play(QueueItems[0], 0);
                helper.Clear();
            }

            {
                var helper = new PlayTestHelper();
                helper.Enqueue(QueueItems[0]);
                helper.Manager.NextSongShadow = QueueItems[1];
                helper.Play(QueueItems[0], 0);

                helper.Clear();
            }
        }