xmltextwriter writestartdocument and writeendelement.
[mono.git] / mcs / class / System.XML / Test / XmlDocumentTests.cs
1 using System;
2 using System.Xml;
3
4 using NUnit.Framework;
5
6 namespace Ximian.Mono.Tests
7 {
8         public class XmlDocumentTests : TestCase
9         {
10                 public XmlDocumentTests () : base ("Ximian.Mono.Tests.XmlDocumentTests testsuite") {}
11                 public XmlDocumentTests (string name) : base (name) {}
12
13                 private XmlDocument document;
14
15                 protected override void SetUp ()
16                 {
17                         document = new XmlDocument ();
18                 }
19
20                 public void TestDocumentElement ()
21                 {
22                         AssertNull (document.DocumentElement);
23                         XmlElement element = document.CreateElement ("foo", "bar", "http://foo/");
24                         AssertNotNull (element);
25
26                         AssertEquals ("foo", element.Prefix);
27                         AssertEquals ("bar", element.LocalName);
28                         AssertEquals ("http://foo/", element.NamespaceURI);
29
30                         AssertEquals ("foo:bar", element.Name);
31
32                         AssertSame (element, document.AppendChild (element));
33
34                         AssertSame (element, document.DocumentElement);
35                 }
36
37                 public void TestDocumentEmpty()
38                 {
39                         AssertEquals ("Incorrect output for empty document.", "", document.OuterXml);
40                 }
41
42                 public void TestLoadXmlCDATA ()
43                 {
44                         document.LoadXml ("<foo><![CDATA[bar]]></foo>");
45                         Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.CDATA);
46                         AssertEquals ("bar", document.DocumentElement.FirstChild.Value);
47                 }
48
49                 public void TestLoadXMLComment()
50                 {
51 // XmlTextReader needs to throw this exception
52 //                      try {
53 //                              document.LoadXml("<!--foo-->");
54 //                              Fail("XmlException should have been thrown.");
55 //                      }
56 //                      catch (XmlException e) {
57 //                              AssertEquals("Exception message doesn't match.", "The root element is missing.", e.Message);
58 //                      }
59
60                         document.LoadXml ("<foo><!--Comment--></foo>");
61                         Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Comment);
62                         AssertEquals ("Comment", document.DocumentElement.FirstChild.Value);
63
64                         document.LoadXml (@"<foo><!--bar--></foo>");
65                         AssertEquals ("Incorrect target.", "bar", ((XmlComment)document.FirstChild.FirstChild).Data);
66                 }
67
68                 public void TestLoadXmlElementSingle ()
69                 {
70                         AssertNull (document.DocumentElement);
71                         document.LoadXml ("<foo/>");
72
73                         AssertNotNull (document.DocumentElement);
74                         AssertSame (document.FirstChild, document.DocumentElement);
75
76                         AssertEquals (String.Empty, document.DocumentElement.Prefix);
77                         AssertEquals ("foo", document.DocumentElement.LocalName);
78                         AssertEquals (String.Empty, document.DocumentElement.NamespaceURI);
79                         AssertEquals ("foo", document.DocumentElement.Name);
80                 }
81
82                 public void TestLoadXmlElementWithAttributes ()
83                 {
84                         AssertNull (document.DocumentElement);
85                         document.LoadXml ("<foo bar='baz' quux='quuux'/>");
86
87                         XmlElement documentElement = document.DocumentElement;
88
89                         AssertEquals ("baz", documentElement.GetAttribute ("bar"));
90                         AssertEquals ("quuux", documentElement.GetAttribute ("quux"));
91                 }
92                 public void TestLoadXmlElementWithChildElement ()
93                 {
94                         document.LoadXml ("<foo><bar/></foo>");
95                         Assert (document.ChildNodes.Count == 1);
96                         Assert (document.FirstChild.ChildNodes.Count == 1);
97                         AssertEquals ("foo", document.DocumentElement.LocalName);
98                         AssertEquals ("bar", document.DocumentElement.FirstChild.LocalName);
99                 }
100
101                 public void TestLoadXmlElementWithTextNode ()
102                 {
103                         document.LoadXml ("<foo>bar</foo>");
104                         Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Text);
105                         AssertEquals ("bar", document.DocumentElement.FirstChild.Value);
106                 }
107
108                 public void TestLoadXmlExceptionClearsDocument ()
109                 {
110                         document.LoadXml ("<foo/>");
111                         Assert (document.FirstChild != null);
112                         
113                         try {
114                                 document.LoadXml ("<123/>");
115                                 Fail ("An XmlException should have been thrown.");
116                         } catch (XmlException) {}
117
118                         Assert (document.FirstChild == null);
119                 }
120
121                 public void TestLoadXmlProcessingInstruction ()
122                 {
123                         document.LoadXml (@"<?foo bar='baaz' quux='quuux'?><quuuux></quuuux>");
124                         AssertEquals ("Incorrect target.", "foo", ((XmlProcessingInstruction)document.FirstChild).Target);
125                         AssertEquals ("Incorrect data.", "bar='baaz' quux='quuux'", ((XmlProcessingInstruction)document.FirstChild).Data);
126                 }
127
128                 public void TestOuterXml ()
129                 {
130                         string xml;
131                         
132                         xml = "<root><![CDATA[foo]]></root>";
133                         document.LoadXml (xml);
134                         AssertEquals("XmlDocument with cdata OuterXml is incorrect.", xml, document.OuterXml);
135
136                         xml = "<root><!--foo--></root>";
137                         document.LoadXml (xml);
138                         AssertEquals("XmlDocument with comment OuterXml is incorrect.", xml, document.OuterXml);
139
140                         xml = "<root><?foo bar?></root>";
141                         document.LoadXml (xml);
142                         AssertEquals("XmlDocument with processing instruction OuterXml is incorrect.", xml, document.OuterXml);
143                 }
144
145                 public void TestParentNodes ()
146                 {
147                         document.LoadXml ("<foo><bar><baz/></bar></foo>");
148                         XmlNode node = document.FirstChild.FirstChild.FirstChild;
149                         AssertEquals ("Wrong child found.", "baz", node.LocalName);
150                         AssertEquals ("Wrong parent.", "bar", node.ParentNode.LocalName);
151                         AssertEquals ("Wrong parent.", "foo", node.ParentNode.ParentNode.LocalName);
152                         AssertEquals ("Wrong parent.", "#document", node.ParentNode.ParentNode.ParentNode.LocalName);
153                         AssertNull ("Expected parent to be null.", node.ParentNode.ParentNode.ParentNode.ParentNode);
154                 }
155
156                 public void TestRemovedElementNextSibling ()
157                 {
158                         XmlNode node;
159                         XmlNode nextSibling;
160
161                         document.LoadXml ("<foo><child1/><child2/></foo>");
162                         node = document.DocumentElement.FirstChild;
163                         document.DocumentElement.RemoveChild (node);
164                         nextSibling = node.NextSibling;
165                         AssertNull ("Expected removed node's next sibling to be null.", nextSibling);
166                 }
167         }
168 }