2003-02-09 Piers Haken <piersh@friskit.com>
[mono.git] / mcs / class / System.XML / Test / XmlNodeTests.cs
1 //
2 // System.Xml.XmlNodeTests
3 //
4 // Author:
5 //   Kral Ferch <kral_ferch@hotmail.com>
6 //
7 // (C) 2002 Kral Ferch
8 //
9
10 using System;
11 using System.IO;
12 using System.Text;
13 using System.Xml;
14
15 using NUnit.Framework;
16
17 namespace MonoTests.System.Xml
18 {
19         public class XmlNodeTests : TestCase
20         {
21                 public XmlNodeTests () : base ("MonoTests.System.Xml.XmlNodeTests testsuite") {}
22                 public XmlNodeTests (string name) : base (name) {}
23
24                 XmlDocument document;
25                 XmlElement element;
26                 XmlElement element2;
27                 bool inserted;
28                 bool inserting;
29                 bool changed;
30                 bool changing;
31                 bool removed;
32                 bool removing;
33
34                 protected override void SetUp ()
35                 {
36                         document = new XmlDocument ();
37                         document.NodeInserted += new XmlNodeChangedEventHandler (this.EventNodeInserted);
38                         document.NodeInserting += new XmlNodeChangedEventHandler (this.EventNodeInserting);
39                         document.NodeRemoved += new XmlNodeChangedEventHandler (this.EventNodeRemoved);
40                         document.NodeRemoving += new XmlNodeChangedEventHandler (this.EventNodeRemoving);
41                         element = document.CreateElement ("foo");
42                         element2 = document.CreateElement ("bar");
43                 }
44
45                 private void EventNodeInserted(Object sender, XmlNodeChangedEventArgs e)
46                 {
47                         inserted = true;
48                 }
49
50                 private void EventNodeInserting (Object sender, XmlNodeChangedEventArgs e)
51                 {
52                         inserting = true;
53                 }
54
55                 private void EventNodeChanged(Object sender, XmlNodeChangedEventArgs e)
56                 {
57                         changed = true;
58                 }
59
60                 private void EventNodeChanging (Object sender, XmlNodeChangedEventArgs e)
61                 {
62                         changing = true;
63                 }
64
65                 private void EventNodeRemoved(Object sender, XmlNodeChangedEventArgs e)
66                 {
67                         removed = true;
68                 }
69
70                 private void EventNodeRemoving (Object sender, XmlNodeChangedEventArgs e)
71                 {
72                         removing = true;
73                 }
74
75                 public void TestAppendChild ()
76                 {
77                         XmlComment comment;
78
79                         inserted = false;
80                         inserting = false;
81                         element.AppendChild (element2);
82                         Assert (inserted);
83                         Assert (inserting);
84
85                         // Can only append to elements, documents, and attributes
86                         try 
87                         {
88                                 comment = document.CreateComment ("baz");
89                                 comment.AppendChild (element2);
90                                 Fail ("Expected an InvalidOperationException to be thrown.");
91                         } 
92                         catch (InvalidOperationException) {}
93
94                         // Can't append a node from one document into another document.
95                         XmlDocument document2 = new XmlDocument();
96                         AssertEquals (1, element.ChildNodes.Count);
97                         try 
98                         {
99                                 element2 = document2.CreateElement ("qux");
100                                 element.AppendChild (element2);
101                                 Fail ("Expected an ArgumentException to be thrown.");
102                         } 
103                         catch (ArgumentException) {}
104                         AssertEquals (1, element.ChildNodes.Count);
105
106                         // Can't append to a readonly node.
107 /* TODO put this in when I figure out how to create a read-only node.
108                         try 
109                         {
110                                 XmlElement element3 = (XmlElement)element.CloneNode (false);
111                                 Assert (!element.IsReadOnly);
112                                 Assert (element3.IsReadOnly);
113                                 element2 = document.CreateElement ("quux");
114                                 element3.AppendChild (element2);
115                                 Fail ("Expected an ArgumentException to be thrown.");
116                         } 
117                         catch (ArgumentException) {}
118 */
119                 }
120
121                 public void TestInsertBefore()
122                 {
123                         document = new XmlDocument();
124                         document.LoadXml("<root><sub /></root>");
125                         XmlElement docelem = document.DocumentElement;
126                         docelem.InsertBefore(document.CreateElement("good_child"), docelem.FirstChild);
127                         AssertEquals("InsertBefore.Normal", "good_child", docelem.FirstChild.Name);
128                         // These are required for .NET 1.0 but not for .NET 1.1.
129 //                      try {
130 //                              document.InsertBefore (document.CreateElement ("BAD_MAN"), docelem);
131 //                              Fail ("#InsertBefore.BadPositionButNoError.1");
132 //                      }
133 //                      catch (XmlException) {}
134                 }
135
136                 public void TestInsertAfter()
137                 {
138                         document = new XmlDocument();
139                         document.LoadXml("<root><sub1 /><sub2 /></root>");
140                         XmlElement docelem = document.DocumentElement;
141                         XmlElement newelem = document.CreateElement("good_child");
142                         docelem.InsertAfter(newelem, docelem.FirstChild);
143                         AssertEquals("InsertAfter.Normal", 3, docelem.ChildNodes.Count);
144                         AssertEquals("InsertAfter.First", "sub1", docelem.FirstChild.Name);
145                         AssertEquals("InsertAfter.Last", "sub2", docelem.LastChild.Name);
146                         AssertEquals("InsertAfter.Prev", "good_child", docelem.FirstChild.NextSibling.Name);
147                         AssertEquals("InsertAfter.Next", "good_child", docelem.LastChild.PreviousSibling.Name);
148                         // this doesn't throw an exception
149                         document.InsertAfter(document.CreateElement("BAD_MAN"), docelem);
150                         AssertEquals("InsertAfter with bad location", 
151                                 "<root><sub1 /><good_child /><sub2 /></root><BAD_MAN />",
152                                 document.InnerXml);
153 }
154
155                 public void TestPrependChild()
156                 {
157                         document = new XmlDocument();
158                         document.LoadXml("<root><sub1 /><sub2 /></root>");
159                         XmlElement docelem = document.DocumentElement;
160                         docelem.PrependChild(document.CreateElement("prepender"));
161                         AssertEquals("PrependChild", "prepender", docelem.FirstChild.Name);
162                 }
163
164                 public void saveTestRemoveAll ()
165                 {
166                         // TODO:  put this test back in when AttributeCollection.RemoveAll() is implemented.
167                         element.AppendChild(element2);
168                         removed = false;
169                         removing = false;
170                         element.RemoveAll ();
171                         Assert (removed);
172                         Assert (removing);
173                 }
174
175                 public void TestRemoveChild ()
176                 {
177                         element.AppendChild(element2);
178                         removed = false;
179                         removing = false;
180                         element.RemoveChild (element2);
181                         Assert (removed);
182                         Assert (removing);
183                 }
184                 
185                 public void TestGetPrefixOfNamespace ()
186                 {
187                         document.LoadXml ("<root><c1 xmlns='urn:foo'><c2 xmlns:foo='urn:foo' xmlns='urn:bar'><c3 xmlns=''/></c2></c1></root>");
188                         AssertEquals ("root", String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo"));
189                         AssertEquals ("c1", String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo"));
190                         AssertEquals ("c2", String.Empty, document.DocumentElement.FirstChild.GetPrefixOfNamespace ("urn:foo"));
191                         AssertEquals ("c3", "foo", document.DocumentElement.FirstChild.FirstChild.GetPrefixOfNamespace ("urn:foo"));
192
193                 }
194
195                 public void TestReplaceChild ()
196                 {
197                         document.LoadXml ("<root/>");
198                         document.NodeInserted += new XmlNodeChangedEventHandler (this.EventNodeInserted);
199                         document.NodeChanged += new XmlNodeChangedEventHandler (this.EventNodeChanged);
200                         document.NodeRemoved += new XmlNodeChangedEventHandler (this.EventNodeRemoved);
201                         inserted = changed = removed = false;
202                         XmlElement el = document.CreateElement("root2");
203                         document.ReplaceChild (el, document.DocumentElement);
204                         AssertEquals ("root2", document.DocumentElement.Name);
205                         AssertEquals (1, document.ChildNodes.Count);
206                         Assert (inserted && removed && !changed);
207                 }
208         }
209 }