// // XmlElementTests // // Authors: // Jason Diamond (jason@injektilo.org) // Martin Willemoes Hansen (mwh@sysrq.dk) // // (C) 2002 Jason Diamond http://injektilo.org/ // (C) 2003 Martin Willemoes Hansen // using System; using System.Xml; using System.IO; using System.Text; using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] public class XmlElementTests { private XmlDocument document; [SetUp] public void GetReady () { document = new XmlDocument (); } private void AssertElement (XmlElement element, string prefix, string localName, string namespaceURI, int attributesCount) { Assertion.AssertEquals (prefix != String.Empty ? prefix + ":" + localName : localName, element.Name); Assertion.AssertEquals (prefix, element.Prefix); Assertion.AssertEquals (localName, element.LocalName); Assertion.AssertEquals (namespaceURI, element.NamespaceURI); //Assertion.AssertEquals (attributesCount, element.Attributes.Count); } // for NodeInserted Event private bool Inserted = false; private void OnNodeInserted (object o, XmlNodeChangedEventArgs e) { Inserted = true; } // for NodeChanged Event private bool Changed = false; private void OnNodeChanged (object o, XmlNodeChangedEventArgs e) { Changed = true; } // for NodeRemoved Event private bool Removed = false; private void OnNodeRemoved (object o, XmlNodeChangedEventArgs e) { Removed = true; } [Test] public void CloneNode () { XmlElement element = document.CreateElement ("foo"); XmlElement child = document.CreateElement ("bar"); XmlElement grandson = document.CreateElement ("baz"); element.SetAttribute ("attr1", "val1"); element.SetAttribute ("attr2", "val2"); element.AppendChild (child); child.SetAttribute ("attr3", "val3"); child.AppendChild (grandson); document.AppendChild (element); XmlNode deep = element.CloneNode (true); // Assertion.AssertEquals ("These should be the same", deep.OuterXml, element.OuterXml); Assertion.AssertNull ("This is not null", deep.ParentNode); Assertion.Assert ("Copies, not pointers", !Object.ReferenceEquals (element,deep)); XmlNode shallow = element.CloneNode (false); Assertion.AssertNull ("This is not null", shallow.ParentNode); Assertion.Assert ("Copies, not pointers", !Object.ReferenceEquals (element,shallow)); Assertion.AssertEquals ("Shallow clones shalt have no children!", false, shallow.HasChildNodes); } [Test] public void CreateElement1 () { XmlElement element = document.CreateElement ("name"); AssertElement (element, String.Empty, "name", String.Empty, 0); } [Test] public void CreateElement1WithPrefix () { XmlElement element = document.CreateElement ("prefix:localName"); AssertElement (element, "prefix", "localName", String.Empty, 0); } [Test] public void CreateElement2 () { XmlElement element = document.CreateElement ("qualifiedName", "namespaceURI"); AssertElement (element, String.Empty, "qualifiedName", "namespaceURI", 0); } [Test] public void CreateElement2WithPrefix () { XmlElement element = document.CreateElement ("prefix:localName", "namespaceURI"); AssertElement (element, "prefix", "localName", "namespaceURI", 0); } [Test] public void CreateElement3 () { XmlElement element = document.CreateElement ("prefix", "localName", "namespaceURI"); AssertElement (element, "prefix", "localName", "namespaceURI", 0); } [Test] public void CreateElement3WithNullNamespace () { // bug #26855, NamespaceURI should NEVER be null. XmlElement element = document.CreateElement (null, "localName", null); AssertElement (element, String.Empty, "localName", String.Empty, 0); } [Test] public void InnerAndOuterXml () { XmlElement element; XmlText text; XmlComment comment; element = document.CreateElement ("foo"); Assertion.AssertEquals (String.Empty, element.InnerXml); Assertion.AssertEquals ("", element.OuterXml); text = document.CreateTextNode ("bar"); element.AppendChild (text); Assertion.AssertEquals ("bar", element.InnerXml); Assertion.AssertEquals ("bar", element.OuterXml); element.SetAttribute ("baz", "quux"); Assertion.AssertEquals ("bar", element.InnerXml); Assertion.AssertEquals ("bar", element.OuterXml); comment = document.CreateComment ("squonk"); element.AppendChild (comment); Assertion.AssertEquals ("bar", element.InnerXml); Assertion.AssertEquals ("bar", element.OuterXml); element.RemoveAll(); element.AppendChild(document.CreateElement("hoge")); Assertion.AssertEquals ("", element.InnerXml); } [Test] public void SetGetAttribute () { XmlElement element = document.CreateElement ("foo"); element.SetAttribute ("attr1", "val1"); element.SetAttribute ("attr2", "val2"); Assertion.AssertEquals ("val1", element.GetAttribute ("attr1")); Assertion.AssertEquals ("val2", element.GetAttribute ("attr2")); } [Test] public void GetElementsByTagNameNoNameSpace () { string xml = @"XML FunJohn Doe 34.95Bear and the Dragon Tom Clancy6.95 Bourne IdentityRobert Ludlum 9.95 Bourne UltimatumRobert Ludlum 9.95"; MemoryStream memoryStream = new MemoryStream (Encoding.UTF8.GetBytes (xml)); document = new XmlDocument (); document.Load (memoryStream); XmlNodeList libraryList = document.GetElementsByTagName ("library"); XmlNode xmlNode = libraryList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; XmlNodeList bookList = xmlElement.GetElementsByTagName ("book"); Assertion.AssertEquals ("GetElementsByTagName (string) returned incorrect count.", 4, bookList.Count); } [Test] public void GetElementsByTagNameUsingNameSpace () { StringBuilder xml = new StringBuilder (); xml.Append (" "); xml.Append ("XML Fun " ); xml.Append ("John Doe " ); xml.Append ("34.95 " ); xml.Append (" " ); xml.Append ("Bear and the Dragon " ); xml.Append ("Tom Clancy " ); xml.Append ("6.95 " ); xml.Append ("Bourne Identity " ); xml.Append ("Robert Ludlum " ); xml.Append ("9.95"); MemoryStream memoryStream = new MemoryStream (Encoding.UTF8.GetBytes (xml.ToString ())); document = new XmlDocument (); document.Load (memoryStream); XmlNodeList libraryList = document.GetElementsByTagName ("library"); XmlNode xmlNode = libraryList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; XmlNodeList bookList = xmlElement.GetElementsByTagName ("book", "http://www.foo.com"); Assertion.AssertEquals ("GetElementsByTagName (string, uri) returned incorrect count.", 1, bookList.Count); } [Test] public void OuterXmlWithNamespace () { XmlElement element = document.CreateElement ("foo", "bar", "#foo"); Assertion.AssertEquals ("", element.OuterXml); } [Test] public void RemoveAllAttributes () { StringBuilder xml = new StringBuilder (); xml.Append (" "); xml.Append ("XML Fun " ); xml.Append ("John Doe"); MemoryStream memoryStream = new MemoryStream (Encoding.UTF8.GetBytes (xml.ToString ())); document = new XmlDocument (); document.Load (memoryStream); XmlNodeList bookList = document.GetElementsByTagName ("book"); XmlNode xmlNode = bookList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; xmlElement.RemoveAllAttributes (); Assertion.AssertEquals ("attributes not properly removed.", false, xmlElement.HasAttribute ("type")); } [Test] public void SetAttributeNode () { XmlDocument xmlDoc = new XmlDocument (); XmlElement xmlEl = xmlDoc.CreateElement ("TestElement"); XmlAttribute xmlAttribute = xmlEl.SetAttributeNode ("attr1", "namespace1"); XmlAttribute xmlAttribute2 = xmlEl.SetAttributeNode ("attr2", "namespace2"); Assertion.AssertEquals ("attribute name not properly created.", true, xmlAttribute.Name.Equals ("attr1")); Assertion.AssertEquals ("attribute namespace not properly created.", true, xmlAttribute.NamespaceURI.Equals ("namespace1")); } [Test] public void InnerXmlSetter () { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); XmlElement el = doc.DocumentElement; Assertion.AssertNull ("#Simple", el.FirstChild); el.InnerXml = ""; XmlElement child = el.FirstChild as XmlElement; Assertion.AssertNotNull ("#Simple.Child", child); Assertion.AssertEquals ("#Simple.Child.Name", "foo", child.LocalName); XmlElement grandchild = child.FirstChild as XmlElement; Assertion.AssertNotNull ("#Simple.GrandChild", grandchild); Assertion.AssertEquals ("#Simple.GrandChild.Name", "bar", grandchild.LocalName); Assertion.AssertEquals ("#Simple.GrandChild.Attr", "baz", grandchild.GetAttribute ("att")); doc.LoadXml (""); el = doc.DocumentElement.FirstChild.NextSibling as XmlElement; // ns1:bar Assertion.AssertNull ("#Namespaced.Prepare", el.FirstChild); el.InnerXml = ""; Assertion.AssertNotNull ("#Namespaced.Child", el.FirstChild); Assertion.AssertEquals ("#Namespaced.Child.Name", "baz", el.FirstChild.LocalName); Assertion.AssertEquals ("#Namespaced.Child.NSURI", "NS1", el.FirstChild.NamespaceURI); // important! el.InnerXml = ""; Assertion.AssertEquals ("#Namespaced.VerifyPreviousCleared", "hoge", el.FirstChild.Name); } [Test] public void RemoveAttribute () { string xlinkURI = "http://www.w3.org/1999/XLink"; XmlDocument doc = new XmlDocument (); doc.LoadXml (""); XmlElement el = doc.DocumentElement; el.RemoveAttribute ("a1"); Assertion.AssertNull ("RemoveAttribute", el.GetAttributeNode ("a1")); el.RemoveAttribute ("xlink:href"); Assertion.AssertNull ("RemoveAttribute", el.GetAttributeNode ("href", xlinkURI)); el.RemoveAllAttributes (); Assertion.AssertNull ("RemoveAllAttributes", el.GetAttributeNode ("a2")); } [Test] public void WriteToWithDefaultNamespace () { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); StringWriter sw = new StringWriter (); XmlTextWriter xtw = new XmlTextWriter (sw); doc.DocumentElement.WriteTo (xtw); Assertion.AssertEquals ("", sw.ToString()); } [Test] public void WriteToWithDeletedNamespacePrefix () { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); doc.DocumentElement.RemoveAllAttributes (); Assertion.Assert (doc.DocumentElement.FirstChild.OuterXml.IndexOf("xmlns:foo") > 0); } [Test] public void WriteToWithDifferentNamespaceAttributes () { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); Assertion.Assert (doc.OuterXml.IndexOf ("xmlns:html=\"http://www.w3.org/1999/xhtml\"") > 0); } [Test] public void InnerTextAndEvent () { XmlDocument doc = new XmlDocument (); doc.LoadXml ("text"); doc.NodeInserted += new XmlNodeChangedEventHandler ( OnNodeInserted); doc.NodeRemoved += new XmlNodeChangedEventHandler ( OnNodeRemoved); // If only one child of the element is Text node, // then no events are fired. doc.DocumentElement.FirstChild.InnerText = "no events fired."; Assertion.AssertEquals ("NoInsertEventFired", false, Inserted); Assertion.AssertEquals ("NoRemoveEventFired", false, Removed); Assertion.AssertEquals ("SetInnerTextToSingleText", "no events fired.", doc.DocumentElement.FirstChild.InnerText); Inserted = false; Removed = false; // if only one child of the element is CDataSection, // then events are fired. doc.DocumentElement.LastChild.InnerText = "events are fired."; Assertion.AssertEquals ("InsertedEventFired", true, Inserted); Assertion.AssertEquals ("RemovedEventFired", true, Removed); Assertion.AssertEquals ("SetInnerTextToCDataSection", "events are fired.", doc.DocumentElement.LastChild.InnerText); } } }