2 // System.Xml.XmlTextWriterTests
5 // Kral Ferch <kral_ferch@hotmail.com>
12 using System.Collections;
14 using NUnit.Framework;
16 namespace MonoTests.System.Xml
18 public class XmlNodeListTests : TestCase
20 public XmlNodeListTests () : base ("MonoTests.System.Xml.XmlNodeListTests testsuite") {}
21 public XmlNodeListTests (string name) : base (name) {}
24 XmlElement documentElement;
28 IEnumerator enumerator;
31 protected override void SetUp ()
33 document = new XmlDocument ();
36 public void TestNodeTypesThatCantHaveChildren ()
38 document.LoadXml ("<foo>bar</foo>");
39 documentElement = document.DocumentElement;
40 node = documentElement.FirstChild;
41 AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text);
42 AssertEquals ("Shouldn't have children.", node.HasChildNodes, false);
43 AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0);
44 AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false);
47 public void TestZeroChildren ()
49 document.LoadXml ("<foo/>");
50 documentElement = document.DocumentElement;
51 AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false);
54 public void TestOneChild ()
56 document.LoadXml ("<foo><child1/></foo>");
57 documentElement = document.DocumentElement;
58 AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1);
60 foreach (XmlNode childNode in documentElement.ChildNodes)
62 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
65 AssertEquals ("foreach didn't loop over all children correctly.", index, 2);
68 public void TestMultipleChildren ()
70 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
71 element = document.DocumentElement;
72 AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3);
73 AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]);
74 AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]);
75 AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]);
76 AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName);
77 AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName);
78 AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName);
81 foreach (XmlNode childNode in element.ChildNodes)
83 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
86 AssertEquals ("foreach didn't loop over all children correctly.", index, 4);
89 public void TestAppendChildAffectOnEnumeration ()
91 document.LoadXml ("<foo><child1/></foo>");
92 element = document.DocumentElement;
93 enumerator = element.GetEnumerator();
94 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
95 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
97 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
98 element.AppendChild(document.CreateElement("child2"));
99 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
100 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
103 public void TestRemoveChildAffectOnEnumeration ()
105 document.LoadXml ("<foo><child1/><child2/></foo>");
106 element = document.DocumentElement;
107 enumerator = element.GetEnumerator();
108 element.RemoveChild(element.FirstChild);
109 enumerator.MoveNext();
110 AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2");
113 public void TestRemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
115 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
116 element = document.DocumentElement;
117 enumerator = element.GetEnumerator ();
118 enumerator.MoveNext ();
119 enumerator.MoveNext ();
120 AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName);
121 AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName);
122 element.RemoveChild (element.FirstChild.NextSibling);
123 enumerator.MoveNext ();
126 element = (XmlElement) enumerator.Current;
127 Fail ("Expected an InvalidOperationException.");
128 } catch (InvalidOperationException) { }
131 // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
132 public void saveTestReplaceChildAffectOnEnumeration ()
134 document.LoadXml ("<foo><child1/><child2/></foo>");
135 element = document.DocumentElement;
136 node = document.CreateElement("child3");
137 enumerator = element.GetEnumerator();
138 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
139 element.ReplaceChild(node, element.LastChild);
140 enumerator.MoveNext();
141 AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3");
142 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
145 public void TestRemoveOnlyChildAffectOnEnumeration ()
147 document.LoadXml ("<foo><child1/></foo>");
148 element = document.DocumentElement;
149 enumerator = element.GetEnumerator();
150 element.RemoveChild(element.FirstChild);
151 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
154 // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
155 public void saveTestRemoveAllAffectOnEnumeration ()
157 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
158 element = document.DocumentElement;
159 enumerator = element.GetEnumerator();
160 AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3);
161 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
163 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
166 public void TestCurrentBeforeFirstNode ()
168 document.LoadXml ("<foo><child1/></foo>");
169 element = document.DocumentElement;
170 enumerator = element.GetEnumerator();
173 obj = enumerator.Current;
174 Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
175 } catch (InvalidOperationException) { }
178 public void TestCurrentAfterLastNode ()
180 document.LoadXml ("<foo><child1/></foo>");
181 element = document.DocumentElement;
182 enumerator = element.GetEnumerator();
183 enumerator.MoveNext();
184 enumerator.MoveNext();
187 obj = enumerator.Current;
188 Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
190 catch (InvalidOperationException) { }
193 public void TestCurrentDoesntMove ()
195 document.LoadXml ("<foo><child1/></foo>");
196 element = document.DocumentElement;
197 enumerator = element.GetEnumerator();
198 enumerator.MoveNext();
199 AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true);
202 public void TestReset ()
204 document.LoadXml ("<foo><child1/><child2/></foo>");
205 element = document.DocumentElement;
206 enumerator = element.GetEnumerator();
207 enumerator.MoveNext();
208 enumerator.MoveNext();
209 AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2");
211 enumerator.MoveNext();
212 AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1");