| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- //
- // MonoTests.System.Xml.XPathNavigatorCommonTests
- //
- // Author:
- // Atsushi Enomoto <[email protected]>
- //
- // (C) 2003 Atsushi Enomoto
- //
- using System;
- using System.IO;
- using System.Xml;
- using System.Xml.XPath;
- using NUnit.Framework;
- namespace MonoTests.System.Xml
- {
- [TestFixture]
- public class XPathNavigatorCommonTests : Assertion
- {
- XmlDocument document;
- XPathNavigator nav;
- XPathDocument xpathDocument;
- [SetUp]
- public void GetReady ()
- {
- document = new XmlDocument ();
- }
- private XPathNavigator GetXmlDocumentNavigator (string xml)
- {
- document.LoadXml (xml);
- return document.CreateNavigator ();
- }
-
- private XPathNavigator GetXPathDocumentNavigator (XmlNode node)
- {
- XmlNodeReader xr = new XmlNodeReader (node);
- xpathDocument = new XPathDocument (xr);
- return xpathDocument.CreateNavigator ();
- }
- private void AssertNavigator (string label, XPathNavigator nav, XPathNodeType type, string prefix, string localName, string ns, string name, string value, bool hasAttributes, bool hasChildren, bool isEmptyElement)
- {
- label += nav.GetType ();
- AssertEquals (label + "NodeType", type, nav.NodeType);
- AssertEquals (label + "Prefix", prefix, nav.Prefix);
- AssertEquals (label + "LocalName", localName, nav.LocalName);
- AssertEquals (label + "Namespace", ns, nav.NamespaceURI);
- AssertEquals (label + "Name", name, nav.Name);
- AssertEquals (label + "Value", value, nav.Value);
- AssertEquals (label + "HasAttributes", hasAttributes, nav.HasAttributes);
- AssertEquals (label + "HasChildren", hasChildren, nav.HasChildren);
- AssertEquals (label + "IsEmptyElement", isEmptyElement, nav.IsEmptyElement);
- }
- [Test]
- public void DocumentWithXmlDeclaration ()
- {
- string xml = "<?xml version=\"1.0\" standalone=\"yes\"?><foo>bar</foo>";
- nav = GetXmlDocumentNavigator (xml);
- DocumentWithXmlDeclaration (nav);
- nav = GetXPathDocumentNavigator (document);
- DocumentWithXmlDeclaration (nav);
- }
- public void DocumentWithXmlDeclaration (XPathNavigator nav)
- {
- nav.MoveToFirstChild ();
- AssertNavigator ("#1", nav, XPathNodeType.Element, "", "foo", "", "foo", "bar", false, true, false);
- }
- [Test]
- public void DocumentWithProcessingInstruction ()
- {
- string xml = "<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />";
- nav = GetXmlDocumentNavigator (xml);
- DocumentWithProcessingInstruction (nav);
- nav = GetXPathDocumentNavigator (document);
- DocumentWithProcessingInstruction (nav);
- }
- public void DocumentWithProcessingInstruction (XPathNavigator nav)
- {
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#1", nav, XPathNodeType.ProcessingInstruction, "", "xml-stylesheet", "", "xml-stylesheet", "href='foo.xsl' type='text/xsl' ", false, false, false);
- Assert (!nav.MoveToFirstChild ());
- }
- [Test]
- public void XmlRootElementOnly ()
- {
- string xml = "<foo />";
- nav = GetXmlDocumentNavigator (xml);
- XmlRootElementOnly (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlRootElementOnly (nav);
- }
- private void XmlRootElementOnly (XPathNavigator nav)
- {
- AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, false, true);
- Assert (!nav.MoveToFirstChild ());
- Assert (!nav.MoveToNext ());
- Assert (!nav.MoveToPrevious ());
- nav.MoveToRoot ();
- AssertNavigator ("#3", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (!nav.MoveToNext ());
- }
- [Test]
- public void XmlSimpleTextContent ()
- {
- string xml = "<foo>Test.</foo>";
- nav = GetXmlDocumentNavigator (xml);
- XmlSimpleTextContent (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlSimpleTextContent (nav);
- }
- private void XmlSimpleTextContent (XPathNavigator nav)
- {
- AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false);
- Assert (!nav.MoveToNext ());
- Assert (!nav.MoveToPrevious ());
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#3", nav, XPathNodeType.Text, "", "", "", "", "Test.", false, false, false);
- Assert (nav.MoveToParent ());
- AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false);
- Assert (nav.MoveToParent ());
- AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
- nav.MoveToFirstChild ();
- nav.MoveToFirstChild ();
- nav.MoveToRoot ();
- AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
- Assert (!nav.MoveToNext ());
- }
- [Test]
- public void XmlSimpleElementContent ()
- {
- string xml = "<foo><bar /></foo>";
- nav = GetXmlDocumentNavigator (xml);
- XmlSimpleElementContent (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlSimpleElementContent (nav);
- }
- private void XmlSimpleElementContent (XPathNavigator nav)
- {
- AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
- Assert (!nav.MoveToNext ());
- Assert (!nav.MoveToPrevious ());
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
- Assert (nav.MoveToParent ());
- AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
- nav.MoveToRoot ();
- AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (!nav.MoveToNext ());
- }
- [Test]
- public void XmlTwoElementsContent ()
- {
- string xml = "<foo><bar /><baz /></foo>";
- nav = GetXmlDocumentNavigator (xml);
- XmlTwoElementsContent (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlTwoElementsContent (nav);
- }
- private void XmlTwoElementsContent (XPathNavigator nav)
- {
- AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
- Assert (!nav.MoveToNext ());
- Assert (!nav.MoveToPrevious ());
- Assert (nav.MoveToFirstChild ());
- AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
- Assert (!nav.MoveToFirstChild ());
- Assert (nav.MoveToNext ());
- AssertNavigator ("#4", nav, XPathNodeType.Element, "", "baz", "", "baz", "", false, false, true);
- Assert (!nav.MoveToFirstChild ());
- Assert (nav.MoveToPrevious ());
- AssertNavigator ("#5", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
- nav.MoveToRoot ();
- AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- Assert (!nav.MoveToNext ());
- }
- [Test]
- public void XmlElementWithAttributes ()
- {
- string xml = "<img src='foo.png' alt='image Fooooooo!' />";
- nav = GetXmlDocumentNavigator (xml);
- XmlElementWithAttributes (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlElementWithAttributes (nav);
- }
- private void XmlElementWithAttributes (XPathNavigator nav)
- {
- nav.MoveToFirstChild ();
- AssertNavigator ("#1", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true);
- Assert (!nav.MoveToNext ());
- Assert (!nav.MoveToPrevious ());
- Assert (nav.MoveToFirstAttribute ());
- AssertNavigator ("#2", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false);
- Assert (!nav.MoveToFirstAttribute ()); // On attributes, it fails.
- Assert (nav.MoveToNextAttribute ());
- AssertNavigator ("#3", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false);
- Assert (!nav.MoveToNextAttribute ());
- Assert (nav.MoveToParent ());
- AssertNavigator ("#4", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true);
- Assert (nav.MoveToAttribute ("alt", ""));
- AssertNavigator ("#5", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false);
- Assert (!nav.MoveToAttribute ("src", "")); // On attributes, it fails.
- Assert (nav.MoveToParent ());
- Assert (nav.MoveToAttribute ("src", ""));
- AssertNavigator ("#6", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false);
- nav.MoveToRoot ();
- AssertNavigator ("#7", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
- }
- [Test]
- // seems like MS does not want to fix their long-time-known
- // XPathNavigator bug, so just set it as NotDotNet.
- // We are better.
- [Category ("NotDotNet")]
- public void XmlNamespaceNode ()
- {
- string xml = "<html xmlns='http://www.w3.org/1999/xhtml'><body>test.</body></html>";
- nav = GetXmlDocumentNavigator (xml);
- XmlNamespaceNode (nav);
- nav = GetXPathDocumentNavigator (document);
- XmlNamespaceNode (nav);
- }
- private void XmlNamespaceNode (XPathNavigator nav)
- {
- string xhtml = "http://www.w3.org/1999/xhtml";
- string xmlNS = "http://www.w3.org/XML/1998/namespace";
- nav.MoveToFirstChild ();
- AssertNavigator ("#1", nav, XPathNodeType.Element,
- "", "html", xhtml, "html", "test.", false, true, false);
- Assert (nav.MoveToFirstNamespace (XPathNamespaceScope.Local));
- AssertNavigator ("#2", nav, XPathNodeType.Namespace,
- "", "", "", "", xhtml, false, false, false);
- // Test difference between Local, ExcludeXml and All.
- Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.Local));
- Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
- // LAMESPEC: MS.NET 1.0 XmlDocument seems to have some bugs around here.
- // see http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316808
- #if true
- Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All));
- AssertNavigator ("#3", nav, XPathNodeType.Namespace,
- "", "xml", "", "xml", xmlNS, false, false, false);
- Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.All));
- #endif
- // Test to check if MoveToRoot() resets Namespace node status.
- nav.MoveToRoot ();
- AssertNavigator ("#4", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);
- nav.MoveToFirstChild ();
- // Test without XPathNamespaceScope argument.
- Assert (nav.MoveToFirstNamespace ());
- Assert (nav.MoveToNextNamespace ());
- AssertNavigator ("#5", nav, XPathNodeType.Namespace,
- "", "xml", "", "xml", xmlNS, false, false, false);
- // Test MoveToParent()
- Assert (nav.MoveToParent ());
- AssertNavigator ("#6", nav, XPathNodeType.Element,
- "", "html", xhtml, "html", "test.", false, true, false);
- nav.MoveToFirstChild (); // body
- // Test difference between Local and ExcludeXml
- Assert ("Local should fail",
- !nav.MoveToFirstNamespace (XPathNamespaceScope.Local));
- Assert ("ExcludeXml should succeed",
- nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml));
- AssertNavigator ("#7", nav, XPathNodeType.Namespace,
- "", "", "", "", xhtml, false, false, false);
- Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All));
- AssertNavigator ("#8", nav, XPathNodeType.Namespace,
- "", "xml", "", "xml", xmlNS, false, false, false);
- Assert (nav.MoveToParent ());
- AssertNavigator ("#9", nav, XPathNodeType.Element,
- "", "body", xhtml, "body", "test.", false, true, false);
- nav.MoveToRoot ();
- AssertNavigator ("#10", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);
- }
- [Test]
- public void MoveToNamespaces ()
- {
- string xml = "<a xmlns:x='urn:x'><b xmlns:y='urn:y'/><c/><d><e attr='a'/></d></a>";
- nav = GetXmlDocumentNavigator (xml);
- MoveToNamespaces (nav);
- nav = GetXPathDocumentNavigator (document);
- MoveToNamespaces (nav);
- }
- private void MoveToNamespaces (XPathNavigator nav)
- {
- XPathNodeIterator iter = nav.Select ("//e");
- iter.MoveNext ();
- nav.MoveTo (iter.Current);
- AssertEquals ("e", nav.Name);
- nav.MoveToFirstNamespace ();
- AssertEquals ("x", nav.Name);
- nav.MoveToNextNamespace ();
- AssertEquals ("xml", nav.Name);
- }
- [Test]
- public void IsDescendant ()
- {
- string xml = "<a><b/><c/><d><e attr='a'/></d></a>";
- nav = GetXmlDocumentNavigator (xml);
- IsDescendant (nav);
- nav = GetXPathDocumentNavigator (document);
- IsDescendant (nav);
- }
- private void IsDescendant (XPathNavigator nav)
- {
- XPathNavigator tmp = nav.Clone ();
- XPathNodeIterator iter = nav.Select ("//e");
- iter.MoveNext ();
- Assert (nav.MoveTo (iter.Current));
- Assert (nav.MoveToFirstAttribute ());
- AssertEquals ("attr", nav.Name);
- AssertEquals ("", tmp.Name);
- Assert (tmp.IsDescendant (nav));
- Assert (!nav.IsDescendant (tmp));
- tmp.MoveToFirstChild ();
- AssertEquals ("a", tmp.Name);
- Assert (tmp.IsDescendant (nav));
- Assert (!nav.IsDescendant (tmp));
- tmp.MoveTo (iter.Current);
- AssertEquals ("e", tmp.Name);
- Assert (tmp.IsDescendant (nav));
- Assert (!nav.IsDescendant (tmp));
- }
- [Test]
- public void LiterallySplittedText ()
- {
- string xml = "<root><![CDATA[test]]> string</root>";
- nav = GetXmlDocumentNavigator (xml);
- LiterallySplittedText (nav);
- nav = GetXPathDocumentNavigator (document);
- LiterallySplittedText (nav);
- }
- private void LiterallySplittedText (XPathNavigator nav)
- {
- nav.MoveToFirstChild ();
- nav.MoveToFirstChild ();
- AssertEquals (XPathNodeType.Text, nav.NodeType);
- AssertEquals ("test string", nav.Value);
- }
- // bug #75609
- [Test]
- public void SelectChildren ()
- {
- string xml = "<root><foo xmlns='urn:foo' /><ns:foo xmlns:ns='urn:foo' /></root>";
- nav = GetXmlDocumentNavigator (xml);
- SelectChildrenNS (nav);
- nav = GetXPathDocumentNavigator (document);
- SelectChildrenNS (nav);
- }
- private void SelectChildrenNS (XPathNavigator nav)
- {
- nav.MoveToFirstChild (); // root
- XPathNodeIterator iter = nav.SelectChildren ("foo", "urn:foo");
- AssertEquals (2, iter.Count);
- }
- #if NET_2_0
- [Test]
- // bug #78067
- public void OuterXml ()
- {
- string xml = @"<?xml version=""1.0""?>
- <one>
- <two>Some data.</two>
- </one>";
- nav = GetXmlDocumentNavigator (xml);
- OuterXml (nav);
- nav = GetXPathDocumentNavigator (document);
- OuterXml (nav);
- }
- private void OuterXml (XPathNavigator nav)
- {
- string ret = @"<one>
- <two>Some data.</two>
- </one>";
- AssertEquals (ret, nav.OuterXml.Replace ("\r\n", "\n"));
- }
- #endif
- }
- }
|