XPathNavigatorTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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 PropertiesOnNamespace ()
  79. {
  80. document.LoadXml ("<root xmlns='urn:foo' />");
  81. navigator = document.DocumentElement.Attributes [0].CreateNavigator ();
  82. AssertEquals (XPathNodeType.Namespace, navigator.NodeType);
  83. }
  84. [Test]
  85. public void Navigation ()
  86. {
  87. document.LoadXml ("<foo><bar /><baz /></foo>");
  88. navigator = document.DocumentElement.CreateNavigator ();
  89. AssertEquals ("foo", navigator.Name);
  90. Assert (navigator.MoveToFirstChild ());
  91. AssertEquals ("bar", navigator.Name);
  92. Assert (navigator.MoveToNext ());
  93. AssertEquals ("baz", navigator.Name);
  94. Assert (!navigator.MoveToNext ());
  95. AssertEquals ("baz", navigator.Name);
  96. Assert (navigator.MoveToPrevious ());
  97. AssertEquals ("bar", navigator.Name);
  98. Assert (!navigator.MoveToPrevious ());
  99. Assert (navigator.MoveToParent ());
  100. AssertEquals ("foo", navigator.Name);
  101. navigator.MoveToRoot ();
  102. AssertEquals (XPathNodeType.Root, navigator.NodeType);
  103. Assert (!navigator.MoveToParent ());
  104. AssertEquals (XPathNodeType.Root, navigator.NodeType);
  105. Assert (navigator.MoveToFirstChild ());
  106. AssertEquals ("foo", navigator.Name);
  107. Assert (navigator.MoveToFirst ());
  108. AssertEquals ("foo", navigator.Name);
  109. Assert (navigator.MoveToFirstChild ());
  110. AssertEquals ("bar", navigator.Name);
  111. Assert (navigator.MoveToNext ());
  112. AssertEquals ("baz", navigator.Name);
  113. Assert (navigator.MoveToFirst ());
  114. AssertEquals ("bar", navigator.Name);
  115. }
  116. [Test]
  117. public void MoveToAndIsSamePosition ()
  118. {
  119. XmlDocument document1 = new XmlDocument ();
  120. document1.LoadXml ("<foo><bar /></foo>");
  121. XPathNavigator navigator1a = document1.DocumentElement.CreateNavigator ();
  122. XPathNavigator navigator1b = document1.DocumentElement.CreateNavigator ();
  123. XmlDocument document2 = new XmlDocument ();
  124. document2.LoadXml ("<foo><bar /></foo>");
  125. XPathNavigator navigator2 = document2.DocumentElement.CreateNavigator ();
  126. AssertEquals ("foo", navigator1a.Name);
  127. Assert (navigator1a.MoveToFirstChild ());
  128. AssertEquals ("bar", navigator1a.Name);
  129. Assert (!navigator1b.IsSamePosition (navigator1a));
  130. AssertEquals ("foo", navigator1b.Name);
  131. Assert (navigator1b.MoveTo (navigator1a));
  132. Assert (navigator1b.IsSamePosition (navigator1a));
  133. AssertEquals ("bar", navigator1b.Name);
  134. Assert (!navigator2.IsSamePosition (navigator1a));
  135. AssertEquals ("foo", navigator2.Name);
  136. Assert (!navigator2.MoveTo (navigator1a));
  137. AssertEquals ("foo", navigator2.Name);
  138. }
  139. [Test]
  140. public void AttributeNavigation ()
  141. {
  142. document.LoadXml ("<foo bar='baz' quux='quuux' />");
  143. navigator = document.DocumentElement.CreateNavigator ();
  144. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  145. AssertEquals ("foo", navigator.Name);
  146. Assert (navigator.MoveToFirstAttribute ());
  147. AssertEquals (XPathNodeType.Attribute, navigator.NodeType);
  148. AssertEquals ("bar", navigator.Name);
  149. AssertEquals ("baz", navigator.Value);
  150. Assert (navigator.MoveToNextAttribute ());
  151. AssertEquals (XPathNodeType.Attribute, navigator.NodeType);
  152. AssertEquals ("quux", navigator.Name);
  153. AssertEquals ("quuux", navigator.Value);
  154. }
  155. [Test]
  156. public void ElementAndRootValues()
  157. {
  158. document.LoadXml ("<foo><bar>baz</bar><quux>quuux</quux></foo>");
  159. navigator = document.DocumentElement.CreateNavigator ();
  160. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  161. AssertEquals ("foo", navigator.Name);
  162. //AssertEquals ("bazquuux", navigator.Value);
  163. navigator.MoveToRoot ();
  164. //AssertEquals ("bazquuux", navigator.Value);
  165. }
  166. [Test]
  167. public void DocumentWithXmlDeclaration ()
  168. {
  169. document.LoadXml ("<?xml version=\"1.0\" standalone=\"yes\"?><Root><foo>bar</foo></Root>");
  170. navigator = document.CreateNavigator ();
  171. navigator.MoveToRoot ();
  172. navigator.MoveToFirstChild ();
  173. AssertEquals (XPathNodeType.Element, navigator.NodeType);
  174. AssertEquals ("Root", navigator.Name);
  175. }
  176. [Test]
  177. public void DocumentWithProcessingInstruction ()
  178. {
  179. document.LoadXml ("<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />");
  180. navigator = document.CreateNavigator ();
  181. Assert (navigator.MoveToFirstChild ());
  182. AssertEquals (XPathNodeType.ProcessingInstruction, navigator.NodeType);
  183. AssertEquals ("xml-stylesheet", navigator.Name);
  184. XPathNodeIterator iter = navigator.SelectChildren (XPathNodeType.Element);
  185. AssertEquals (0, iter.Count);
  186. }
  187. [Test]
  188. public void SelectFromOrphan ()
  189. {
  190. // SelectSingleNode () from node without parent.
  191. XmlDocument doc = new XmlDocument ();
  192. doc.LoadXml ("<foo><include id='original' /></foo>");
  193. XmlNode node = doc.CreateElement ("child");
  194. node.InnerXml = "<include id='new' />";
  195. XmlNode new_include = node.SelectSingleNode ("//include");
  196. AssertEquals ("<include id=\"new\" />", new_include.OuterXml);
  197. // In this case 'node2' has parent 'node'
  198. doc = new XmlDocument ();
  199. doc.LoadXml ("<foo><include id='original' /></foo>");
  200. node = doc.CreateElement ("child");
  201. XmlNode node2 = doc.CreateElement ("grandchild");
  202. node.AppendChild (node2);
  203. node2.InnerXml = "<include id='new' />";
  204. new_include = node2.SelectSingleNode ("/");
  205. AssertEquals ("<child><grandchild><include id=\"new\" /></grandchild></child>",
  206. new_include.OuterXml);
  207. }
  208. [Test]
  209. public void XPathDocumentMoveToId ()
  210. {
  211. string dtd = "<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root id ID #REQUIRED>]>";
  212. string xml = dtd + "<root id='aaa'/>";
  213. StringReader sr = new StringReader (xml);
  214. XPathNavigator nav = new XPathDocument (sr).CreateNavigator ();
  215. Assert ("ctor() from TextReader", nav.MoveToId ("aaa"));
  216. XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  217. nav = new XPathDocument (xvr).CreateNavigator ();
  218. Assert ("ctor() from XmlValidatingReader", nav.MoveToId ("aaa"));
  219. // FIXME: it seems to result in different in .NET 2.0.
  220. #if NET_2_0
  221. #else
  222. // When it is XmlTextReader, XPathDocument fails.
  223. XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
  224. nav = new XPathDocument (xtr).CreateNavigator ();
  225. Assert ("ctor() from XmlTextReader", !nav.MoveToId ("aaa"));
  226. xtr.Close ();
  227. #endif
  228. }
  229. [Test]
  230. public void SignificantWhitespaceConstruction ()
  231. {
  232. string xml = @"<root>
  233. <child xml:space='preserve'> <!-- --> </child>
  234. <child xml:space='preserve'> </child>
  235. </root>";
  236. XPathNavigator nav = new XPathDocument (
  237. new XmlTextReader (xml, XmlNodeType.Document, null),
  238. XmlSpace.Preserve).CreateNavigator ();
  239. nav.MoveToFirstChild ();
  240. nav.MoveToFirstChild ();
  241. AssertEquals ("#1", XPathNodeType.Whitespace, nav.NodeType);
  242. nav.MoveToNext ();
  243. nav.MoveToFirstChild ();
  244. AssertEquals ("#2", XPathNodeType.SignificantWhitespace,
  245. nav.NodeType);
  246. }
  247. #if NET_2_0
  248. [Test]
  249. public void ValueAsBoolean ()
  250. {
  251. string xml = "<root>1</root>";
  252. XmlDocument doc = new XmlDocument ();
  253. doc.LoadXml (xml);
  254. XPathNavigator nav = doc.CreateNavigator ();
  255. nav.MoveToFirstChild ();
  256. AssertEquals ("#1", true, nav.ValueAsBoolean);
  257. nav.MoveToFirstChild ();
  258. AssertEquals ("#2", true, nav.ValueAsBoolean);
  259. }
  260. [Test]
  261. [ExpectedException (typeof (FormatException))]
  262. public void ValueAsBooleanFail ()
  263. {
  264. string xml = "<root>1.0</root>";
  265. XmlDocument doc = new XmlDocument ();
  266. doc.LoadXml (xml);
  267. XPathNavigator nav = doc.CreateNavigator ();
  268. nav.MoveToFirstChild ();
  269. bool i = nav.ValueAsBoolean;
  270. }
  271. [Test]
  272. public void ValueAsDateTime ()
  273. {
  274. DateTime time = new DateTime (2005, 12, 13);
  275. string xml = "<root>2005-12-13</root>";
  276. XmlDocument doc = new XmlDocument ();
  277. doc.LoadXml (xml);
  278. XPathNavigator nav = doc.CreateNavigator ();
  279. nav.MoveToFirstChild ();
  280. AssertEquals ("#1", time, nav.ValueAsDateTime);
  281. nav.MoveToFirstChild ();
  282. AssertEquals ("#2", time, nav.ValueAsDateTime);
  283. }
  284. [Test]
  285. [ExpectedException (typeof (FormatException))]
  286. public void ValueAsDateTimeFail ()
  287. {
  288. string xml = "<root>dating time</root>";
  289. XmlDocument doc = new XmlDocument ();
  290. doc.LoadXml (xml);
  291. XPathNavigator nav = doc.CreateNavigator ();
  292. nav.MoveToFirstChild ();
  293. DateTime time = nav.ValueAsDateTime;
  294. }
  295. [Test]
  296. public void ValueAsDouble ()
  297. {
  298. string xml = "<root>3.14159265359</root>";
  299. XmlDocument doc = new XmlDocument ();
  300. doc.LoadXml (xml);
  301. XPathNavigator nav = doc.CreateNavigator ();
  302. nav.MoveToFirstChild ();
  303. AssertEquals ("#1", 3.14159265359, nav.ValueAsDouble);
  304. nav.MoveToFirstChild ();
  305. AssertEquals ("#2", 3.14159265359, nav.ValueAsDouble);
  306. }
  307. [Test]
  308. [ExpectedException (typeof (FormatException))]
  309. public void ValueAsDoubleFail ()
  310. {
  311. string xml = "<root>Double Dealer</root>";
  312. XmlDocument doc = new XmlDocument ();
  313. doc.LoadXml (xml);
  314. XPathNavigator nav = doc.CreateNavigator ();
  315. nav.MoveToFirstChild ();
  316. Double dealer = nav.ValueAsDouble;
  317. }
  318. [Test]
  319. public void ValueAsInt ()
  320. {
  321. string xml = "<root>1</root>";
  322. XmlDocument doc = new XmlDocument ();
  323. doc.LoadXml (xml);
  324. XPathNavigator nav = doc.CreateNavigator ();
  325. nav.MoveToFirstChild ();
  326. AssertEquals ("#1", 1, nav.ValueAsInt);
  327. nav.MoveToFirstChild ();
  328. AssertEquals ("#2", 1, nav.ValueAsInt);
  329. }
  330. [Test]
  331. // Here, it seems to be using XQueryConvert (whatever was called)
  332. [ExpectedException (typeof (FormatException))]
  333. public void ValueAsIntFail ()
  334. {
  335. string xml = "<root>1.0</root>";
  336. XmlDocument doc = new XmlDocument ();
  337. doc.LoadXml (xml);
  338. XPathNavigator nav = doc.CreateNavigator ();
  339. nav.MoveToFirstChild ();
  340. int i = nav.ValueAsInt;
  341. }
  342. [Test]
  343. public void ValueAsLong ()
  344. {
  345. string xml = "<root>10000000000000000</root>";
  346. XmlDocument doc = new XmlDocument ();
  347. doc.LoadXml (xml);
  348. XPathNavigator nav = doc.CreateNavigator ();
  349. nav.MoveToFirstChild ();
  350. AssertEquals ("#1", 10000000000000000, nav.ValueAsLong);
  351. nav.MoveToFirstChild ();
  352. AssertEquals ("#2", 10000000000000000, nav.ValueAsLong);
  353. }
  354. [Test]
  355. // Here, it seems to be using XQueryConvert (whatever was called)
  356. [ExpectedException (typeof (FormatException))]
  357. public void ValueAsLongFail ()
  358. {
  359. string xml = "<root>0x10000000000000000</root>";
  360. XmlDocument doc = new XmlDocument ();
  361. doc.LoadXml (xml);
  362. XPathNavigator nav = doc.CreateNavigator ();
  363. nav.MoveToFirstChild ();
  364. long l = nav.ValueAsLong;
  365. }
  366. #endif
  367. }
  368. }