Example #1
0
        public async Task TestRss10ParseFullSample_Async()
        {
            var feed = (Rss10Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss10FeedWebResourceSample.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("XML.com", feed.Title);
            Eq("http://xml.com/pub", feed.Link);
            Eq("\n      XML.com features a rich mix of information and services\n      for the XML community.\n    ", feed.Description);
            var image = (Rss10FeedImage)feed.Image;

            Eq("http://xml.com/universal/images/xml_tiny.gif", image.About);
            Eq("XML.com", image.Title);
            Eq("http://www.xml.com", image.Link);
            Eq("http://xml.com/universal/images/xml_tiny.gif", image.Url);
            Eq("Search XML.com", feed.TextInput.Title);
            Eq("Search XML.com's XML collection", feed.TextInput.Description);
            Eq("s", feed.TextInput.Name);
            Eq("http://search.xml.com", ((Rss10FeedTextInput)feed.TextInput).About);
            Eq("http://search.xml.com", feed.TextInput.Link);

            var item = (Rss10FeedItem)feed.Items.Last();

            Eq("http://xml.com/pub/2000/08/09/rdfdb/index.html", item.About);
            Eq("Putting RDF to Work", item.Title);
            Eq("http://xml.com/pub/2000/08/09/rdfdb/index.html", item.Link);
            Eq(186, item.Description.Length);
        }
Example #2
0
        public async Task TestAllFilesForException_Async()
        {
            var linkless = new System.Collections.Generic.List <string>()
            {
                "AtomBattleNet.xml"
            };

            var files = System.IO.Directory.EnumerateFiles("Feeds");

            foreach (var file in files)
            {
                var feed = await FeedReader.ReadFromFileAsync(file).ConfigureAwait(false);

                if (feed != null)
                {
                    string filename = System.IO.Path.GetFileName(file);
                    if (!linkless.Contains(filename))
                    {
                        Assert.IsTrue(!string.IsNullOrEmpty(feed.Link));
                    }

                    TestItunesParsingForException(feed);
                }
            }
        }
Example #3
0
        public async Task TestRss20ParseMoscowTimes_Async()
        {
            var feed = (Rss20Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss20MoscowTimes.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("The Moscow Times - News, Business, Culture & Multimedia from Russia", feed.Title);
            Eq("https://themoscowtimes.com/", feed.Link);
            Eq("The Moscow Times offers everything you need to know about Russia: Breaking news, top stories, business, analysis, opinion, multimedia, upcoming cultural events", feed.Description);
            Eq("en-us", feed.Language);
            Eq("Mon, 23 Jan 2017 16:45:02 +0000", feed.LastBuildDateString);
            Eq("600", feed.TTL);

            var item = (Rss20FeedItem)feed.Items.First();

            Eq("Russian State TV Praises Trump for Avoiding ‘Democracy’ in Inauguration Speech", item.Title);
            Eq("https://themoscowtimes.com/articles/russian-state-tv-praises-trump-for-avoiding-democracy-in-inauguration-speech-56901", item.Link);
            Eq("Though he welcomed the end of Obama’s presidency as the start of a bright new era, the Kremlin’s “chief propagandist” quickly found himself struggling to find convincing scapegoats for the world’s problems this week.", item.Description);
            Eq("Mon, 23 Jan 2017 16:45:02 +0000", item.PublishingDateString);
            Eq("https://themoscowtimes.com/articles/russian-state-tv-praises-trump-for-avoiding-democracy-in-inauguration-speech-56901", item.Guid);

            item = (Rss20FeedItem)feed.Items.Last();
            Eq("Don’t Say It", item.Title);
            Eq("https://themoscowtimes.com/articles/dont-say-it-56774", item.Link);
            Eq("They say “sex sells,” but don't go peddling it near dinner tables in Russia, where families in an ostensibly conservative society say the subject is too taboo to discuss at home.", item.Description);
            Eq("Tue, 10 Jan 2017 19:58:13 +0000", item.PublishingDateString);
            Eq("https://themoscowtimes.com/articles/dont-say-it-56774", item.Guid);
        }
Example #4
0
        public async Task TestRss20ParseCodeHollow_Async()
        {
            var feed = (Rss20Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss20CodeHollowCom.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("codehollow", feed.Title);
            Eq("https://codehollow.com", feed.Link);
            Eq("Azure, software engineering/architecture, Scrum, SharePoint, VSTS/TFS, .NET and other funny things", feed.Description);
            Eq("Fri, 23 Dec 2016 09:01:55 +0000", feed.LastBuildDateString);
            Eq(new DateTime(2016, 12, 23, 09, 01, 55), feed.LastBuildDate);
            Eq("en-US", feed.Language);
            Eq("hourly", feed.Sy.UpdatePeriod);
            Eq("1", feed.Sy.UpdateFrequency);
            Eq("https://wordpress.org/?v=4.7", feed.Generator);

            var item = (Rss20FeedItem)feed.Items.First();

            Eq("Export Azure RateCard data to CSV with C# and Billing API", item.Title);
            Eq("https://codehollow.com/2016/12/export-azure-ratecard-data-csv-csharp-billing-api/", item.Link);
            Eq("https://codehollow.com/2016/12/export-azure-ratecard-data-csv-csharp-billing-api/#respond", item.Comments);
            Eq("Thu, 22 Dec 2016 07:00:28 +0000", item.PublishingDateString);
            Eq(new DateTime(2016, 12, 22, 7, 0, 28), item.PublishingDate);
            Eq("Armin Reiter", item.DC.Creator);
            Eq(4, item.Categories.Count);
            Assert.IsTrue(item.Categories.Contains("BillingAPI"));
            Eq("https://codehollow.com/?p=749", item.Guid);
            Assert.IsTrue(item.Description.StartsWith("<p>The Azure Billing API allows to programmatically read Azure"));
            Assert.IsTrue(item.Content.Contains("<add key=\"Tenant\" "));
        }
Example #5
0
        public async Task TestRss092ParseFullSample_Async()
        {
            var feed = (Rss092Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss092FullSample.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("Dave Winer: Grateful Dead", feed.Title);
            Eq("http://www.scripting.com/blog/categories/gratefulDead.html", feed.Link);
            Eq("A high-fidelity Grateful Dead song every day. This is where we're experimenting with enclosures on RSS news items that download when you're not using your computer. If it works (it will) it will be the end of the Click-And-Wait multimedia experience on the Internet. ", feed.Description);
            Eq("Fri, 13 Apr 2001 19:23:02 GMT", feed.LastBuildDateString);
            Eq("http://backend.userland.com/rss092", feed.Docs);
            Eq("[email protected] (Dave Winer)", feed.ManagingEditor);
            Eq("[email protected] (Dave Winer)", feed.WebMaster);
            Eq("data.ourfavoritesongs.com", feed.Cloud.Domain);
            Eq("80", feed.Cloud.Port);
            Eq("/RPC2", feed.Cloud.Path);
            Eq("ourFavoriteSongs.rssPleaseNotify", feed.Cloud.RegisterProcedure);
            Eq("xml-rpc", feed.Cloud.Protocol);

            Eq(22, feed.Items.Count);
            var item = (Rss092FeedItem)feed.Items.ElementAt(20);

            Eq("A touch of gray, kinda suits you anyway..", item.Description);
            Eq("http://www.scripting.com/mp3s/touchOfGrey.mp3", item.Enclosure.Url);
            Eq(5588242, item.Enclosure.Length);
            Eq("audio/mpeg", item.Enclosure.MediaType);

            var secondItem = (Rss092FeedItem)feed.Items.ElementAt(1);

            Eq("http://scriptingnews.userland.com/xml/scriptingNews2.xml", secondItem.Source.Url);
            Eq("Scripting News", secondItem.Source.Value);
        }
Example #6
0
        public async Task TestRss20ParseWebResourceSampleFull_Async()
        {
            var feed = (Rss20Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss20FeedWebResourceSample.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("Scripting News", feed.Title);
            Eq("http://www.scripting.com/", feed.Link);
            Eq("A weblog about scripting and stuff like that.", feed.Description);
            Eq("en-us", feed.Language);
            Eq("Copyright 1997-2002 Dave Winer", feed.Copyright);
            Eq("Mon, 30 Sep 2002 11:00:00 GMT", feed.LastBuildDateString);
            Eq("http://backend.userland.com/rss", feed.Docs);
            Eq("Radio UserLand v8.0.5", feed.Generator);
            Eq("1765", feed.Categories.First());
            Eq("*****@*****.**", feed.ManagingEditor);
            Eq("*****@*****.**", feed.WebMaster);
            Eq("40", feed.TTL);
            Eq(9, feed.Items.Count);

            var item = (Rss20FeedItem)feed.Items.Last();

            Eq("Really early morning no-coffee notes", item.Title);
            Eq("http://scriptingnews.userland.com/backissues/2002/09/29#reallyEarlyMorningNocoffeeNotes", item.Link);
            Assert.IsTrue(item.Description.Contains("<p>One of the lessons I've learned"));
            Eq("Sun, 29 Sep 2002 11:13:10 GMT", item.PublishingDateString);
            Eq(new DateTime(2002, 09, 29, 11, 13, 10), item.PublishingDate);
            Eq("http://scriptingnews.userland.com/backissues/2002/09/29#reallyEarlyMorningNocoffeeNotes", item.Guid);
        }
Example #7
0
        public async Task TestRss20CityDogKyrillicNoEncodingDefined_Async()
        {
            var feed = await FeedReader.ReadFromFileAsync("Feeds/Rss20CityDog.xml").ConfigureAwait(false);

            Eq("Новости - citydog.by", feed.Title);
            Eq("Последние обновления - citydog.by", feed.Description);

            var item = feed.Items.First();

            Eq("Группа «Серебряная свадьба» ушла в бессрочный отпуск", item.Title);
            Eq("http://citydog.by/post/zaden-serebrianaya-svadba-v-otpuske/", item.Id);
        }
Example #8
0
        public async Task TestAtomParseAdobe_Async()
        {
            var feed = (AtomFeed)(await FeedReader.ReadFromFileAsync("Feeds/AtomAdobe.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("Adobe Blog", feed.Title);
            Eq(null, feed.Icon);
            Eq("https://blog.adobe.com/", feed.Link);
            Eq("2021-07-19T00:00:00.000Z", feed.UpdatedDateString);
            Eq("https://blog.adobe.com/", feed.Id);

            var item = (AtomFeedItem)feed.Items.First();

            Eq(null, item.Link); // The post href is store in the id element
        }
Example #9
0
        public async Task TestAllFilesForException_Async()
        {
            var files = System.IO.Directory.EnumerateFiles("Feeds");

            foreach (var file in files)
            {
                var feed = await FeedReader.ReadFromFileAsync(file).ConfigureAwait(false);

                if (feed != null)
                {
                    Assert.IsTrue(!string.IsNullOrEmpty(feed.Link));
                    TestItunesParsingForException(feed);
                }
            }
        }
Example #10
0
        public async Task TestRss20ParseSwedishFeedWithIso8859_1_Async()
        {
            var feed = (Rss20Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss20ISO88591Intranet30.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("intranet30", feed.Title);
            Eq("http://www.retriever-info.com", feed.Link);
            Eq("RSS 2.0 News feed from Retriever Norge AS", feed.Description);

            var item = (Rss20FeedItem)feed.Items.First();

            Eq("SVART MÅNAD - DÖDSOLYCKA i Vetlanda", item.Title);
            Eq("https://www.retriever-info.com/go/?a=30338&d=00201120180819281555686&p=200108&s=2011&sa=2016177&u=http%3A%2F%2Fwww.hoglandsnytt.se%2Fsvart-manad-dodsolycka-i-vetlanda%2F&x=33d88e677ce6481d9882de22c76e4234", item.Link);
            Eq("Under juli 2018 omkom 39 personer och 1 521 skadades i vägtrafiken. Det visar de preliminära uppgifter som inkommit till Transportstyrelsen fram till den 15 augusti 2018. Det är åtta fler omkomna jämfört med juli månad 2017.", item.Description);
            Eq("Sun, 19 Aug 2018 07:14:00 GMT", item.PublishingDateString);
            Eq("00201120180819281555686", item.Guid);
            Eq("Höglandsnytt", item.Author);
        }
Example #11
0
        public async Task TestAtomYouTubeInvestmentPunk_Async()
        {
            var feed = (AtomFeed)(await FeedReader.ReadFromFileAsync("Feeds/AtomYoutubeInvestmentPunk.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("http://www.youtube.com/feeds/videos.xml?channel_id=UCmEN5ZnsHUXIxgpLitRTmWw", feed.Links.First().Href);
            Eq("yt:channel:UCmEN5ZnsHUXIxgpLitRTmWw", feed.Id);
            Eq("Investment Punk Academy by Gerald Hörhan", feed.Title);
            Eq("http://www.youtube.com/channel/UCmEN5ZnsHUXIxgpLitRTmWw", feed.Links.ElementAt(1).Href);
            Eq("Investment Punk Academy by Gerald Hörhan", feed.Author.Name);
            Eq("http://www.youtube.com/channel/UCmEN5ZnsHUXIxgpLitRTmWw", feed.Author.Uri);
            var item = (AtomFeedItem)feed.Items.First();

            Eq("yt:video:AFA8ZtMwrvc", item.Id);
            Eq("Zukunft von Vertretern I Kernfusion I Musikgeschäft #ASKTHEPUNK 71", item.Title);
            Eq("alternate", item.Links.First().Relation);
            Eq("2017-01-23T18:14:49+00:00", item.UpdatedDateString);
            Eq("2017-01-20T16:00:00+00:00", item.PublishedDateString);
        }
Example #12
0
        public async Task TestRss091ParseStadtFWeiz_Async()
        {
            var feed = (Rss091Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss091Stadtfeuerwehr.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("Stadtfeuerwehr Weiz - Einsätze", feed.Title);
            Eq("http://www.stadtfeuerwehr-weiz.at", feed.Link);
            Eq("Die letzten 15 Einsätze der Stadtfeuerwehr Weiz.", feed.Description);
            Eq("de-de", feed.Language);
            Eq("Stadtfeuerwehr Weiz / Markus Horwath", feed.Copyright);

            var item = (Rss091FeedItem)feed.Items.First();

            Eq(@"[19.08.2018 - 07:08 Uhr] Brandmeldeanlagenalarm", item.Title.Trim());
            Assert.IsTrue(item.Description.Contains("Weitere Informationen"));
            Eq("http://www.stadtfeuerwehr-weiz.at/einsaetze/einsatz-detail/5220/", item.Link);
            Eq("Sun, 19 Aug 2018 07:08:00 +0100", item.PublishingDateString);
            Eq(new DateTime(2018, 8, 19, 6, 08, 0), item.PublishingDate);

            Eq(15, feed.Items.Count);
        }
Example #13
0
        public async Task TestRss091ParseFullSample_Async()
        {
            var feed = (Rss091Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss091FullSample.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("Copyright 1997-1999 UserLand Software, Inc.", feed.Copyright);
            Eq("Thu, 08 Jul 1999 07:00:00 GMT", feed.PublishingDateString);
            Eq("Thu, 08 Jul 1999 16:20:26 GMT", feed.LastBuildDateString);
            Eq("http://my.userland.com/stories/storyReader$11", feed.Docs);
            Eq("News and commentary from the cross-platform scripting community.", feed.Description);
            Eq("http://www.scripting.com/", feed.Link);
            Eq("Scripting News", feed.Title);
            Eq("http://www.scripting.com/", feed.Image.Link);
            Eq("Scripting News", feed.Image.Title);
            Eq("http://www.scripting.com/gifs/tinyScriptingNews.gif", feed.Image.Url);
            Eq(40, ((Rss091FeedImage)feed.Image).Height);
            Eq(78, ((Rss091FeedImage)feed.Image).Width);
            Eq("What is this used for?", ((Rss091FeedImage)feed.Image).Description);
            Eq("[email protected] (Dave Winer)", feed.ManagingEditor);
            Eq("[email protected] (Dave Winer)", feed.WebMaster);
            Eq("en-us", feed.Language);
            Assert.IsTrue(feed.SkipHours.Contains("6"));
            Assert.IsTrue(feed.SkipHours.Contains("7"));
            Assert.IsTrue(feed.SkipHours.Contains("8"));
            Assert.IsTrue(feed.SkipHours.Contains("9"));
            Assert.IsTrue(feed.SkipHours.Contains("10"));
            Assert.IsTrue(feed.SkipHours.Contains("11"));
            Assert.IsTrue(feed.SkipDays.Contains("Sunday"));
            Eq("(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))", feed.Rating);

            Eq(1, feed.Items.Count);
            var item = (Rss091FeedItem)feed.Items.First();

            Eq("stuff", item.Title);
            Eq("http://bar", item.Link);
            Eq("This is an article about some stuff", item.Description);

            Eq("Search Now!", feed.TextInput.Title);
            Eq("Enter your search terms", feed.TextInput.Description);
            Eq("find", feed.TextInput.Name);
            Eq("http://my.site.com/search.cgi", feed.TextInput.Link);
        }
Example #14
0
        public async Task TestRss20ParseContentWindGerman_Async()
        {
            var feed = (Rss20Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss20ContentWindCom.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("ContentWind", feed.Title);
            Eq("http://content-wind.com", feed.Link);
            Eq("Do, 22 Dez 2016 17:36:00 +0000", feed.LastBuildDateString);
            Eq(new DateTime(2016, 12, 22, 17, 36, 00), feed.LastBuildDate);
            Eq("de-DE", feed.Language);
            Eq("hourly", feed.Sy.UpdatePeriod);
            Eq("1", feed.Sy.UpdateFrequency);
            Eq("https://wordpress.org/?v=4.7", feed.Generator);

            var item = (Rss20FeedItem)feed.Items.First();

            Eq("Wachstum Influencer Marketing", item.Title);
            Eq("http://content-wind.com/2016/12/22/wachstum-influencer-marketing/", item.Link);
            Eq("http://content-wind.com/2016/12/22/wachstum-influencer-marketing/#respond", item.Comments);
            Eq("Thu, 22 Dec 2016 13:09:51 +0000", item.PublishingDateString);
            Eq(new DateTime(2016, 12, 22, 13, 09, 51), item.PublishingDate);
            Eq("Harald Schaffernak", item.DC.Creator);
        }
Example #15
0
        public async Task TestRss10ParseOrfAt_Async()
        {
            var feed = (Rss10Feed)(await FeedReader.ReadFromFileAsync("Feeds/Rss10OrfAt.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("news.ORF.at", feed.Title);
            Eq("http://orf.at/", feed.Link);
            Eq("2017-01-23T21:54:55+01:00", feed.DC.DateString);
            Eq("Die aktuellsten Nachrichten auf einen Blick - aus Österreich und der ganzen Welt. In Text, Bild und Video.", feed.Description);
            Eq("ORF Österreichischer Rundfunk, Wien", feed.DC.Publisher);
            Eq("ORF Online und Teletext GmbH & Co KG", feed.DC.Creator);
            Eq("de", feed.DC.Language);
            Eq("Copyright © 2017 ORF Online und Teletext GmbH & Co KG", feed.DC.Rights);
            Eq("hourly", feed.Sy.UpdatePeriod);
            Eq("2", feed.Sy.UpdateFrequency);
            Eq("2000-01-01T00:00:00Z", feed.Sy.UpdateBase);
            Eq(50, feed.Items.Count);

            var item = (Rss10FeedItem)feed.Items.ElementAt(4);

            Eq("Feldsperling erstmals häufigster Vogel", item.Title);
            Eq("http://orf.at/stories/2376365/", item.Link);
            Eq("Chronik", item.DC.Subject);
            Eq("2017-01-23T20:51:06+01:00", item.DC.DateString);
        }
Example #16
0
        public async Task TestAtomParseTheVerge_Async()
        {
            var feed = (AtomFeed)(await FeedReader.ReadFromFileAsync("Feeds/AtomTheVerge.xml").ConfigureAwait(false)).SpecificFeed;

            Eq("The Verge -  Front Pages", feed.Title);
            Eq("https://cdn2.vox-cdn.com/community_logos/34086/verge-fv.png", feed.Icon);
            Eq("2017-01-07T09:00:01-05:00", feed.UpdatedDateString);
            Eq(new DateTime(2017, 1, 7, 14, 0, 1), feed.UpdatedDate);
            Eq("http://www.theverge.com/rss/group/front-page/index.xml", feed.Id);

            var item = (AtomFeedItem)feed.Items.First();

            Eq("2017-01-07T09:00:01-05:00", item.UpdatedDateString);
            Eq(new DateTime(2017, 1, 7, 14, 0, 1), item.UpdatedDate);
            Eq("2017-01-07T09:00:01-05:00", item.PublishedDateString);
            Eq(new DateTime(2017, 1, 7, 14, 0, 1), item.PublishedDate);
            Eq("This is the new Hulu experience with live TV", item.Title);
            Eq("http://www.theverge.com/ces/2017/1/7/14195588/hulu-live-tv-streaming-internet-ces-2017", item.Id);
            Eq("http://www.theverge.com/ces/2017/1/7/14195588/hulu-live-tv-streaming-internet-ces-2017", item.Link);

            Assert.IsTrue(item.Content.Trim().StartsWith("<img alt=\"\""));

            Eq("Chris Welch", item.Author.Name);
        }
Example #17
0
        public async Task TestItunesSampleFeed_Async()
        {
            var feed = await FeedReader.ReadFromFileAsync("Feeds/Rss20ItunesSample.xml").ConfigureAwait(false);

            var itunesChannel = feed.GetItunesChannel();

            Eq("A show about everything", itunesChannel.Subtitle);
            Eq("John Doe", itunesChannel.Author);
            Eq("All About Everything is a show about everything. Each week we dive into any subject known to man and talk about it as much as we can. Look for our podcast in the Podcasts app or in the iTunes Store", itunesChannel.Summary);

            Assert.IsNotNull(itunesChannel.Owner);
            Eq("John Doe", itunesChannel.Owner.Name);
            Eq("*****@*****.**", itunesChannel.Owner.Email);
            Assert.IsNotNull(itunesChannel.Image);
            Eq("http://example.com/podcasts/everything/AllAboutEverything.jpg", itunesChannel.Image.Href);
            Assert.IsNotNull(itunesChannel.Categories);
            Eq("Technology", itunesChannel.Categories[0].Text);
            Assert.IsNotNull(itunesChannel.Categories[0].Children);
            Eq("Gadgets", itunesChannel.Categories[0].Children[0].Text);
            Eq("TV & Film", itunesChannel.Categories[1].Text);
            Eq("Arts", itunesChannel.Categories[2].Text);
            Assert.IsNotNull(itunesChannel.Categories[2].Children);
            Eq("Food", itunesChannel.Categories[2].Children[0].Text);
            Eq(false, itunesChannel.Explicit);


            var item1 = feed.Items.ElementAt(0).GetItunesItem();
            var item2 = feed.Items.ElementAt(1).GetItunesItem();
            var item3 = feed.Items.ElementAt(2).GetItunesItem();
            var item4 = feed.Items.ElementAt(3).GetItunesItem();

            Eq("John Doe", item1.Author);
            Eq("A short primer on table spices", item1.Subtitle);
            Eq("This week we talk about <a href=\"https://itunes/apple.com/us/book/antique-trader-salt-pepper/id429691295?mt=11\">salt and pepper shakers</a>, comparing and contrasting pour rates, construction materials, and overall aesthetics. Come and join the party!", item1.Summary);
            Assert.IsNotNull(item1.Image);
            Eq("http://example.com/podcasts/everything/AllAboutEverything/Episode1.jpg", item1.Image.Href);
            Assert.IsNotNull(item1.Duration);
            Eq(4, item1.Duration.Value.Seconds);
            Eq(7, item1.Duration.Value.Minutes);
            Eq(false, item1.Explicit);

            Eq("Jane Doe", item2.Author);
            Eq("Comparing socket wrenches is fun!", item2.Subtitle);
            Eq("This week we talk about metric vs. Old English socket wrenches. Which one is better? Do you really need both? Get all of your answers here.", item2.Summary);
            Assert.IsNotNull(item2.Image);
            Eq("http://example.com/podcasts/everything/AllAboutEverything/Episode2.jpg", item2.Image.Href);
            Assert.IsNotNull(item2.Duration);
            Eq(34, item2.Duration.Value.Seconds);
            Eq(4, item2.Duration.Value.Minutes);
            Eq(false, item2.Explicit);

            Eq("Jane Doe", item3.Author);
            Eq("Jane and Eric", item3.Subtitle);
            Eq("This week we talk about the best Chili in the world. Which chili is better?", item3.Summary);
            Assert.IsNotNull(item3.Image);
            Eq("http://example.com/podcasts/everything/AllAboutEverything/Episode3.jpg", item3.Image.Href);
            Assert.IsNotNull(item3.Duration);
            Eq(34, item3.Duration.Value.Seconds);
            Eq(4, item3.Duration.Value.Minutes);
            Eq(false, item3.Explicit);
            Eq(true, item3.IsClosedCaptioned);

            Eq("Various", item4.Author);
            Eq("Red + Blue != Purple", item4.Subtitle);
            Eq("This week we talk about surviving in a Red state if you are a Blue person. Or vice versa.", item4.Summary);
            Assert.IsNotNull(item4.Image);
            Eq("http://example.com/podcasts/everything/AllAboutEverything/Episode4.jpg", item4.Image.Href);
            Assert.IsNotNull(item4.Duration);
            Eq(59, item4.Duration.Value.Seconds);
            Eq(3, item4.Duration.Value.Minutes);
            Eq(false, item4.Explicit);
        }