XmlNodeListTests.cs 7.7 KB

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