// // Atom10FeedFormatterTest.cs // // Author: // Atsushi Enomoto // // Copyright (C) 2007 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if !MOBILE using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Runtime.Serialization; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Serialization; using System.ServiceModel.Syndication; using NUnit.Framework; using QName = System.Xml.XmlQualifiedName; namespace MonoTests.System.ServiceModel.Syndication { [TestFixture] public class Atom10FeedFormatterTest { [Test] [ExpectedException (typeof (ArgumentNullException))] public void ConstructorNullFeed () { new Atom10FeedFormatter ((SyndicationFeed) null); } [Test] [ExpectedException (typeof (ArgumentNullException))] public void ConstructorNullType () { new Atom10FeedFormatter ((Type) null); } /* [Test] public void FeedType () { Atom10FeedFormatter f = new Atom10FeedFormatter (); Assert.IsNull (f.FeedType, "#1"); f = new Atom10FeedFormatter (new SyndicationFeed ()); Assert.IsNull (f.FeedType, "#2"); } */ [Test] public void Version () { Atom10FeedFormatter f = new Atom10FeedFormatter (); Assert.AreEqual ("Atom10", f.Version, "#1"); } [Test] [ExpectedException (typeof (InvalidOperationException))] public void DefaultConstructorThenWriteXml () { StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter ().WriteTo (w); } [Test] [ExpectedException (typeof (ArgumentNullException))] public void WriteToNull () { SyndicationFeed feed = new SyndicationFeed (); new Atom10FeedFormatter (feed).WriteTo (null); } string DummyId (string s) { return Regex.Replace (s, ".+", "XXX"); } string DummyId2 (string s) { return Regex.Replace (s, ".+", "XXX"); } string DummyUpdated (string s) { return Regex.Replace (s, ".+", "XXX"); } string DummyUpdated2 (string s) { return Regex.Replace (s, ".+", "XXX"); } [Test] public void WriteTo_EmptyFeed () { // It however automatically fills id (very likely bug in .NET) and DateTimeOffset though. SyndicationFeed feed = new SyndicationFeed (); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); Assert.IsNull (feed.Id, "#1"); // automatically generated, but not automatically set. using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); Assert.AreEqual ("XXXXXX", DummyUpdated (DummyId (sw.ToString ()))); } [Test] public void WriteTo_TitleOnlyFeed () { // It however automatically fills id (very likely bug in .NET) and DateTimeOffset though. SyndicationFeed feed = new SyndicationFeed (); feed.Title = new TextSyndicationContent ("title text"); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); Assert.AreEqual ("title textXXXXXX", DummyUpdated (DummyId (sw.ToString ()))); } [Test] public void WriteTo_CategoryAuthorsContributors () { // It however automatically fills ... SyndicationFeed feed = new SyndicationFeed (); feed.Categories.Add (new SyndicationCategory ("myname", "myscheme", "mylabel")); feed.Authors.Add (new SyndicationPerson ("john@doe.com", "John Doe", "http://john.doe.name")); feed.Contributors.Add (new SyndicationPerson ("jane@doe.com", "Jane Doe", "http://jane.doe.name")); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); // contributors are serialized as Atom extension Assert.AreEqual ("XXXXXXJohn Doehttp://john.doe.namejohn@doe.comJane Doehttp://jane.doe.namejane@doe.com", DummyUpdated (DummyId (sw.ToString ()))); } [Test] public void WriteTo () { SyndicationFeed feed = new SyndicationFeed (); feed.BaseUri = new Uri ("http://mono-project.com"); feed.Copyright = new TextSyndicationContent ("No rights reserved"); feed.Description = new TextSyndicationContent ("A sample feed for unit testing"); feed.Generator = "mono test generator"; // .NET bug: it ignores this value. feed.Id = "urn:myid"; feed.ImageUrl = new Uri ("http://mono-project.com/images/mono.png"); feed.LastUpdatedTime = new DateTimeOffset (DateTime.SpecifyKind (new DateTime (2008, 1, 1), DateTimeKind.Utc)); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); Assert.AreEqual ("XXXNo rights reserved2008-01-01T00:00:00ZA sample feed for unit testinghttp://mono-project.com/images/mono.pngmono test generator", DummyId (sw.ToString ())); } [Test] public void ISerializableWriteXml () { SyndicationFeed feed = new SyndicationFeed (); feed.Title = new TextSyndicationContent ("title text"); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) { w.WriteStartElement ("dummy"); ((IXmlSerializable) new Atom10FeedFormatter (feed)).WriteXml (w); w.WriteEndElement (); } Assert.AreEqual ("title textXXXXXX", DummyUpdated2 (DummyId2 (sw.ToString ()))); } [Test] public void WriteTo_IllegalDuplicateAltLinks () { // ... and it passes. SyndicationFeed feed = new SyndicationFeed (); feed.Links.Add (new SyndicationLink (new Uri ("http://mono-project.com/Page1"), "alternate", "Page 1", "text/html", 0)); feed.Links.Add (new SyndicationLink (new Uri ("http://mono-project.com/Page2"), "alternate", "Page 2", "text/html", 0)); StringWriter sw = new StringWriter (); using (XmlWriter w = CreateWriter (sw)) new Atom10FeedFormatter (feed).WriteTo (w); Assert.AreEqual ("XXXXXX", DummyUpdated (DummyId (sw.ToString ()))); } XmlWriter CreateWriter (StringWriter sw) { XmlWriterSettings s = new XmlWriterSettings (); s.OmitXmlDeclaration = true; return XmlWriter.Create (sw, s); } XmlReader CreateReader (string xml) { return XmlReader.Create (new StringReader (xml)); } [Test] public void CanRead () { Atom10FeedFormatter f = new Atom10FeedFormatter (); Assert.IsTrue (f.CanRead (CreateReader ("")), "#1"); Assert.IsFalse (f.CanRead (CreateReader ("")), "#2"); Assert.IsFalse (f.CanRead (CreateReader ("")), "#3"); Assert.IsFalse (f.CanRead (CreateReader ("")), "#4"); Assert.IsFalse (f.CanRead (CreateReader ("")), "#5"); XmlReader r = CreateReader (""); r.Read (); // element r.Read (); // endelement Assert.IsFalse (f.CanRead (r), "#6"); r = CreateReader ("test"); r.Read (); // feed r.Read (); // channel Assert.IsFalse (f.CanRead (r), "#7"); } [Test] [ExpectedException (typeof (XmlException))] public void ReadFromInvalid () { new Atom10FeedFormatter ().ReadFrom (CreateReader ("")); } [Test] public void ReadFrom1 () { Atom10FeedFormatter f = new Atom10FeedFormatter (); Assert.IsNull (f.Feed, "#1"); f.ReadFrom (CreateReader ("test")); SyndicationFeed feed1 = f.Feed; Assert.IsNotNull (f.Feed.Title, "#2"); Assert.AreEqual ("test", f.Feed.Title.Text, "#3"); f.ReadFrom (CreateReader ("test")); Assert.IsFalse (object.ReferenceEquals (feed1, f.Feed), "#4"); } [Test] public void ReadXml_TitleOnly () { Atom10FeedFormatter f = new Atom10FeedFormatter (); ((IXmlSerializable) f).ReadXml (CreateReader ("test")); Assert.IsNotNull (f.Feed.Title, "#1"); Assert.AreEqual ("test", f.Feed.Title.Text, "#2"); ((IXmlSerializable) f).ReadXml (CreateReader ("test")); // it is ok } [Test] [ExpectedException (typeof (XmlException))] public void ReadXmlFromContent () { ((IXmlSerializable) new Atom10FeedFormatter ()).ReadXml (CreateReader ("test")); } [Test] public void ReadXml_Extension () { new Atom10FeedFormatter ().ReadFrom (CreateReader ("test")); new Atom10FeedFormatter ().ReadFrom (CreateReader ("test")); try { new Atom10FeedFormatter ().ReadFrom (CreateReader ("test")); Assert.Fail ("should trigger TryParseElement"); } catch (ApplicationException) { } } class MySyndicationFeed1 : SyndicationFeed { protected override bool TryParseElement (XmlReader reader, string version) { Assert.AreEqual ("Atom10", version, "#1"); Assert.IsFalse (base.TryParseElement (reader, version), "#2"); return false; } } class MySyndicationFeed2 : SyndicationFeed { protected override bool TryParseElement (XmlReader reader, string version) { reader.Skip (); // without it, the caller expects that the reader did not proceed. return true; } } class MySyndicationFeed3 : SyndicationFeed { protected override bool TryParseElement (XmlReader reader, string version) { throw new ApplicationException (); } } [Test] [ExpectedException (typeof (XmlException))] [Category("NotWorking")] public void ReadFrom_EmptyDate () { // strangely, it is checked while 'entry' is not checked Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("")); } [Test] [ExpectedException (typeof (XmlException))] [Category("NotWorking")] public void ReadFrom_WrongDate () { Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("2000-01-01T00:00:00")); } [Test] public void ReadFrom_Extension () { Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("http://www.mono-project.com/icons/mono.png")); Assert.IsNotNull (f.Feed, "#1"); // 'icon' is treated as an extension ... Assert.AreEqual (1, f.Feed.ElementExtensions.Count, "#2"); } [Test] public void ReadFrom_Link () { Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("")); Assert.AreEqual (1, f.Feed.Links.Count, "#1"); SyndicationLink link = f.Feed.Links [0]; Assert.AreEqual (50, link.Length, "#2"); Assert.AreEqual ("urn:foo", link.Uri.ToString (), "#3"); Assert.AreEqual ("text/html", link.MediaType, "#4"); Assert.AreEqual ("enclosure", link.RelationshipType, "#5"); Assert.AreEqual (1, link.AttributeExtensions.Count, "#6"); Assert.AreEqual (1, link.ElementExtensions.Count, "#7"); } [Test] public void ReadFrom_ImageUrl () { Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("http://mono-project.com/images/mono.png")); Assert.IsNotNull (f.Feed.ImageUrl, "#1"); Assert.AreEqual ("http://mono-project.com/images/mono.png", f.Feed.ImageUrl.ToString (), "#2"); } [Test] public void ReadFrom_Language () { Atom10FeedFormatter f = new Atom10FeedFormatter (); f.ReadFrom (CreateReader ("")); Assert.AreEqual ("ar-AR", f.Feed.Language, "#1"); } [Test] public void GetSchema () { Assert.IsNull (((IXmlSerializable) new Atom10FeedFormatter ()).GetSchema ()); } [Test] public void TestToString () { Assert.AreEqual (typeof (Atom10FeedFormatter).FullName + ", SyndicationVersion=Atom10", new Atom10FeedFormatter (new SyndicationFeed ()).ToString ()); } } } #endif