2 // System.Xml.XmlTextWriterTests
5 // Kral Ferch <kral_ferch@hotmail.com>
6 // Martin Willemoes Hansen <mwh@sysrq.dk>
9 // (C) 2003 Martin Willemoes Hansen
14 using System
.Collections
;
16 using NUnit
.Framework
;
18 namespace MonoTests
.System
.Xml
21 public class XmlNodeListTests
: Assertion
24 XmlElement documentElement
;
28 IEnumerator enumerator
;
32 public void GetReady ()
34 document
= new XmlDocument ();
38 public void NodeTypesThatCantHaveChildren ()
40 document
.LoadXml ("<foo>bar</foo>");
41 documentElement
= document
.DocumentElement
;
42 node
= documentElement
.FirstChild
;
43 AssertEquals ("Expected a text node.", node
.NodeType
, XmlNodeType
.Text
);
44 AssertEquals ("Shouldn't have children.", node
.HasChildNodes
, false);
45 AssertEquals ("Should be empty node list.", node
.ChildNodes
.Count
, 0);
46 AssertEquals ("Should be empty node list.", node
.GetEnumerator().MoveNext(), false);
50 public void ZeroChildren ()
52 document
.LoadXml ("<foo/>");
53 documentElement
= document
.DocumentElement
;
54 AssertEquals ("Should be empty node list.", documentElement
.GetEnumerator().MoveNext(), false);
58 public void OneChild ()
60 document
.LoadXml ("<foo><child1/></foo>");
61 documentElement
= document
.DocumentElement
;
62 AssertEquals ("Incorrect number of children returned from Count property.", documentElement
.ChildNodes
.Count
, 1);
64 foreach (XmlNode childNode
in documentElement
.ChildNodes
)
66 AssertEquals ("Enumerator didn't return correct node.", "child" + index
.ToString(), childNode
.LocalName
);
69 AssertEquals ("foreach didn't loop over all children correctly.", index
, 2);
73 public void MultipleChildren ()
75 document
.LoadXml ("<foo><child1/><child2/><child3/></foo>");
76 element
= document
.DocumentElement
;
77 AssertEquals ("Incorrect number of children returned from Count property.", element
.ChildNodes
.Count
, 3);
78 AssertNull ("Index less than zero should have returned null.", element
.ChildNodes
[-1]);
79 AssertNull ("Index greater than or equal to Count should have returned null.", element
.ChildNodes
[3]);
80 AssertEquals ("Didn't return the correct child.", element
.FirstChild
, element
.ChildNodes
[0]);
81 AssertEquals ("Didn't return the correct child.", "child1", element
.ChildNodes
[0].LocalName
);
82 AssertEquals ("Didn't return the correct child.", "child2", element
.ChildNodes
[1].LocalName
);
83 AssertEquals ("Didn't return the correct child.", "child3", element
.ChildNodes
[2].LocalName
);
86 foreach (XmlNode childNode
in element
.ChildNodes
)
88 AssertEquals ("Enumerator didn't return correct node.", "child" + index
.ToString(), childNode
.LocalName
);
91 AssertEquals ("foreach didn't loop over all children correctly.", index
, 4);
95 public void AppendChildAffectOnEnumeration ()
97 document
.LoadXml ("<foo><child1/></foo>");
98 element
= document
.DocumentElement
;
99 enumerator
= element
.GetEnumerator();
100 AssertEquals ("MoveNext should have succeeded.", enumerator
.MoveNext(), true);
101 AssertEquals ("MoveNext should have failed.", enumerator
.MoveNext(), false);
103 AssertEquals ("MoveNext should have succeeded.", enumerator
.MoveNext(), true);
104 element
.AppendChild(document
.CreateElement("child2"));
105 AssertEquals ("MoveNext should have succeeded.", enumerator
.MoveNext(), true);
106 AssertEquals ("MoveNext should have failed.", enumerator
.MoveNext(), false);
110 public void RemoveChildAffectOnEnumeration ()
112 document
.LoadXml ("<foo><child1/><child2/></foo>");
113 element
= document
.DocumentElement
;
114 enumerator
= element
.GetEnumerator();
115 element
.RemoveChild(element
.FirstChild
);
116 enumerator
.MoveNext();
117 AssertEquals ("Expected child2 element.", ((XmlElement
)enumerator
.Current
).LocalName
, "child2");
121 public void RemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
123 document
.LoadXml ("<foo><child1/><child2/><child3/></foo>");
124 element
= document
.DocumentElement
;
125 enumerator
= element
.GetEnumerator ();
126 enumerator
.MoveNext ();
127 enumerator
.MoveNext ();
128 AssertEquals ("Expected child2 element.", "child2", ((XmlElement
)enumerator
.Current
).LocalName
);
129 AssertEquals ("Expected child2 element.", "child2", element
.FirstChild
.NextSibling
.LocalName
);
130 element
.RemoveChild (element
.FirstChild
.NextSibling
);
131 enumerator
.MoveNext ();
134 element
= (XmlElement
) enumerator
.Current
;
135 Fail ("Expected an InvalidOperationException.");
136 } catch (InvalidOperationException
) { }
139 // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
141 public void saveTestReplaceChildAffectOnEnumeration ()
143 document
.LoadXml ("<foo><child1/><child2/></foo>");
144 element
= document
.DocumentElement
;
145 node
= document
.CreateElement("child3");
146 enumerator
= element
.GetEnumerator();
147 AssertEquals ("MoveNext should have succeeded.", enumerator
.MoveNext(), true);
148 element
.ReplaceChild(node
, element
.LastChild
);
149 enumerator
.MoveNext();
150 AssertEquals ("Expected child3 element.", ((XmlElement
)enumerator
.Current
).LocalName
, "child3");
151 AssertEquals ("MoveNext should have failed.", enumerator
.MoveNext(), false);
155 public void RemoveOnlyChildAffectOnEnumeration ()
157 document
.LoadXml ("<foo><child1/></foo>");
158 element
= document
.DocumentElement
;
159 enumerator
= element
.GetEnumerator();
160 element
.RemoveChild(element
.FirstChild
);
161 AssertEquals ("MoveNext should have failed.", enumerator
.MoveNext(), false);
164 // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
166 public void saveTestRemoveAllAffectOnEnumeration ()
168 document
.LoadXml ("<foo><child1/><child2/><child3/></foo>");
169 element
= document
.DocumentElement
;
170 enumerator
= element
.GetEnumerator();
171 AssertEquals ("Expected 3 children.", element
.ChildNodes
.Count
, 3);
172 AssertEquals ("MoveNext should have succeeded.", enumerator
.MoveNext(), true);
174 AssertEquals ("MoveNext should have failed.", enumerator
.MoveNext(), false);
178 public void CurrentBeforeFirstNode ()
180 document
.LoadXml ("<foo><child1/></foo>");
181 element
= document
.DocumentElement
;
182 enumerator
= element
.GetEnumerator();
185 obj
= enumerator
.Current
;
186 Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
187 } catch (InvalidOperationException
) { }
191 public void CurrentAfterLastNode ()
193 document
.LoadXml ("<foo><child1/></foo>");
194 element
= document
.DocumentElement
;
195 enumerator
= element
.GetEnumerator();
196 enumerator
.MoveNext();
197 enumerator
.MoveNext();
200 obj
= enumerator
.Current
;
201 Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
203 catch (InvalidOperationException
) { }
207 public void CurrentDoesntMove ()
209 document
.LoadXml ("<foo><child1/></foo>");
210 element
= document
.DocumentElement
;
211 enumerator
= element
.GetEnumerator();
212 enumerator
.MoveNext();
213 AssertEquals("Consecutive calls to Current property should yield same reference.", Object
.ReferenceEquals(enumerator
.Current
, enumerator
.Current
), true);
219 document
.LoadXml ("<foo><child1/><child2/></foo>");
220 element
= document
.DocumentElement
;
221 enumerator
= element
.GetEnumerator();
222 enumerator
.MoveNext();
223 enumerator
.MoveNext();
224 AssertEquals("Expected child2.", ((XmlElement
)enumerator
.Current
).LocalName
, "child2");
226 enumerator
.MoveNext();
227 AssertEquals("Expected child1.", ((XmlElement
)enumerator
.Current
).LocalName
, "child1");
231 public void ReturnNullWhenIndexIsOutOfRange ()
233 document
.LoadXml ("<root><foo/></root>");
234 XmlNodeList nl
= document
.DocumentElement
.GetElementsByTagName ("bar");
235 AssertEquals ("empty list. count", 0, nl
.Count
);
237 AssertNull ("index 0", nl
[0]);
238 AssertNull ("index 1", nl
[1]);
239 AssertNull ("index -1", nl
[-1]);
240 } catch (ArgumentOutOfRangeException
) {
241 Fail ("don't throw index out of range.");