// // XmlElementTests // // Author: // Jason Diamond (jason@injektilo.org) // // (C) 2002 Jason Diamond http://injektilo.org/ // using System; using System.Xml; using System.IO; using System.Text; using NUnit.Framework; namespace MonoTests.System.Xml { public class XmlElementTests : TestCase { public XmlElementTests () : base ("MonoTests.System.Xml.XmlElementTests testsuite") { } public XmlElementTests (string name) : base (name) { } private XmlDocument document; protected override void SetUp() { document = new XmlDocument (); } private void AssertElement (XmlElement element, string prefix, string localName, string namespaceURI, int attributesCount) { AssertEquals (prefix != String.Empty ? prefix + ":" + localName : localName, element.Name); AssertEquals (prefix, element.Prefix); AssertEquals (localName, element.LocalName); AssertEquals (namespaceURI, element.NamespaceURI); //AssertEquals (attributesCount, element.Attributes.Count); } public void TestCloneNode () { 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); // AssertEquals ("These should be the same", deep.OuterXml, element.OuterXml); AssertNull ("This is not null", deep.ParentNode); Assert ("Copies, not pointers", !Object.ReferenceEquals (element,deep)); XmlNode shallow = element.CloneNode (false); AssertNull ("This is not null", shallow.ParentNode); Assert ("Copies, not pointers", !Object.ReferenceEquals (element,shallow)); AssertEquals ("Shallow clones shalt have no children!", false, shallow.HasChildNodes); } public void TestCreateElement1 () { XmlElement element = document.CreateElement ("name"); AssertElement (element, String.Empty, "name", String.Empty, 0); } public void TestCreateElement1WithPrefix () { XmlElement element = document.CreateElement ("prefix:localName"); AssertElement (element, "prefix", "localName", String.Empty, 0); } public void TestCreateElement2 () { XmlElement element = document.CreateElement ("qualifiedName", "namespaceURI"); AssertElement (element, String.Empty, "qualifiedName", "namespaceURI", 0); } public void TestCreateElement2WithPrefix () { XmlElement element = document.CreateElement ("prefix:localName", "namespaceURI"); AssertElement (element, "prefix", "localName", "namespaceURI", 0); } public void TestCreateElement3 () { XmlElement element = document.CreateElement ("prefix", "localName", "namespaceURI"); AssertElement (element, "prefix", "localName", "namespaceURI", 0); } public void TestCreateElement3WithNullNamespace () { // bug #26855, NamespaceURI should NEVER be null. XmlElement element = document.CreateElement (null, "localName", null); AssertElement (element, String.Empty, "localName", String.Empty, 0); } public void TestInnerAndOuterXml () { XmlElement element; XmlText text; XmlComment comment; element = document.CreateElement ("foo"); AssertEquals (String.Empty, element.InnerXml); AssertEquals ("", element.OuterXml); text = document.CreateTextNode ("bar"); element.AppendChild (text); AssertEquals ("bar", element.InnerXml); AssertEquals ("bar", element.OuterXml); element.SetAttribute ("baz", "quux"); AssertEquals ("bar", element.InnerXml); AssertEquals ("bar", element.OuterXml); comment = document.CreateComment ("squonk"); element.AppendChild (comment); AssertEquals ("bar", element.InnerXml); AssertEquals ("bar", element.OuterXml); element.RemoveAll(); element.AppendChild(document.CreateElement("hoge")); AssertEquals ("", element.InnerXml); } public void TestSetGetAttribute () { XmlElement element = document.CreateElement ("foo"); element.SetAttribute ("attr1", "val1"); element.SetAttribute ("attr2", "val2"); AssertEquals ("val1", element.GetAttribute ("attr1")); AssertEquals ("val2", element.GetAttribute ("attr2")); } public void TestGetElementsByTagNameNoNameSpace () { 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"); AssertEquals ("GetElementsByTagName (string) returned incorrect count.", 4, bookList.Count); } public void TestGetElementsByTagNameUsingNameSpace () { 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"); AssertEquals ("GetElementsByTagName (string, uri) returned incorrect count.", 1, bookList.Count); } public void TestOuterXmlWithNamespace () { XmlElement element = document.CreateElement ("foo", "bar", "#foo"); AssertEquals ("", element.OuterXml); } public void TestRemoveAllAttributes () { 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 (); AssertEquals ("attributes not properly removed.", false, xmlElement.HasAttribute ("type")); } public void TestSetAttributeNode() { XmlDocument xmlDoc = new XmlDocument (); XmlElement xmlEl = xmlDoc.CreateElement ("TestElement"); XmlAttribute xmlAttribute = xmlEl.SetAttributeNode ("attr1", "namespace1"); XmlAttribute xmlAttribute2 = xmlEl.SetAttributeNode ("attr2", "namespace2"); AssertEquals ("attribute name not properly created.", true, xmlAttribute.Name.Equals ("attr1")); AssertEquals ("attribute namespace not properly created.", true, xmlAttribute.NamespaceURI.Equals ("namespace1")); } public void TestInnerXmlSetter() { XmlDocument doc = new XmlDocument(); doc.LoadXml(""); XmlElement el = doc.DocumentElement; AssertNull("#Simple", el.FirstChild); el.InnerXml = ""; XmlElement child = el.FirstChild as XmlElement; AssertNotNull("#Simple.Child", child); AssertEquals("#Simple.Child.Name", "foo", child.LocalName); XmlElement grandchild = child.FirstChild as XmlElement; AssertNotNull("#Simple.GrandChild", grandchild); AssertEquals("#Simple.GrandChild.Name", "bar", grandchild.LocalName); AssertEquals("#Simple.GrandChild.Attr", "baz", grandchild.GetAttribute("att")); doc.LoadXml(""); el = doc.DocumentElement.FirstChild.NextSibling as XmlElement; // ns1:bar AssertNull("#Namespaced.Prepare", el.FirstChild); el.InnerXml = ""; AssertNotNull("#Namespaced.Child", el.FirstChild); AssertEquals("#Namespaced.Child.Name", "baz", el.FirstChild.LocalName); AssertEquals("#Namespaced.Child.NSURI", "NS1", el.FirstChild.NamespaceURI); // important! el.InnerXml = ""; AssertEquals("#Namespaced.VerifyPreviousCleared", "hoge", el.FirstChild.Name); } public void TestRemoveAttribute() { string xlinkURI = "http://www.w3.org/1999/XLink"; XmlDocument doc = new XmlDocument(); doc.LoadXml(""); XmlElement el = doc.DocumentElement; el.RemoveAttribute("a1"); AssertNull("RemoveAttribute", el.GetAttributeNode("a1")); el.RemoveAttribute("xlink:href"); AssertNull("RemoveAttribute", el.GetAttributeNode("href", xlinkURI)); el.RemoveAllAttributes(); AssertNull("RemoveAllAttributes", el.GetAttributeNode("a2")); } public void TestWriteToWithDeletedNamespacePrefix() { XmlDocument doc = new XmlDocument(); doc.LoadXml(""); doc.DocumentElement.RemoveAllAttributes(); Assert(doc.DocumentElement.FirstChild.OuterXml.IndexOf("xmlns:foo") > 0); } public void TestWriteToWithDifferentNamespaceAttributes() { XmlDocument doc = new XmlDocument(); doc.LoadXml(""); Assert(doc.OuterXml.IndexOf("xmlns:html=\"http://www.w3.org/1999/xhtml\"") > 0); } } }