XPathNavigatorTests.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. //
  2. // MonoTests.System.Xml.XPathNavigatorTests
  3. //
  4. // Authors:
  5. // Jason Diamond <[email protected]>
  6. // Martin Willemoes Hansen <[email protected]>
  7. //
  8. // (C) 2002 Jason Diamond
  9. // (C) 2003 Martin Willemoes Hansen
  10. //
  11. using System;
  12. using System.IO;
  13. using System.Xml;
  14. using System.Xml.XPath;
  15. using NUnit.Framework;
  16. namespace MonoTests.System.Xml
  17. {
  18. [TestFixture]
  19. public class XPathNavigatorTests : Assertion
  20. {
  21. XmlDocument document;
  22. XPathNavigator navigator;
  23. [SetUp]
  24. public void GetReady ()
  25. {
  26. document = new XmlDocument ();
  27. }
  28. [Test]
  29. public void CreateNavigator ()
  30. {
  31. document.LoadXml ("<foo />");
  32. navigator = document.CreateNavigator ();
  33. AssertNotNull (navigator);
  34. }
  35. [Test]
  36. public void PropertiesOnDocument ()
  37. {
  38. document.LoadXml ("<foo:bar xmlns:foo='#foo' />");
  39. navigator = document.CreateNavigator ();
  40. AssertEquals (XPathNodeType.Root, navigator.NodeType);
  41. AssertEquals (String.Empty, navigator.Name);
  42. AssertEquals (String.Empty, navigator.LocalName);
  43. AssertEquals (String.Empty, navigator.NamespaceURI);
  44. AssertEquals (String.Empty, navigator.Prefix);
  45. Assert (!navigator.HasAttributes);
  46. Assert (navigator.HasChildren);
  47. Assert (!navigator.IsEmptyElement);
  48. }
  49. [Test]
  50. public void PropertiesOnElement ()
  51. {
  52. document.LoadXml ("<foo:bar xmlns:foo='#foo' />");
  53. navigator = document.DocumentElement.CreateNavigator ();
  54. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  55. AssertEquals ("foo:bar", navigator.Name);
  56. AssertEquals ("bar", navigator.LocalName);
  57. AssertEquals ("#foo", navigator.NamespaceURI);
  58. AssertEquals ("foo", navigator.Prefix);
  59. Assert (!navigator.HasAttributes);
  60. Assert (!navigator.HasChildren);
  61. Assert (navigator.IsEmptyElement);
  62. }
  63. [Test]
  64. public void PropertiesOnAttribute ()
  65. {
  66. document.LoadXml ("<foo bar:baz='quux' xmlns:bar='#bar' />");
  67. navigator = document.DocumentElement.GetAttributeNode("baz", "#bar").CreateNavigator ();
  68. AssertEquals (XPathNodeType.Attribute, navigator.NodeType);
  69. AssertEquals ("bar:baz", navigator.Name);
  70. AssertEquals ("baz", navigator.LocalName);
  71. AssertEquals ("#bar", navigator.NamespaceURI);
  72. AssertEquals ("bar", navigator.Prefix);
  73. Assert (!navigator.HasAttributes);
  74. Assert (!navigator.HasChildren);
  75. Assert (!navigator.IsEmptyElement);
  76. }
  77. [Test]
  78. public void Navigation ()
  79. {
  80. document.LoadXml ("<foo><bar /><baz /></foo>");
  81. navigator = document.DocumentElement.CreateNavigator ();
  82. AssertEquals ("foo", navigator.Name);
  83. Assert (navigator.MoveToFirstChild ());
  84. AssertEquals ("bar", navigator.Name);
  85. Assert (navigator.MoveToNext ());
  86. AssertEquals ("baz", navigator.Name);
  87. Assert (!navigator.MoveToNext ());
  88. AssertEquals ("baz", navigator.Name);
  89. Assert (navigator.MoveToPrevious ());
  90. AssertEquals ("bar", navigator.Name);
  91. Assert (!navigator.MoveToPrevious ());
  92. Assert (navigator.MoveToParent ());
  93. AssertEquals ("foo", navigator.Name);
  94. navigator.MoveToRoot ();
  95. AssertEquals (XPathNodeType.Root, navigator.NodeType);
  96. Assert (!navigator.MoveToParent ());
  97. AssertEquals (XPathNodeType.Root, navigator.NodeType);
  98. Assert (navigator.MoveToFirstChild ());
  99. AssertEquals ("foo", navigator.Name);
  100. Assert (navigator.MoveToFirst ());
  101. AssertEquals ("foo", navigator.Name);
  102. Assert (navigator.MoveToFirstChild ());
  103. AssertEquals ("bar", navigator.Name);
  104. Assert (navigator.MoveToNext ());
  105. AssertEquals ("baz", navigator.Name);
  106. Assert (navigator.MoveToFirst ());
  107. AssertEquals ("bar", navigator.Name);
  108. }
  109. [Test]
  110. public void MoveToAndIsSamePosition ()
  111. {
  112. XmlDocument document1 = new XmlDocument ();
  113. document1.LoadXml ("<foo><bar /></foo>");
  114. XPathNavigator navigator1a = document1.DocumentElement.CreateNavigator ();
  115. XPathNavigator navigator1b = document1.DocumentElement.CreateNavigator ();
  116. XmlDocument document2 = new XmlDocument ();
  117. document2.LoadXml ("<foo><bar /></foo>");
  118. XPathNavigator navigator2 = document2.DocumentElement.CreateNavigator ();
  119. AssertEquals ("foo", navigator1a.Name);
  120. Assert (navigator1a.MoveToFirstChild ());
  121. AssertEquals ("bar", navigator1a.Name);
  122. Assert (!navigator1b.IsSamePosition (navigator1a));
  123. AssertEquals ("foo", navigator1b.Name);
  124. Assert (navigator1b.MoveTo (navigator1a));
  125. Assert (navigator1b.IsSamePosition (navigator1a));
  126. AssertEquals ("bar", navigator1b.Name);
  127. Assert (!navigator2.IsSamePosition (navigator1a));
  128. AssertEquals ("foo", navigator2.Name);
  129. Assert (!navigator2.MoveTo (navigator1a));
  130. AssertEquals ("foo", navigator2.Name);
  131. }
  132. [Test]
  133. public void AttributeNavigation ()
  134. {
  135. document.LoadXml ("<foo bar='baz' quux='quuux' />");
  136. navigator = document.DocumentElement.CreateNavigator ();
  137. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  138. AssertEquals ("foo", navigator.Name);
  139. Assert (navigator.MoveToFirstAttribute ());
  140. AssertEquals (XPathNodeType.Attribute, navigator.NodeType);
  141. AssertEquals ("bar", navigator.Name);
  142. AssertEquals ("baz", navigator.Value);
  143. Assert (navigator.MoveToNextAttribute ());
  144. AssertEquals (XPathNodeType.Attribute, navigator.NodeType);
  145. AssertEquals ("quux", navigator.Name);
  146. AssertEquals ("quuux", navigator.Value);
  147. }
  148. [Test]
  149. public void ElementAndRootValues()
  150. {
  151. document.LoadXml ("<foo><bar>baz</bar><quux>quuux</quux></foo>");
  152. navigator = document.DocumentElement.CreateNavigator ();
  153. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  154. AssertEquals ("foo", navigator.Name);
  155. //AssertEquals ("bazquuux", navigator.Value);
  156. navigator.MoveToRoot ();
  157. //AssertEquals ("bazquuux", navigator.Value);
  158. }
  159. [Test]
  160. public void DocumentWithXmlDeclaration ()
  161. {
  162. document.LoadXml ("<?xml version=\"1.0\" standalone=\"yes\"?><Root><foo>bar</foo></Root>");
  163. navigator = document.CreateNavigator ();
  164. navigator.MoveToRoot ();
  165. navigator.MoveToFirstChild ();
  166. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  167. AssertEquals ("Root", navigator.Name);
  168. }
  169. [Test]
  170. public void DocumentWithProcessingInstruction ()
  171. {
  172. document.LoadXml ("<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />");
  173. navigator = document.CreateNavigator ();
  174. Assert (navigator.MoveToFirstChild ());
  175. AssertEquals (XPathNodeType.ProcessingInstruction, navigator.NodeType);
  176. AssertEquals ("xml-stylesheet", navigator.Name);
  177. XPathNodeIterator iter = navigator.SelectChildren (XPathNodeType.Element);
  178. AssertEquals (0, iter.Count);
  179. }
  180. [Test]
  181. public void SelectFromOrphan ()
  182. {
  183. // SelectSingleNode () from node without parent.
  184. XmlDocument doc = new XmlDocument ();
  185. doc.LoadXml ("<foo><include id='original' /></foo>");
  186. XmlNode node = doc.CreateElement ("child");
  187. node.InnerXml = "<include id='new' />";
  188. XmlNode new_include = node.SelectSingleNode ("//include");
  189. AssertEquals ("<include id=\"new\" />", new_include.OuterXml);
  190. // In this case 'node2' has parent 'node'
  191. doc = new XmlDocument ();
  192. doc.LoadXml ("<foo><include id='original' /></foo>");
  193. node = doc.CreateElement ("child");
  194. XmlNode node2 = doc.CreateElement ("grandchild");
  195. node.AppendChild (node2);
  196. node2.InnerXml = "<include id='new' />";
  197. new_include = node2.SelectSingleNode ("/");
  198. AssertEquals ("<child><grandchild><include id=\"new\" /></grandchild></child>",
  199. new_include.OuterXml);
  200. }
  201. [Test]
  202. public void XPathDocumentMoveToId ()
  203. {
  204. string dtd = "<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root id ID #REQUIRED>]>";
  205. string xml = dtd + "<root id='aaa'/>";
  206. StringReader sr = new StringReader (xml);
  207. XPathNavigator nav = new XPathDocument (sr).CreateNavigator ();
  208. Assert ("ctor() from TextReader", nav.MoveToId ("aaa"));
  209. XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  210. nav = new XPathDocument (xvr).CreateNavigator ();
  211. Assert ("ctor() from XmlValidatingReader", nav.MoveToId ("aaa"));
  212. // When it is XmlTextReader, XPathDocument fails.
  213. XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
  214. nav = new XPathDocument (xtr).CreateNavigator ();
  215. Assert ("ctor() from XmlTextReader", !nav.MoveToId ("aaa"));
  216. }
  217. }
  218. }