public async Task<Series> RetrieveFeed(string feedAddr)
        {
            string content = string.Empty;
            using (HttpClient client = new HttpClient())
                content = await client.GetStringAsync(feedAddr);

            var feed = XElement.Parse(content);
            var id = feed.Element(ChannelElementName).Element(LinkElementName).Value;
            var title = feed.Element(ChannelElementName).Element(TitleElementName).Value;
            var imagePath = feed.Element(ChannelElementName).Element(ImageXName).Attribute(HrefElementName).Value;
            var imageElement = feed.Element(ChannelElementName).Element(ImageElementName);
            if (imageElement != null)
                imagePath = imageElement.Element(UrlElementName).Value;
            var description = feed.Element(ChannelElementName).Element(DescriptionElementName).Value;
            var rVal = new Series
                {
                    Id = id,
                    Title = title,
                    ImagePath = imagePath,
                    Description = description
                };
            var items = feed.Element(ChannelElementName).Elements(ItemElementName);

            await rVal.SetEpisodes(Task.Run(() => ParseEpisodes(items)));
            return rVal;
        }
        public async Task FastDownloadWorks()
        {
            var downloader = new FeedDownloaderStub();
            var series = new Series();
            await series.SetEpisodes(Task.FromResult(new List<Episode>().AsEnumerable()));
            downloader.SetResult(Task.FromResult(series));
            var underTest = new PodcastCollection(downloader);

            Assert.AreEqual(7, underTest.AllGroups.Count);
        }
        public async Task ExcpetionsCreateEmptySeries()
        {
            var downloader = new FeedDownloaderStub();
            var series = new Series();

            var episodeTCS = new TaskCompletionSource<IEnumerable<Episode>>();
            var downloadTCS = new TaskCompletionSource<Series>();

            var parseTask = series.SetEpisodes(episodeTCS.Task);
            downloader.SetResult(downloadTCS.Task);

            var underTest = new PodcastCollection(downloader);

            episodeTCS.TrySetResult(new List<Episode>().AsEnumerable());
            downloadTCS.TrySetException(new NullReferenceException());
            await parseTask;

            Assert.AreEqual(0, underTest.AllGroups.Count);
        }
        public async Task SlowDownloadWorks()
        {
            var downloader = new FeedDownloaderStub();
            var series = new Series();

            var episodeTCS = new TaskCompletionSource<IEnumerable<Episode>>();
            var downloadTCS = new TaskCompletionSource<Series>();

            var parseTask = series.SetEpisodes(episodeTCS.Task);
            downloader.SetResult(downloadTCS.Task);

            var underTest = new PodcastCollection(downloader);

            episodeTCS.TrySetResult(new List<Episode>().AsEnumerable());
            downloadTCS.TrySetResult(series);
            await parseTask;

            Assert.AreEqual(7, underTest.AllGroups.Count);
        }