3 using System.Collections;
7 namespace Ximian.Mono.Tests
9 public class XmlNodeListTests : TestCase
11 public XmlNodeListTests () : base ("Ximian.Mono.Tests.XmlNodeListTests testsuite") {}
12 public XmlNodeListTests (string name) : base (name) {}
15 XmlElement documentElement;
19 IEnumerator enumerator;
22 protected override void SetUp ()
24 document = new XmlDocument ();
27 public void TestNodeTypesThatCantHaveChildren ()
29 document.LoadXml ("<foo>bar</foo>");
30 documentElement = document.DocumentElement;
31 node = documentElement.FirstChild;
32 AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text);
33 AssertEquals ("Shouldn't have children.", node.HasChildNodes, false);
34 AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0);
35 AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false);
38 public void TestZeroChildren ()
40 document.LoadXml ("<foo/>");
41 documentElement = document.DocumentElement;
42 AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false);
45 public void TestOneChild ()
47 document.LoadXml ("<foo><child1/></foo>");
48 documentElement = document.DocumentElement;
49 AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1);
51 foreach (XmlNode childNode in documentElement.ChildNodes)
53 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
56 AssertEquals ("foreach didn't loop over all children correctly.", index, 2);
59 public void TestMultipleChildren ()
61 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
62 element = document.DocumentElement;
63 AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3);
64 AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]);
65 AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]);
66 AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]);
67 AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName);
68 AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName);
69 AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName);
72 foreach (XmlNode childNode in element.ChildNodes)
74 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
77 AssertEquals ("foreach didn't loop over all children correctly.", index, 4);
80 public void TestAppendChildAffectOnEnumeration ()
82 document.LoadXml ("<foo><child1/></foo>");
83 element = document.DocumentElement;
84 enumerator = element.GetEnumerator();
85 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
86 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
88 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
89 element.AppendChild(document.CreateElement("child2"));
90 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
91 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
94 public void TestRemoveChildAffectOnEnumeration ()
96 document.LoadXml ("<foo><child1/><child2/></foo>");
97 element = document.DocumentElement;
98 enumerator = element.GetEnumerator();
99 element.RemoveChild(element.FirstChild);
100 enumerator.MoveNext();
101 AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2");
104 public void TestRemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
106 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
107 element = document.DocumentElement;
108 enumerator = element.GetEnumerator ();
109 enumerator.MoveNext ();
110 enumerator.MoveNext ();
111 AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName);
112 AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName);
113 element.RemoveChild (element.FirstChild.NextSibling);
114 enumerator.MoveNext ();
117 element = (XmlElement) enumerator.Current;
118 Fail ("Expected an InvalidOperationException.");
119 } catch (InvalidOperationException) { }
122 // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
123 public void saveTestReplaceChildAffectOnEnumeration ()
125 document.LoadXml ("<foo><child1/><child2/></foo>");
126 element = document.DocumentElement;
127 node = document.CreateElement("child3");
128 enumerator = element.GetEnumerator();
129 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
130 element.ReplaceChild(node, element.LastChild);
131 enumerator.MoveNext();
132 AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3");
133 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
136 public void TestRemoveOnlyChildAffectOnEnumeration ()
138 document.LoadXml ("<foo><child1/></foo>");
139 element = document.DocumentElement;
140 enumerator = element.GetEnumerator();
141 element.RemoveChild(element.FirstChild);
142 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
145 // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
146 public void saveTestRemoveAllAffectOnEnumeration ()
148 document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
149 element = document.DocumentElement;
150 enumerator = element.GetEnumerator();
151 AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3);
152 AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
154 AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
157 public void TestCurrentBeforeFirstNode ()
159 document.LoadXml ("<foo><child1/></foo>");
160 element = document.DocumentElement;
161 enumerator = element.GetEnumerator();
164 obj = enumerator.Current;
165 Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
166 } catch (InvalidOperationException) { }
169 public void TestCurrentAfterLastNode ()
171 document.LoadXml ("<foo><child1/></foo>");
172 element = document.DocumentElement;
173 enumerator = element.GetEnumerator();
174 enumerator.MoveNext();
175 enumerator.MoveNext();
178 obj = enumerator.Current;
179 Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
181 catch (InvalidOperationException) { }
184 public void TestCurrentDoesntMove ()
186 document.LoadXml ("<foo><child1/></foo>");
187 element = document.DocumentElement;
188 enumerator = element.GetEnumerator();
189 enumerator.MoveNext();
190 AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true);
193 public void TestReset ()
195 document.LoadXml ("<foo><child1/><child2/></foo>");
196 element = document.DocumentElement;
197 enumerator = element.GetEnumerator();
198 enumerator.MoveNext();
199 enumerator.MoveNext();
200 AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2");
202 enumerator.MoveNext();
203 AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1");