XmlNodeListTests.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //
  2. // System.Xml.XmlTextWriterTests
  3. //
  4. // Authors:
  5. // Kral Ferch <[email protected]>
  6. // Martin Willemoes Hansen <[email protected]>
  7. //
  8. // (C) 2002 Kral Ferch
  9. // (C) 2003 Martin Willemoes Hansen
  10. //
  11. using System;
  12. using System.Xml;
  13. using System.Collections;
  14. using NUnit.Framework;
  15. namespace MonoTests.System.Xml
  16. {
  17. [TestFixture]
  18. public class XmlNodeListTests : Assertion
  19. {
  20. XmlDocument document;
  21. XmlElement documentElement;
  22. XmlElement element;
  23. XmlNode node;
  24. Object obj;
  25. IEnumerator enumerator;
  26. int index;
  27. [SetUp]
  28. public void GetReady ()
  29. {
  30. document = new XmlDocument ();
  31. }
  32. [Test]
  33. public void NodeTypesThatCantHaveChildren ()
  34. {
  35. document.LoadXml ("<foo>bar</foo>");
  36. documentElement = document.DocumentElement;
  37. node = documentElement.FirstChild;
  38. AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text);
  39. AssertEquals ("Shouldn't have children.", node.HasChildNodes, false);
  40. AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0);
  41. AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false);
  42. }
  43. [Test]
  44. public void ZeroChildren ()
  45. {
  46. document.LoadXml ("<foo/>");
  47. documentElement = document.DocumentElement;
  48. AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false);
  49. }
  50. [Test]
  51. public void OneChild ()
  52. {
  53. document.LoadXml ("<foo><child1/></foo>");
  54. documentElement = document.DocumentElement;
  55. AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1);
  56. index = 1;
  57. foreach (XmlNode childNode in documentElement.ChildNodes)
  58. {
  59. AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
  60. index++;
  61. }
  62. AssertEquals ("foreach didn't loop over all children correctly.", index, 2);
  63. }
  64. [Test]
  65. public void MultipleChildren ()
  66. {
  67. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  68. element = document.DocumentElement;
  69. AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3);
  70. AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]);
  71. AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]);
  72. AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]);
  73. AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName);
  74. AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName);
  75. AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName);
  76. index = 1;
  77. foreach (XmlNode childNode in element.ChildNodes)
  78. {
  79. AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
  80. index++;
  81. }
  82. AssertEquals ("foreach didn't loop over all children correctly.", index, 4);
  83. }
  84. [Test]
  85. public void AppendChildAffectOnEnumeration ()
  86. {
  87. document.LoadXml ("<foo><child1/></foo>");
  88. element = document.DocumentElement;
  89. enumerator = element.GetEnumerator();
  90. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  91. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  92. enumerator.Reset();
  93. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  94. element.AppendChild(document.CreateElement("child2"));
  95. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  96. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  97. }
  98. [Test]
  99. public void RemoveChildAffectOnEnumeration ()
  100. {
  101. document.LoadXml ("<foo><child1/><child2/></foo>");
  102. element = document.DocumentElement;
  103. enumerator = element.GetEnumerator();
  104. element.RemoveChild(element.FirstChild);
  105. enumerator.MoveNext();
  106. AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2");
  107. }
  108. [Test]
  109. public void RemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
  110. {
  111. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  112. element = document.DocumentElement;
  113. enumerator = element.GetEnumerator ();
  114. enumerator.MoveNext ();
  115. enumerator.MoveNext ();
  116. AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName);
  117. AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName);
  118. element.RemoveChild (element.FirstChild.NextSibling);
  119. enumerator.MoveNext ();
  120. try {
  121. element = (XmlElement) enumerator.Current;
  122. Fail ("Expected an InvalidOperationException.");
  123. } catch (InvalidOperationException) { }
  124. }
  125. // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
  126. public void saveTestReplaceChildAffectOnEnumeration ()
  127. {
  128. document.LoadXml ("<foo><child1/><child2/></foo>");
  129. element = document.DocumentElement;
  130. node = document.CreateElement("child3");
  131. enumerator = element.GetEnumerator();
  132. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  133. element.ReplaceChild(node, element.LastChild);
  134. enumerator.MoveNext();
  135. AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3");
  136. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  137. }
  138. [Test]
  139. public void RemoveOnlyChildAffectOnEnumeration ()
  140. {
  141. document.LoadXml ("<foo><child1/></foo>");
  142. element = document.DocumentElement;
  143. enumerator = element.GetEnumerator();
  144. element.RemoveChild(element.FirstChild);
  145. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  146. }
  147. // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
  148. public void saveTestRemoveAllAffectOnEnumeration ()
  149. {
  150. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  151. element = document.DocumentElement;
  152. enumerator = element.GetEnumerator();
  153. AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3);
  154. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  155. element.RemoveAll();
  156. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  157. }
  158. [Test]
  159. public void CurrentBeforeFirstNode ()
  160. {
  161. document.LoadXml ("<foo><child1/></foo>");
  162. element = document.DocumentElement;
  163. enumerator = element.GetEnumerator();
  164. try
  165. {
  166. obj = enumerator.Current;
  167. Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
  168. } catch (InvalidOperationException) { }
  169. }
  170. [Test]
  171. public void CurrentAfterLastNode ()
  172. {
  173. document.LoadXml ("<foo><child1/></foo>");
  174. element = document.DocumentElement;
  175. enumerator = element.GetEnumerator();
  176. enumerator.MoveNext();
  177. enumerator.MoveNext();
  178. try
  179. {
  180. obj = enumerator.Current;
  181. Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
  182. }
  183. catch (InvalidOperationException) { }
  184. }
  185. [Test]
  186. public void CurrentDoesntMove ()
  187. {
  188. document.LoadXml ("<foo><child1/></foo>");
  189. element = document.DocumentElement;
  190. enumerator = element.GetEnumerator();
  191. enumerator.MoveNext();
  192. AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true);
  193. }
  194. [Test]
  195. public void Reset ()
  196. {
  197. document.LoadXml ("<foo><child1/><child2/></foo>");
  198. element = document.DocumentElement;
  199. enumerator = element.GetEnumerator();
  200. enumerator.MoveNext();
  201. enumerator.MoveNext();
  202. AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2");
  203. enumerator.Reset();
  204. enumerator.MoveNext();
  205. AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1");
  206. }
  207. [Test]
  208. public void ReturnNullWhenIndexIsOutOfRange ()
  209. {
  210. document.LoadXml ("<root><foo/></root>");
  211. XmlNodeList nl = document.DocumentElement.GetElementsByTagName ("bar");
  212. AssertEquals ("empty list. count", 0, nl.Count);
  213. try {
  214. AssertNull ("index 0", nl [0]);
  215. AssertNull ("index 1", nl [1]);
  216. AssertNull ("index -1", nl [-1]);
  217. } catch (ArgumentOutOfRangeException) {
  218. Fail ("don't throw index out of range.");
  219. }
  220. }
  221. }
  222. }