public async void TestNext(NextCommandType type)
        {
            var playList = _defaultPlayList.DeepClone();
            string reportType = GetReportTypeStringByNextCommandType(type);

            var serverConnectionMock = new Mock<IServerConnection>();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist")
                                                                  && (u.GetQueries().Contains(new KeyValuePair<string, string>("type", "n"))
                                                                      || u.GetQueries().Contains(new KeyValuePair<string, string>("type", reportType)))
                                                                  && !u.GetQueries().ContainsKey("start")),
                It.IsAny<Action<HttpWebRequest>>())).Returns(() => Task.FromResult(playList.ToString())).Callback(
                    () =>
                    {
                        if (type == NextCommandType.CurrentSongEnded)
                        {
                            playList["song"] = new JArray();
                        }
                        else
                        {
                            var first = playList["song"][0];
                            first.Remove();
                            playList["song"].Last.AddAfterSelf(first);
                        }
                    }).Verifiable();
            var session = new Session(serverConnectionMock.Object);
            var player = new Player(session);
            await player.ChangeChannel(new Channel(0));

            var originalSong = player.CurrentSong;
            for (var i = 0; i < 5; ++i)
            {
                await player.Next(type);
                var newSong = player.CurrentSong;
                Assert.AreNotEqual(newSong, originalSong);
                originalSong = newSong;
            }
            serverConnectionMock.Verify();
        }
        public async void TestNoAvailableSongs_Next(NextCommandType type)
        {
            var emptyPlayList = _defaultPlayList.DeepClone();
            emptyPlayList["song"] = new JArray();
            var serverConnectionMock = new Mock<IServerConnection>();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "n"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(Resource.PlayList).Verifiable();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", GetReportTypeStringByNextCommandType(type)))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(emptyPlayList.ToString()).Verifiable();

            var player = new Player(new Session(serverConnectionMock.Object));
            await player.ChangeChannel(new Channel(0));
            await AssertEx.ThrowsAsync<NoAvailableSongsException>(async () => await player.Next(type));
            serverConnectionMock.Verify();
        }
 public async void TestChannelNotSelectedException()
 {
     var serverConnectionMock = new Mock<IServerConnection>();
     var session = new Session(serverConnectionMock.Object);
     var player = new Player(session);
     await AssertEx.ThrowsAsync<ChannelNotSelectedException>(async () => await player.Next(NextCommandType.SkipCurrentSong));
 }
        public async void TestSongNotSelectedException()
        {
            var playList = _defaultPlayList.DeepClone();
            var emptyPlayList = _defaultPlayList.DeepClone();
            emptyPlayList["song"] = new JArray();
            var serverConnectionMock = new Mock<IServerConnection>();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "n"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(playList.ToString()).Verifiable();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "p"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(playList.ToString()).Verifiable();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "s"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(emptyPlayList.ToString()).Verifiable();

            var session = new Session(serverConnectionMock.Object);
            var player = new Player(session);
            await player.ChangeChannel(new Channel(0));
            await AssertEx.ThrowsAsync<NoAvailableSongsException>(async () => await player.Next(NextCommandType.SkipCurrentSong));
            Assert.IsNotNull(player.CurrentChannel);
            Assert.IsNull(player.CurrentSong);
            await AssertEx.ThrowsAsync<SongNotSelectedException>(async () => await player.SetRedHeart(true));
        }
        public async void TestSongEnded()
        {
            var playList = _defaultPlayList.DeepClone();
            var emptyPlayList = _defaultPlayList.DeepClone();
            emptyPlayList["song"] = new JArray();
            var serverConnectionMock = new Mock<IServerConnection>();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "n"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(playList.ToString()).Verifiable();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "p"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(playList.ToString()).Verifiable();
            serverConnectionMock.Setup(s => s.Get(It.Is<Uri>(u => u.AbsolutePath.EndsWith("playlist") && u.GetQueries().Contains(new KeyValuePair<string, string>("type", "e"))),
                It.IsAny<Action<HttpWebRequest>>())).ReturnsAsync(emptyPlayList.ToString()).Verifiable();

            var session = new Session(serverConnectionMock.Object);
            var player = new Player(session);
            await player.ChangeChannel(new Channel(0));
            var songCount = playList["song"].Count();
            for (var i = 0; i < songCount*2; ++i)
            {
                await player.Next(NextCommandType.CurrentSongEnded);
            }
            serverConnectionMock.Verify();
        }