XmlNodeListTests.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. //
  2. // System.Xml.XmlTextWriterTests
  3. //
  4. // Author:
  5. // Kral Ferch <[email protected]>
  6. //
  7. // (C) 2002 Kral Ferch
  8. //
  9. using System;
  10. using System.Xml;
  11. using System.Collections;
  12. using NUnit.Framework;
  13. namespace MonoTests.System.Xml
  14. {
  15. public class XmlNodeListTests : TestCase
  16. {
  17. public XmlNodeListTests () : base ("MonoTests.System.Xml.XmlNodeListTests testsuite") {}
  18. public XmlNodeListTests (string name) : base (name) {}
  19. XmlDocument document;
  20. XmlElement documentElement;
  21. XmlElement element;
  22. XmlNode node;
  23. Object obj;
  24. IEnumerator enumerator;
  25. int index;
  26. protected override void SetUp ()
  27. {
  28. document = new XmlDocument ();
  29. }
  30. public void TestNodeTypesThatCantHaveChildren ()
  31. {
  32. document.LoadXml ("<foo>bar</foo>");
  33. documentElement = document.DocumentElement;
  34. node = documentElement.FirstChild;
  35. AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text);
  36. AssertEquals ("Shouldn't have children.", node.HasChildNodes, false);
  37. AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0);
  38. AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false);
  39. }
  40. public void TestZeroChildren ()
  41. {
  42. document.LoadXml ("<foo/>");
  43. documentElement = document.DocumentElement;
  44. AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false);
  45. }
  46. public void TestOneChild ()
  47. {
  48. document.LoadXml ("<foo><child1/></foo>");
  49. documentElement = document.DocumentElement;
  50. AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1);
  51. index = 1;
  52. foreach (XmlNode childNode in documentElement.ChildNodes)
  53. {
  54. AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
  55. index++;
  56. }
  57. AssertEquals ("foreach didn't loop over all children correctly.", index, 2);
  58. }
  59. public void TestMultipleChildren ()
  60. {
  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);
  70. index = 1;
  71. foreach (XmlNode childNode in element.ChildNodes)
  72. {
  73. AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
  74. index++;
  75. }
  76. AssertEquals ("foreach didn't loop over all children correctly.", index, 4);
  77. }
  78. public void TestAppendChildAffectOnEnumeration ()
  79. {
  80. document.LoadXml ("<foo><child1/></foo>");
  81. element = document.DocumentElement;
  82. enumerator = element.GetEnumerator();
  83. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  84. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  85. enumerator.Reset();
  86. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  87. element.AppendChild(document.CreateElement("child2"));
  88. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  89. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  90. }
  91. public void TestRemoveChildAffectOnEnumeration ()
  92. {
  93. document.LoadXml ("<foo><child1/><child2/></foo>");
  94. element = document.DocumentElement;
  95. enumerator = element.GetEnumerator();
  96. element.RemoveChild(element.FirstChild);
  97. enumerator.MoveNext();
  98. AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2");
  99. }
  100. public void TestRemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
  101. {
  102. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  103. element = document.DocumentElement;
  104. enumerator = element.GetEnumerator ();
  105. enumerator.MoveNext ();
  106. enumerator.MoveNext ();
  107. AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName);
  108. AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName);
  109. element.RemoveChild (element.FirstChild.NextSibling);
  110. enumerator.MoveNext ();
  111. try {
  112. element = (XmlElement) enumerator.Current;
  113. Fail ("Expected an InvalidOperationException.");
  114. } catch (InvalidOperationException) { }
  115. }
  116. // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
  117. public void saveTestReplaceChildAffectOnEnumeration ()
  118. {
  119. document.LoadXml ("<foo><child1/><child2/></foo>");
  120. element = document.DocumentElement;
  121. node = document.CreateElement("child3");
  122. enumerator = element.GetEnumerator();
  123. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  124. element.ReplaceChild(node, element.LastChild);
  125. enumerator.MoveNext();
  126. AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3");
  127. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  128. }
  129. public void TestRemoveOnlyChildAffectOnEnumeration ()
  130. {
  131. document.LoadXml ("<foo><child1/></foo>");
  132. element = document.DocumentElement;
  133. enumerator = element.GetEnumerator();
  134. element.RemoveChild(element.FirstChild);
  135. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  136. }
  137. // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
  138. public void saveTestRemoveAllAffectOnEnumeration ()
  139. {
  140. document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
  141. element = document.DocumentElement;
  142. enumerator = element.GetEnumerator();
  143. AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3);
  144. AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
  145. element.RemoveAll();
  146. AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
  147. }
  148. public void TestCurrentBeforeFirstNode ()
  149. {
  150. document.LoadXml ("<foo><child1/></foo>");
  151. element = document.DocumentElement;
  152. enumerator = element.GetEnumerator();
  153. try
  154. {
  155. obj = enumerator.Current;
  156. Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
  157. } catch (InvalidOperationException) { }
  158. }
  159. public void TestCurrentAfterLastNode ()
  160. {
  161. document.LoadXml ("<foo><child1/></foo>");
  162. element = document.DocumentElement;
  163. enumerator = element.GetEnumerator();
  164. enumerator.MoveNext();
  165. enumerator.MoveNext();
  166. try
  167. {
  168. obj = enumerator.Current;
  169. Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
  170. }
  171. catch (InvalidOperationException) { }
  172. }
  173. public void TestCurrentDoesntMove ()
  174. {
  175. document.LoadXml ("<foo><child1/></foo>");
  176. element = document.DocumentElement;
  177. enumerator = element.GetEnumerator();
  178. enumerator.MoveNext();
  179. AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true);
  180. }
  181. public void TestReset ()
  182. {
  183. document.LoadXml ("<foo><child1/><child2/></foo>");
  184. element = document.DocumentElement;
  185. enumerator = element.GetEnumerator();
  186. enumerator.MoveNext();
  187. enumerator.MoveNext();
  188. AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2");
  189. enumerator.Reset();
  190. enumerator.MoveNext();
  191. AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1");
  192. }
  193. }
  194. }