XPathNavigatorTests.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. //
  2. // MonoTests.System.Xml.XPathNavigatorTests
  3. //
  4. // Authors:
  5. // Jason Diamond <[email protected]>
  6. // Martin Willemoes Hansen <[email protected]>
  7. // Atsushi Enomoto <[email protected]>
  8. //
  9. // (C) 2002 Jason Diamond
  10. // (C) 2003 Martin Willemoes Hansen
  11. // (C) 2004-2006 Novell, Inc.
  12. //
  13. using System;
  14. using System.IO;
  15. using System.Xml;
  16. using System.Xml.XPath;
  17. using System.Xml.Xsl;
  18. using NUnit.Framework;
  19. namespace MonoTests.System.Xml
  20. {
  21. [TestFixture]
  22. public class XPathNavigatorTests
  23. {
  24. XmlDocument document;
  25. XPathNavigator navigator;
  26. [SetUp]
  27. public void GetReady ()
  28. {
  29. document = new XmlDocument ();
  30. }
  31. [Test]
  32. public void CreateNavigator ()
  33. {
  34. document.LoadXml ("<foo />");
  35. navigator = document.CreateNavigator ();
  36. Assert.IsNotNull (navigator);
  37. }
  38. [Test]
  39. public void PropertiesOnDocument ()
  40. {
  41. document.LoadXml ("<foo:bar xmlns:foo='#foo' />");
  42. navigator = document.CreateNavigator ();
  43. Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#1");
  44. Assert.AreEqual (String.Empty, navigator.Name, "#2");
  45. Assert.AreEqual (String.Empty, navigator.LocalName, "#3");
  46. Assert.AreEqual (String.Empty, navigator.NamespaceURI, "#4");
  47. Assert.AreEqual (String.Empty, navigator.Prefix, "#5");
  48. Assert.IsTrue (!navigator.HasAttributes, "#6");
  49. Assert.IsTrue (navigator.HasChildren, "#7");
  50. Assert.IsTrue (!navigator.IsEmptyElement, "#8");
  51. }
  52. [Test]
  53. public void PropertiesOnElement ()
  54. {
  55. document.LoadXml ("<foo:bar xmlns:foo='#foo' />");
  56. navigator = document.DocumentElement.CreateNavigator ();
  57. Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1");
  58. Assert.AreEqual ("foo:bar", navigator.Name, "#2");
  59. Assert.AreEqual ("bar", navigator.LocalName, "#3");
  60. Assert.AreEqual ("#foo", navigator.NamespaceURI, "#4");
  61. Assert.AreEqual ("foo", navigator.Prefix, "#5");
  62. Assert.IsTrue (!navigator.HasAttributes, "#6");
  63. Assert.IsTrue (!navigator.HasChildren, "#7");
  64. Assert.IsTrue (navigator.IsEmptyElement, "#8");
  65. }
  66. [Test]
  67. public void PropertiesOnAttribute ()
  68. {
  69. document.LoadXml ("<foo bar:baz='quux' xmlns:bar='#bar' />");
  70. navigator = document.DocumentElement.GetAttributeNode("baz", "#bar").CreateNavigator ();
  71. Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#1");
  72. Assert.AreEqual ("bar:baz", navigator.Name, "#2");
  73. Assert.AreEqual ("baz", navigator.LocalName, "#3");
  74. Assert.AreEqual ("#bar", navigator.NamespaceURI, "#4");
  75. Assert.AreEqual ("bar", navigator.Prefix, "#5");
  76. Assert.IsTrue (!navigator.HasAttributes, "#6");
  77. Assert.IsTrue (!navigator.HasChildren, "#7");
  78. Assert.IsTrue (!navigator.IsEmptyElement, "#8");
  79. }
  80. [Test]
  81. public void PropertiesOnNamespace ()
  82. {
  83. document.LoadXml ("<root xmlns='urn:foo' />");
  84. navigator = document.DocumentElement.Attributes [0].CreateNavigator ();
  85. Assert.AreEqual (XPathNodeType.Namespace, navigator.NodeType, "#1");
  86. }
  87. [Test]
  88. public void Navigation ()
  89. {
  90. document.LoadXml ("<foo><bar /><baz /></foo>");
  91. navigator = document.DocumentElement.CreateNavigator ();
  92. Assert.AreEqual ("foo", navigator.Name, "#1");
  93. Assert.IsTrue (navigator.MoveToFirstChild (), "#2");
  94. Assert.AreEqual ("bar", navigator.Name, "#3");
  95. Assert.IsTrue (navigator.MoveToNext (), "#4");
  96. Assert.AreEqual ("baz", navigator.Name, "#5");
  97. Assert.IsTrue (!navigator.MoveToNext (), "#6");
  98. Assert.AreEqual ("baz", navigator.Name, "#7");
  99. Assert.IsTrue (navigator.MoveToPrevious (), "#8");
  100. Assert.AreEqual ("bar", navigator.Name, "#9");
  101. Assert.IsTrue (!navigator.MoveToPrevious (), "#10");
  102. Assert.IsTrue (navigator.MoveToParent (), "#11");
  103. Assert.AreEqual ("foo", navigator.Name, "#12");
  104. navigator.MoveToRoot ();
  105. Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#13");
  106. Assert.IsTrue (!navigator.MoveToParent (), "#14");
  107. Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#15");
  108. Assert.IsTrue (navigator.MoveToFirstChild (), "#16");
  109. Assert.AreEqual ("foo", navigator.Name, "#17");
  110. Assert.IsTrue (navigator.MoveToFirst (), "#18");
  111. Assert.AreEqual ("foo", navigator.Name, "#19");
  112. Assert.IsTrue (navigator.MoveToFirstChild (), "#20");
  113. Assert.AreEqual ("bar", navigator.Name, "#21");
  114. Assert.IsTrue (navigator.MoveToNext (), "#22");
  115. Assert.AreEqual ("baz", navigator.Name, "#23");
  116. Assert.IsTrue (navigator.MoveToFirst (), "#24");
  117. Assert.AreEqual ("bar", navigator.Name, "#25");
  118. }
  119. [Test]
  120. public void MoveToAndIsSamePosition ()
  121. {
  122. XmlDocument document1 = new XmlDocument ();
  123. document1.LoadXml ("<foo><bar /></foo>");
  124. XPathNavigator navigator1a = document1.DocumentElement.CreateNavigator ();
  125. XPathNavigator navigator1b = document1.DocumentElement.CreateNavigator ();
  126. XmlDocument document2 = new XmlDocument ();
  127. document2.LoadXml ("<foo><bar /></foo>");
  128. XPathNavigator navigator2 = document2.DocumentElement.CreateNavigator ();
  129. Assert.AreEqual ("foo", navigator1a.Name, "#1");
  130. Assert.IsTrue (navigator1a.MoveToFirstChild (), "#2");
  131. Assert.AreEqual ("bar", navigator1a.Name, "#3");
  132. Assert.IsTrue (!navigator1b.IsSamePosition (navigator1a), "#4");
  133. Assert.AreEqual ("foo", navigator1b.Name, "#5");
  134. Assert.IsTrue (navigator1b.MoveTo (navigator1a), "#6");
  135. Assert.IsTrue (navigator1b.IsSamePosition (navigator1a), "#7");
  136. Assert.AreEqual ("bar", navigator1b.Name, "#8");
  137. Assert.IsTrue (!navigator2.IsSamePosition (navigator1a), "#9");
  138. Assert.AreEqual ("foo", navigator2.Name, "#10");
  139. Assert.IsTrue (!navigator2.MoveTo (navigator1a), "#11");
  140. Assert.AreEqual ("foo", navigator2.Name, "#12");
  141. }
  142. [Test]
  143. public void AttributeNavigation ()
  144. {
  145. document.LoadXml ("<foo bar='baz' quux='quuux' />");
  146. navigator = document.DocumentElement.CreateNavigator ();
  147. Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1");
  148. Assert.AreEqual ("foo", navigator.Name, "#2");
  149. Assert.IsTrue (navigator.MoveToFirstAttribute (), "#3");
  150. Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#4");
  151. Assert.AreEqual ("bar", navigator.Name, "#5");
  152. Assert.AreEqual ("baz", navigator.Value, "#6");
  153. Assert.IsTrue (navigator.MoveToNextAttribute (), "#7");
  154. Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#8");
  155. Assert.AreEqual ("quux", navigator.Name, "#9");
  156. Assert.AreEqual ("quuux", navigator.Value, "#10");
  157. }
  158. [Test]
  159. public void ElementAndRootValues()
  160. {
  161. document.LoadXml ("<foo><bar>baz</bar><quux>quuux</quux></foo>");
  162. navigator = document.DocumentElement.CreateNavigator ();
  163. Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1");
  164. Assert.AreEqual ("foo", navigator.Name, "#2");
  165. //Assert.AreEqual ("bazquuux", navigator.Value, "#3");
  166. navigator.MoveToRoot ();
  167. //Assert.AreEqual ("bazquuux", navigator.Value, "#4");
  168. }
  169. [Test]
  170. public void DocumentWithXmlDeclaration ()
  171. {
  172. document.LoadXml ("<?xml version=\"1.0\" standalone=\"yes\"?><Root><foo>bar</foo></Root>");
  173. navigator = document.CreateNavigator ();
  174. navigator.MoveToRoot ();
  175. navigator.MoveToFirstChild ();
  176. Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1");
  177. Assert.AreEqual ("Root", navigator.Name, "#2");
  178. }
  179. [Test]
  180. public void DocumentWithProcessingInstruction ()
  181. {
  182. document.LoadXml ("<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />");
  183. navigator = document.CreateNavigator ();
  184. Assert.IsTrue (navigator.MoveToFirstChild ());
  185. Assert.AreEqual (XPathNodeType.ProcessingInstruction, navigator.NodeType, "#1");
  186. Assert.AreEqual ("xml-stylesheet", navigator.Name, "#2");
  187. XPathNodeIterator iter = navigator.SelectChildren (XPathNodeType.Element);
  188. Assert.AreEqual (0, iter.Count, "#3");
  189. }
  190. [Test]
  191. public void SelectFromOrphan ()
  192. {
  193. // SelectSingleNode () from node without parent.
  194. XmlDocument doc = new XmlDocument ();
  195. doc.LoadXml ("<foo><include id='original' /></foo>");
  196. XmlNode node = doc.CreateElement ("child");
  197. node.InnerXml = "<include id='new' />";
  198. XmlNode new_include = node.SelectSingleNode ("//include");
  199. Assert.AreEqual ("<include id=\"new\" />", new_include.OuterXml, "#1");
  200. // In this case 'node2' has parent 'node'
  201. doc = new XmlDocument ();
  202. doc.LoadXml ("<foo><include id='original' /></foo>");
  203. node = doc.CreateElement ("child");
  204. XmlNode node2 = doc.CreateElement ("grandchild");
  205. node.AppendChild (node2);
  206. node2.InnerXml = "<include id='new' />";
  207. new_include = node2.SelectSingleNode ("/");
  208. Assert.AreEqual ("<child><grandchild><include id=\"new\" /></grandchild></child>",
  209. new_include.OuterXml, "#2");
  210. }
  211. [Test]
  212. public void XPathDocumentMoveToId ()
  213. {
  214. string dtd = "<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root id ID #REQUIRED>]>";
  215. string xml = dtd + "<root id='aaa'/>";
  216. StringReader sr = new StringReader (xml);
  217. XPathNavigator nav = new XPathDocument (sr).CreateNavigator ();
  218. Assert.IsTrue (nav.MoveToId ("aaa"), "ctor() from TextReader");
  219. XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  220. nav = new XPathDocument (xvr).CreateNavigator ();
  221. Assert.IsTrue (nav.MoveToId ("aaa"), "ctor() from XmlValidatingReader");
  222. // FIXME: it seems to result in different in .NET 2.0.
  223. }
  224. [Test]
  225. public void SignificantWhitespaceConstruction ()
  226. {
  227. string xml = @"<root>
  228. <child xml:space='preserve'> <!-- --> </child>
  229. <child xml:space='preserve'> </child>
  230. </root>";
  231. XPathNavigator nav = new XPathDocument (
  232. new XmlTextReader (xml, XmlNodeType.Document, null),
  233. XmlSpace.Preserve).CreateNavigator ();
  234. nav.MoveToFirstChild ();
  235. nav.MoveToFirstChild ();
  236. Assert.AreEqual (XPathNodeType.Whitespace, nav.NodeType, "#1");
  237. nav.MoveToNext ();
  238. nav.MoveToFirstChild ();
  239. Assert.AreEqual (XPathNodeType.SignificantWhitespace,
  240. nav.NodeType, "#2");
  241. }
  242. [Test]
  243. public void VariableReference ()
  244. {
  245. XPathDocument xpd = new XPathDocument (
  246. new StringReader ("<root>sample text</root>"));
  247. XPathNavigator nav = xpd.CreateNavigator ();
  248. XPathExpression expr = nav.Compile ("foo(string(.),$idx)");
  249. XsltArgumentList args = new XsltArgumentList ();
  250. args.AddParam ("idx", "", 5);
  251. MyContext ctx = new MyContext (nav.NameTable as NameTable, args);
  252. ctx.AddNamespace ("x", "urn:foo");
  253. expr.SetContext (ctx);
  254. XPathNodeIterator iter = nav.Select ("/root");
  255. iter.MoveNext ();
  256. Assert.AreEqual ("e", iter.Current.Evaluate (expr), "#1");
  257. }
  258. class MyContext : XsltContext
  259. {
  260. XsltArgumentList args;
  261. public MyContext (NameTable nt, XsltArgumentList args)
  262. : base (nt)
  263. {
  264. this.args = args;
  265. }
  266. public override IXsltContextFunction ResolveFunction (
  267. string prefix, string name, XPathResultType [] argtypes)
  268. {
  269. if (name == "foo")
  270. return new MyFunction (argtypes);
  271. return null;
  272. }
  273. public override IXsltContextVariable ResolveVariable (string prefix, string name)
  274. {
  275. return new MyVariable (name);
  276. }
  277. public override bool PreserveWhitespace (XPathNavigator nav)
  278. {
  279. return false;
  280. }
  281. public override int CompareDocument (string uri1, string uri2)
  282. {
  283. return String.CompareOrdinal (uri1, uri2);
  284. }
  285. public override bool Whitespace {
  286. get { return false; }
  287. }
  288. public object GetParam (string name, string ns)
  289. {
  290. return args.GetParam (name, ns);
  291. }
  292. }
  293. public class MyFunction : IXsltContextFunction
  294. {
  295. XPathResultType [] argtypes;
  296. public MyFunction (XPathResultType [] argtypes)
  297. {
  298. this.argtypes = argtypes;
  299. }
  300. public XPathResultType [] ArgTypes {
  301. get { return argtypes; }
  302. }
  303. public int Maxargs {
  304. get { return 2; }
  305. }
  306. public int Minargs {
  307. get { return 2; }
  308. }
  309. public XPathResultType ReturnType {
  310. get { return XPathResultType.String; }
  311. }
  312. public object Invoke (XsltContext xsltContext,
  313. object [] args, XPathNavigator instanceContext)
  314. {
  315. return ((string) args [0]) [(int) (double) args [1]].ToString ();
  316. }
  317. }
  318. public class MyVariable : IXsltContextVariable
  319. {
  320. string name;
  321. public MyVariable (string name)
  322. {
  323. this.name = name;
  324. }
  325. public object Evaluate (XsltContext ctx)
  326. {
  327. return ((MyContext) ctx).GetParam (name, String.Empty);
  328. }
  329. public bool IsLocal {
  330. get { return false; }
  331. }
  332. public bool IsParam {
  333. get { return false; }
  334. }
  335. public XPathResultType VariableType {
  336. get { return XPathResultType.Any; }
  337. }
  338. }
  339. [Test]
  340. public void TextMatchesWhitespace ()
  341. {
  342. string xml = "<root><ws> </ws><sws xml:space='preserve'> </sws></root>";
  343. XmlDocument doc = new XmlDocument ();
  344. doc.PreserveWhitespace = true;
  345. doc.LoadXml (xml);
  346. XPathNavigator nav = doc.CreateNavigator ();
  347. nav.MoveToFirstChild (); // root
  348. nav.MoveToFirstChild (); // ws
  349. nav.MoveToFirstChild (); // ' '
  350. Assert.AreEqual (true, nav.Matches ("text()"), "#1");
  351. nav.MoveToParent ();
  352. nav.MoveToNext (); // sws
  353. nav.MoveToFirstChild (); // ' '
  354. Assert.AreEqual (true, nav.Matches ("text()"), "#2");
  355. }
  356. [Test]
  357. public void Bug456103 ()
  358. {
  359. XmlDocument doc = new XmlDocument ();
  360. doc.LoadXml ("<root><X/></root>");
  361. XPathNavigator nav = doc.DocumentElement.CreateNavigator ();
  362. // ".//*" does not reproduce the bug.
  363. var i = nav.Select ("descendant::*");
  364. // without this call to get_Count() the bug does not reproduce.
  365. Assert.AreEqual (1, i.Count, "#1");
  366. Assert.IsTrue (i.MoveNext (), "#2");
  367. }
  368. [Test]
  369. public void ValueAsBoolean ()
  370. {
  371. string xml = "<root>1</root>";
  372. XmlDocument doc = new XmlDocument ();
  373. doc.LoadXml (xml);
  374. XPathNavigator nav = doc.CreateNavigator ();
  375. nav.MoveToFirstChild ();
  376. Assert.AreEqual (true, nav.ValueAsBoolean, "#1");
  377. nav.MoveToFirstChild ();
  378. Assert.AreEqual (true, nav.ValueAsBoolean, "#2");
  379. }
  380. [Test]
  381. [ExpectedException (typeof (FormatException))]
  382. public void ValueAsBooleanFail ()
  383. {
  384. string xml = "<root>1.0</root>";
  385. XmlDocument doc = new XmlDocument ();
  386. doc.LoadXml (xml);
  387. XPathNavigator nav = doc.CreateNavigator ();
  388. nav.MoveToFirstChild ();
  389. bool i = nav.ValueAsBoolean;
  390. }
  391. [Test]
  392. public void ValueAsDateTime ()
  393. {
  394. DateTime time = new DateTime (2005, 12, 13);
  395. string xml = "<root>2005-12-13</root>";
  396. XmlDocument doc = new XmlDocument ();
  397. doc.LoadXml (xml);
  398. XPathNavigator nav = doc.CreateNavigator ();
  399. nav.MoveToFirstChild ();
  400. Assert.AreEqual (time, nav.ValueAsDateTime, "#1");
  401. nav.MoveToFirstChild ();
  402. Assert.AreEqual (time, nav.ValueAsDateTime, "#2");
  403. }
  404. [Test]
  405. [ExpectedException (typeof (FormatException))]
  406. public void ValueAsDateTimeFail ()
  407. {
  408. string xml = "<root>dating time</root>";
  409. XmlDocument doc = new XmlDocument ();
  410. doc.LoadXml (xml);
  411. XPathNavigator nav = doc.CreateNavigator ();
  412. nav.MoveToFirstChild ();
  413. DateTime time = nav.ValueAsDateTime;
  414. }
  415. [Test]
  416. public void ValueAsDouble ()
  417. {
  418. string xml = "<root>3.14159265359</root>";
  419. XmlDocument doc = new XmlDocument ();
  420. doc.LoadXml (xml);
  421. XPathNavigator nav = doc.CreateNavigator ();
  422. nav.MoveToFirstChild ();
  423. Assert.AreEqual (3.14159265359, nav.ValueAsDouble, "#1");
  424. nav.MoveToFirstChild ();
  425. Assert.AreEqual (3.14159265359, nav.ValueAsDouble, "#2");
  426. }
  427. [Test]
  428. [ExpectedException (typeof (FormatException))]
  429. public void ValueAsDoubleFail ()
  430. {
  431. string xml = "<root>Double Dealer</root>";
  432. XmlDocument doc = new XmlDocument ();
  433. doc.LoadXml (xml);
  434. XPathNavigator nav = doc.CreateNavigator ();
  435. nav.MoveToFirstChild ();
  436. Double dealer = nav.ValueAsDouble;
  437. }
  438. [Test]
  439. public void ValueAsInt ()
  440. {
  441. string xml = "<root>1</root>";
  442. XmlDocument doc = new XmlDocument ();
  443. doc.LoadXml (xml);
  444. XPathNavigator nav = doc.CreateNavigator ();
  445. nav.MoveToFirstChild ();
  446. Assert.AreEqual (1, nav.ValueAsInt, "#1");
  447. nav.MoveToFirstChild ();
  448. Assert.AreEqual (1, nav.ValueAsInt, "#2");
  449. }
  450. [Test]
  451. // Here, it seems to be using XQueryConvert (whatever was called)
  452. [ExpectedException (typeof (FormatException))]
  453. public void ValueAsIntFail ()
  454. {
  455. string xml = "<root>1.0</root>";
  456. XmlDocument doc = new XmlDocument ();
  457. doc.LoadXml (xml);
  458. XPathNavigator nav = doc.CreateNavigator ();
  459. nav.MoveToFirstChild ();
  460. int i = nav.ValueAsInt;
  461. }
  462. [Test]
  463. public void ValueAsLong ()
  464. {
  465. string xml = "<root>10000000000000000</root>";
  466. XmlDocument doc = new XmlDocument ();
  467. doc.LoadXml (xml);
  468. XPathNavigator nav = doc.CreateNavigator ();
  469. nav.MoveToFirstChild ();
  470. Assert.AreEqual (10000000000000000, nav.ValueAsLong, "#1");
  471. nav.MoveToFirstChild ();
  472. Assert.AreEqual (10000000000000000, nav.ValueAsLong, "#2");
  473. }
  474. [Test]
  475. // Here, it seems to be using XQueryConvert (whatever was called)
  476. [ExpectedException (typeof (FormatException))]
  477. public void ValueAsLongFail ()
  478. {
  479. string xml = "<root>0x10000000000000000</root>";
  480. XmlDocument doc = new XmlDocument ();
  481. doc.LoadXml (xml);
  482. XPathNavigator nav = doc.CreateNavigator ();
  483. nav.MoveToFirstChild ();
  484. long l = nav.ValueAsLong;
  485. }
  486. [Test] // bug #79874
  487. public void InnerXmlText ()
  488. {
  489. StringReader sr = new StringReader ("<Abc><Foo>Hello</Foo></Abc>");
  490. XPathDocument doc = new XPathDocument (sr);
  491. XPathNavigator nav = doc.CreateNavigator ();
  492. XPathNodeIterator iter = nav.Select ("/Abc/Foo");
  493. iter.MoveNext ();
  494. Assert.AreEqual ("Hello", iter.Current.InnerXml, "#1");
  495. Assert.AreEqual ("<Foo>Hello</Foo>", iter.Current.OuterXml, "#2");
  496. iter = nav.Select ("/Abc/Foo/text()");
  497. iter.MoveNext ();
  498. Assert.AreEqual (String.Empty, iter.Current.InnerXml, "#3");
  499. Assert.AreEqual ("Hello", iter.Current.OuterXml, "#4");
  500. }
  501. [Test] // bug #79875
  502. public void InnerXmlAttribute ()
  503. {
  504. StringReader sr = new StringReader ("<Abc><Foo attr='val1'/></Abc>");
  505. XPathDocument doc = new XPathDocument (sr);
  506. XPathNavigator nav = doc.CreateNavigator ();
  507. XPathNodeIterator iter = nav.Select ("/Abc/Foo/@attr");
  508. iter.MoveNext ();
  509. Assert.AreEqual ("val1", iter.Current.InnerXml, "#1");
  510. }
  511. string AlterNewLine (string s)
  512. {
  513. return s.Replace ("\r\n", Environment.NewLine);
  514. }
  515. [Test]
  516. public void InnerXmlTextEscape ()
  517. {
  518. StringReader sr = new StringReader ("<Abc><Foo>Hello&lt;\r\nInnerXml</Foo></Abc>");
  519. XPathDocument doc = new XPathDocument (sr);
  520. XPathNavigator nav = doc.CreateNavigator ();
  521. XPathNodeIterator iter = nav.Select ("/Abc/Foo");
  522. iter.MoveNext ();
  523. Assert.AreEqual (AlterNewLine ("Hello&lt;\r\nInnerXml"), iter.Current.InnerXml, "#1");
  524. Assert.AreEqual (AlterNewLine ("<Foo>Hello&lt;\r\nInnerXml</Foo>"), iter.Current.OuterXml, "#2");
  525. iter = nav.Select ("/Abc/Foo/text()");
  526. iter.MoveNext ();
  527. Assert.AreEqual (String.Empty, iter.Current.InnerXml, "#3");
  528. Assert.AreEqual (AlterNewLine ("Hello&lt;\r\nInnerXml"), iter.Current.OuterXml, "#4");
  529. }
  530. [Test]
  531. [Category ("NotDotNet")] // .NET bug; it should escape value
  532. [Ignore ("Bug in Microsoft reference source")]
  533. public void InnerXmlAttributeEscape ()
  534. {
  535. StringReader sr = new StringReader ("<Abc><Foo attr='val&quot;1&#13;&#10;&gt;'/></Abc>");
  536. XPathDocument doc = new XPathDocument (sr);
  537. XPathNavigator nav = doc.CreateNavigator ();
  538. XPathNodeIterator iter = nav.Select ("/Abc/Foo/@attr");
  539. iter.MoveNext ();
  540. Assert.AreEqual ("val&quot;1&#10;&gt;", iter.Current.InnerXml, "#1");
  541. }
  542. [Test]
  543. public void WriterAttributePrefix ()
  544. {
  545. XmlDocument doc = new XmlDocument ();
  546. XmlWriter w = doc.CreateNavigator ().AppendChild ();
  547. w.WriteStartElement ("foo");
  548. w.WriteAttributeString ("xmlns", "x", "http://www.w3.org/2000/xmlns/", "urn:foo");
  549. Assert.AreEqual ("x", w.LookupPrefix ("urn:foo"), "#0");
  550. w.WriteStartElement (null, "bar", "urn:foo");
  551. w.WriteAttributeString (null, "ext", "urn:foo", "bah");
  552. w.WriteEndElement ();
  553. w.WriteEndElement ();
  554. w.Close ();
  555. Assert.AreEqual ("x", doc.FirstChild.FirstChild.Prefix, "#1");
  556. Assert.AreEqual ("x", doc.FirstChild.FirstChild.Attributes [0].Prefix, "#2");
  557. }
  558. [Test]
  559. public void ValueAs ()
  560. {
  561. string xml = "<root>1</root>";
  562. XPathNavigator nav = new XPathDocument (XmlReader.Create (new StringReader (xml))).CreateNavigator ();
  563. nav.MoveToFirstChild ();
  564. nav.MoveToFirstChild ();
  565. Assert.AreEqual ("1", nav.ValueAs (typeof (string), null), "#1");
  566. Assert.AreEqual (1, nav.ValueAs (typeof (int), null), "#2");
  567. }
  568. [Test]
  569. public void MoveToFollowingNodeTypeAll ()
  570. {
  571. XmlDocument doc = new XmlDocument ();
  572. doc.LoadXml ("<root><child/><child2/></root>");
  573. XPathNavigator nav = doc.CreateNavigator ();
  574. Assert.IsTrue (nav.MoveToFollowing (XPathNodeType.All), "#1");
  575. Assert.IsTrue (nav.MoveToFollowing (XPathNodeType.All), "#2");
  576. Assert.AreEqual ("child", nav.LocalName, "#3");
  577. Assert.IsTrue (nav.MoveToNext (XPathNodeType.All), "#4");
  578. Assert.AreEqual ("child2", nav.LocalName, "#5");
  579. }
  580. [Test] // bug #324606.
  581. public void XPathDocumentFromSubtreeNodes ()
  582. {
  583. string xml = "<root><child1><nest1><nest2>hello!</nest2></nest1></child1><child2/><child3/></root>";
  584. XmlReader r = new XmlTextReader (new StringReader (xml));
  585. while (r.Read ()) {
  586. if (r.Name == "child1")
  587. break;
  588. }
  589. XPathDocument d = new XPathDocument (r);
  590. XPathNavigator n = d.CreateNavigator ();
  591. string result = @"<child1>
  592. <nest1>
  593. <nest2>hello!</nest2>
  594. </nest1>
  595. </child1>
  596. <child2 />
  597. <child3 />";
  598. Assert.AreEqual (result, n.OuterXml.Replace ("\r\n", "\n"), "#1");
  599. }
  600. [Test] // bug #376191
  601. public void InnerXmlOnRoot ()
  602. {
  603. XmlDocument document = new XmlDocument ();
  604. document.LoadXml (@"<test>
  605. <node>z</node>
  606. <node>a</node>
  607. <node>b</node>
  608. <node>q</node>
  609. </test>");
  610. XPathNavigator navigator = document.CreateNavigator();
  611. Assert.AreEqual (navigator.OuterXml, navigator.InnerXml, "#1");
  612. }
  613. [Test] // bug #515136
  614. public void SelectChildrenEmpty ()
  615. {
  616. string s = "<root> <foo> </foo> </root>";
  617. XPathDocument doc = new XPathDocument (new StringReader (s));
  618. XPathNavigator nav = doc.CreateNavigator ();
  619. XPathNodeIterator it = nav.SelectChildren (String.Empty, String.Empty);
  620. foreach (XPathNavigator xpn in it)
  621. return;
  622. Assert.Fail ("no selection");
  623. }
  624. }
  625. }