XmlNodeListTests.cs 8.4 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
  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. Assert.AreEqual (node.NodeType, XmlNodeType.Text, "Expected a text node.");
  39. Assert.AreEqual (node.HasChildNodes, false, "Shouldn't have children.");
  40. Assert.AreEqual (node.ChildNodes.Count, 0, "Should be empty node list.");
  41. Assert.AreEqual (node.GetEnumerator().MoveNext(), false, "Should be empty node list.");
  42. }
  43. [Test]
  44. public void ZeroChildren ()
  45. {
  46. document.LoadXml ("<foo/>");
  47. documentElement = document.DocumentElement;
  48. Assert.AreEqual (documentElement.GetEnumerator().MoveNext(), false, "Should be empty node list.");
  49. }
  50. [Test]
  51. public void OneChild ()
  52. {
  53. document.LoadXml ("<foo><child1/></foo>");
  54. documentElement = document.DocumentElement;
  55. Assert.AreEqual (documentElement.ChildNodes.Count, 1, "Incorrect number of children returned from Count property.");
  56. index = 1;
  57. foreach (XmlNode childNode in documentElement.ChildNodes)
  58. {
  59. Assert.AreEqual ("child" + index.ToString(), childNode.LocalName, "Enumerator didn't return correct node.");
  60. index++;
  61. }
  62. Assert.AreEqual (index, 2, "foreach didn't loop over all children correctly.");
  63. }
  64. [Test]
  65. public void MultipleChildren ()
  66. {
  67. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  68. element = document.DocumentElement;
  69. Assert.AreEqual (element.ChildNodes.Count, 3, "Incorrect number of children returned from Count property.");
  70. Assert.IsNull (element.ChildNodes [-1], "Index less than zero should have returned null.");
  71. Assert.IsNull (element.ChildNodes [3], "Index greater than or equal to Count should have returned null.");
  72. Assert.AreEqual (element.FirstChild, element.ChildNodes[0], "Didn't return the correct child.");
  73. Assert.AreEqual ("child1", element.ChildNodes[0].LocalName, "Didn't return the correct child.");
  74. Assert.AreEqual ("child2", element.ChildNodes[1].LocalName, "Didn't return the correct child.");
  75. Assert.AreEqual ("child3", element.ChildNodes[2].LocalName, "Didn't return the correct child.");
  76. index = 1;
  77. foreach (XmlNode childNode in element.ChildNodes)
  78. {
  79. Assert.AreEqual ("child" + index.ToString(), childNode.LocalName, "Enumerator didn't return correct node.");
  80. index++;
  81. }
  82. Assert.AreEqual (index, 4, "foreach didn't loop over all children correctly.");
  83. }
  84. [Test]
  85. public void AppendChildAffectOnEnumeration ()
  86. {
  87. document.LoadXml ("<foo><child1/></foo>");
  88. element = document.DocumentElement;
  89. enumerator = element.GetEnumerator();
  90. Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded.");
  91. Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed.");
  92. enumerator.Reset();
  93. Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded.");
  94. element.AppendChild(document.CreateElement("child2"));
  95. Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded.");
  96. Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed.");
  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. Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child2", "Expected child2 element.");
  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. Assert.AreEqual ("child2", ((XmlElement)enumerator.Current).LocalName, "Expected child2 element.");
  117. Assert.AreEqual ("child2", element.FirstChild.NextSibling.LocalName, "Expected child2 element.");
  118. element.RemoveChild (element.FirstChild.NextSibling);
  119. enumerator.MoveNext ();
  120. try {
  121. element = (XmlElement) enumerator.Current;
  122. Assert.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. Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded.");
  133. element.ReplaceChild(node, element.LastChild);
  134. enumerator.MoveNext();
  135. Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child3", "Expected child3 element.");
  136. Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed.");
  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. Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed.");
  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. Assert.AreEqual (element.ChildNodes.Count, 3, "Expected 3 children.");
  154. Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded.");
  155. element.RemoveAll();
  156. Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed.");
  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. Assert.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. Assert.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. Assert.AreEqual (Object.ReferenceEquals(enumerator.Current, enumerator.Current), true, "Consecutive calls to Current property should yield same reference.");
  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. Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child2", "Expected child2.");
  203. enumerator.Reset();
  204. enumerator.MoveNext();
  205. Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child1", "Expected child1.");
  206. }
  207. [Test]
  208. public void ReturnNullWhenIndexIsOutOfRange ()
  209. {
  210. document.LoadXml ("<root><foo/></root>");
  211. XmlNodeList nl = document.DocumentElement.GetElementsByTagName ("bar");
  212. Assert.AreEqual (0, nl.Count, "empty list. count");
  213. try {
  214. Assert.IsNull (nl [0], "index 0");
  215. Assert.IsNull (nl [1], "index 1");
  216. Assert.IsNull (nl [-1], "index -1");
  217. } catch (ArgumentOutOfRangeException) {
  218. Assert.Fail ("don't throw index out of range.");
  219. }
  220. }
  221. }
  222. }