//
// 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);
}
// 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;
}
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 TestWriteToWithDefaultNamespace ()
{
XmlDocument doc = new XmlDocument ();
doc.LoadXml ("");
StringWriter sw = new StringWriter ();
XmlTextWriter xtw = new XmlTextWriter (sw);
doc.DocumentElement.WriteTo (xtw);
AssertEquals ("", sw.ToString());
}
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);
}
public void TestInnerTextAndEvent ()
{
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.";
AssertEquals ("NoInsertEventFired", false, Inserted);
AssertEquals ("NoRemoveEventFired", false, Removed);
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.";
AssertEquals ("InsertedEventFired", true, Inserted);
AssertEquals ("RemovedEventFired", true, Removed);
AssertEquals ("SetInnerTextToCDataSection", "events are fired.", doc.DocumentElement.LastChild.InnerText);
}
}
}