2005-02-15 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / Test / System.Xml / XmlElementTests.cs
index 419ccc17d483aac56a1e79d76e626d421eeb8615..996e1208e740726446288ae07713ea0d3186dcdb 100644 (file)
@@ -86,6 +86,19 @@ namespace MonoTests.System.Xml
                        AssertEquals ("Shallow clones shalt have no children!", false, shallow.HasChildNodes);
                }
 
+               [Test]
+               public void ConstructionAndDefaultAttributes ()
+               {
+                       string dtd = "<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'def'>]>";
+                       string xml = dtd + "<root />";
+//                     XmlValidatingReader xvr = new XmlValidatingReader (new XmlTextReader (xml, XmlNodeType.Document, null));
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml (xml);
+                       Console.WriteLine (doc.DocumentElement.Attributes.Count);
+                       Console.WriteLine (doc.CreateElement ("root").Attributes.Count);
+                       Console.WriteLine (doc.CreateElement ("root2").Attributes.Count);
+               }
+
                [Test]
                public void CreateElement1 ()
                {
@@ -218,6 +231,66 @@ namespace MonoTests.System.Xml
                        AssertEquals ("GetElementsByTagName (string, uri) returned incorrect count.", 1, bookList.Count);
                }
 
+               [Test]
+               public void GetElementsByTagNameNs2 ()
+               {
+                       document.LoadXml (@"<root>\r
+                       <x:a xmlns:x='urn:foo' id='a'>\r
+                       <y:a xmlns:y='urn:foo' id='b'/>\r
+                       <x:a id='c' />\r
+                       <z id='d' />\r
+                       text node\r
+                       <?a processing instruction ?>\r
+                       <x:w id='e'/>\r
+                       </x:a>\r
+                       </root>");\r
+                       // id='b' has different prefix. Should not caught by (name),\r
+                       // while should caught by (name, ns).\r
+                       XmlNodeList nl = document.DocumentElement.GetElementsByTagName ("x:a");\r
+                       AssertEquals (2, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [1].Attributes ["id"].Value);\r
+
+                       nl = document.DocumentElement.GetElementsByTagName ("a", "urn:foo");\r
+                       AssertEquals (3, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("b", nl [1].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [2].Attributes ["id"].Value);\r
+
+                       // name wildcard
+                       nl = document.DocumentElement.GetElementsByTagName ("*");\r
+                       AssertEquals (5, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("b", nl [1].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [2].Attributes ["id"].Value);\r
+                       AssertEquals ("d", nl [3].Attributes ["id"].Value);\r
+                       AssertEquals ("e", nl [4].Attributes ["id"].Value);\r
+
+                       // wildcard - local and ns
+                       nl = document.DocumentElement.GetElementsByTagName ("*", "*");\r
+                       AssertEquals (5, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("b", nl [1].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [2].Attributes ["id"].Value);\r
+                       AssertEquals ("d", nl [3].Attributes ["id"].Value);\r
+                       AssertEquals ("e", nl [4].Attributes ["id"].Value);\r
+
+                       // namespace wildcard - namespace
+                       nl = document.DocumentElement.GetElementsByTagName ("*", "urn:foo");\r
+                       AssertEquals (4, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("b", nl [1].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [2].Attributes ["id"].Value);\r
+                       AssertEquals ("e", nl [3].Attributes ["id"].Value);\r
+
+                       // namespace wildcard - local only. I dare say, such usage is not XML-ish!
+                       nl = document.DocumentElement.GetElementsByTagName ("a", "*");\r
+                       AssertEquals (3, nl.Count);\r
+                       AssertEquals ("a", nl [0].Attributes ["id"].Value);\r
+                       AssertEquals ("b", nl [1].Attributes ["id"].Value);\r
+                       AssertEquals ("c", nl [2].Attributes ["id"].Value);\r
+               }
+
                [Test]
                public void OuterXmlWithNamespace ()
                {
@@ -243,6 +316,61 @@ namespace MonoTests.System.Xml
                        AssertEquals ("attributes not properly removed.", false, xmlElement.HasAttribute ("type"));
                }
 
+               [Test]
+               public void RemoveDoesNotRemoveDefaultAttributes ()
+               {
+                       string dtd = "<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root   foo CDATA 'def'   bar CDATA #IMPLIED>]>";
+                       string xml = dtd + "<root bar='baz' />";
+                       XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       // RemoveAll
+                       AssertNotNull (document.DocumentElement);
+                       AssertEquals ("attrCount #01", 2, document.DocumentElement.Attributes.Count);
+                       AssertEquals ("baz", document.DocumentElement.GetAttribute ("bar"));
+                       AssertEquals ("def", document.DocumentElement.GetAttribute ("foo"));
+                       AssertEquals (false, document.DocumentElement.GetAttributeNode ("foo").Specified);
+                       document.DocumentElement.RemoveAll ();
+                       AssertEquals ("attrCount #02", 1, document.DocumentElement.Attributes.Count);
+                       AssertEquals ("def", document.DocumentElement.GetAttribute ("foo"));
+                       AssertEquals (String.Empty, document.DocumentElement.GetAttribute ("bar"));
+
+                       // RemoveAllAttributes
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAllAttributes ();
+                       AssertEquals ("attrCount #03", 1, document.DocumentElement.Attributes.Count);
+
+                       // RemoveAttribute(name)
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAttribute ("foo");
+                       AssertEquals ("attrCount #04", 2, document.DocumentElement.Attributes.Count);
+
+                       // RemoveAttribute(name, ns)
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAttribute ("foo", String.Empty);
+                       AssertEquals ("attrCount #05", 2, document.DocumentElement.Attributes.Count);
+
+                       // RemoveAttributeAt
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAttributeAt (1);
+                       AssertEquals ("attrCount #06", 2, document.DocumentElement.Attributes.Count);
+
+                       // RemoveAttributeNode
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAttributeNode (document.DocumentElement.Attributes [1]);
+                       AssertEquals ("attrCount #07", 2, document.DocumentElement.Attributes.Count);
+
+                       // RemoveAttributeNode(name, ns)
+                       xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
+                       document.Load (xvr);
+                       document.DocumentElement.RemoveAttributeNode ("foo", String.Empty);
+                       AssertEquals ("attrCount #08", 2, document.DocumentElement.Attributes.Count);
+               }
+
                [Test]
                public void SetAttributeNode ()
                {
@@ -254,6 +382,24 @@ namespace MonoTests.System.Xml
                        AssertEquals ("attribute namespace not properly created.", true, xmlAttribute.NamespaceURI.Equals ("namespace1"));
                }
 
+               [Test]
+               [ExpectedException (typeof (XmlException))]
+               public void SetAttributeNodeError ()
+               {
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml ("<root xmlns:x='urn:foo'/>");
+                       doc.DocumentElement.SetAttributeNode ("x:lang", "urn:foo");
+               }
+
+               [Test]
+               public void SetAttributeXmlns ()
+               {
+                       // should not affect Element node's xmlns
+                       XmlElement el = document.CreateElement ("root");
+                       el.SetAttribute ("xmlns", "urn:foo");
+                       AssertEquals (String.Empty, el.NamespaceURI);
+               }
+
                [Test]
                public void InnerTextAndEvent ()
                {
@@ -309,6 +455,22 @@ namespace MonoTests.System.Xml
                        AssertEquals ("#Namespaced.VerifyPreviousCleared", "hoge", el.FirstChild.Name);
                }
 
+               [Test]
+               public void InnerXmlSetter2 ()
+               {
+                       // See bug #63574
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml (@"<type>QPair&lt;QString,int&gt;::
+<ref refid='classQPair'>QPair</ref>
+&lt;
+<ref refid='classQString'>QString</ref>
+,int&gt;
+</type>");
+                       XmlElement typeNode = doc.DocumentElement;
+                       typeNode.InnerText = "QPair<QString, int>";
+                       AssertEquals ("QPair<QString, int>", typeNode.InnerText);
+               }
+
                [Test]
                public void IsEmpty ()
                {
@@ -344,6 +506,22 @@ namespace MonoTests.System.Xml
                        AssertEquals ("<RetrievalElement URI=\"\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\" />", sw.ToString());
                }
 
+               [Test]
+               public void WriteToMakesNonsenseForDefaultNSChildren ()
+               {
+                       XmlDocument d = new XmlDocument ();\r
+                       XmlElement x = d.CreateElement ("root");\r
+                       d.AppendChild (x);\r
+                       XmlElement a = d.CreateElement ("a");\r
+                       XmlElement b = d.CreateElement ("b");\r
+                       b.SetAttribute ("xmlns","probe");\r
+                       x.AppendChild (a);\r
+                       x.AppendChild (b);\r
+                       XmlElement b2 = d.CreateElement ("p2", "b2", "");\r
+                       b.AppendChild (b2);\r
+                       AssertEquals ("<root><a /><b xmlns=\"probe\"><b2 /></b></root>", d.OuterXml);\r
+               }
+
                [Test]
                public void WriteToWithDeletedNamespacePrefix ()
                {