2 // MonoTests.System.Xml.XPathNavigatorCommonTests
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
7 // (C) 2003 Atsushi Enomoto
\r
13 using System.Xml.XPath;
\r
14 using NUnit.Framework;
\r
16 namespace MonoTests.System.Xml
\r
19 public class XPathNavigatorCommonTests : Assertion
\r
21 XmlDocument document;
\r
23 XPathDocument xpathDocument;
\r
26 public void GetReady ()
\r
28 document = new XmlDocument ();
\r
31 private XPathNavigator GetXmlDocumentNavigator (string xml)
\r
33 document.LoadXml (xml);
\r
34 return document.CreateNavigator ();
\r
37 private XPathNavigator GetXPathDocumentNavigator (XmlNode node)
\r
39 XmlNodeReader xr = new XmlNodeReader (node);
\r
40 xpathDocument = new XPathDocument (xr);
\r
41 return xpathDocument.CreateNavigator ();
\r
44 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)
\r
46 label += nav.GetType ();
\r
47 AssertEquals (label + "NodeType", type, nav.NodeType);
\r
48 AssertEquals (label + "Prefix", prefix, nav.Prefix);
\r
49 AssertEquals (label + "LocalName", localName, nav.LocalName);
\r
50 AssertEquals (label + "Namespace", ns, nav.NamespaceURI);
\r
51 AssertEquals (label + "Name", name, nav.Name);
\r
52 AssertEquals (label + "Value", value, nav.Value);
\r
53 AssertEquals (label + "HasAttributes", hasAttributes, nav.HasAttributes);
\r
54 AssertEquals (label + "HasChildren", hasChildren, nav.HasChildren);
\r
55 AssertEquals (label + "IsEmptyElement", isEmptyElement, nav.IsEmptyElement);
\r
59 public void DocumentWithXmlDeclaration ()
\r
61 string xml = "<?xml version=\"1.0\" standalone=\"yes\"?><foo>bar</foo>";
\r
63 nav = GetXmlDocumentNavigator (xml);
\r
64 DocumentWithXmlDeclaration (nav);
\r
65 nav = GetXPathDocumentNavigator (document);
\r
66 DocumentWithXmlDeclaration (nav);
\r
69 public void DocumentWithXmlDeclaration (XPathNavigator nav)
\r
71 nav.MoveToFirstChild ();
\r
72 AssertNavigator ("#1", nav, XPathNodeType.Element, "", "foo", "", "foo", "bar", false, true, false);
\r
76 public void DocumentWithProcessingInstruction ()
\r
78 string xml = "<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />";
\r
80 nav = GetXmlDocumentNavigator (xml);
\r
81 DocumentWithProcessingInstruction (nav);
\r
82 nav = GetXPathDocumentNavigator (document);
\r
83 DocumentWithProcessingInstruction (nav);
\r
86 public void DocumentWithProcessingInstruction (XPathNavigator nav)
\r
88 Assert (nav.MoveToFirstChild ());
\r
89 AssertNavigator ("#1", nav, XPathNodeType.ProcessingInstruction, "", "xml-stylesheet", "", "xml-stylesheet", "href='foo.xsl' type='text/xsl' ", false, false, false);
\r
90 Assert (!nav.MoveToFirstChild ());
\r
94 public void XmlRootElementOnly ()
\r
96 string xml = "<foo />";
\r
98 nav = GetXmlDocumentNavigator (xml);
\r
99 XmlRootElementOnly (nav);
\r
100 nav = GetXPathDocumentNavigator (document);
\r
101 XmlRootElementOnly (nav);
\r
104 private void XmlRootElementOnly (XPathNavigator nav)
\r
106 AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
107 Assert (nav.MoveToFirstChild ());
\r
108 AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, false, true);
\r
109 Assert (!nav.MoveToFirstChild ());
\r
110 Assert (!nav.MoveToNext ());
\r
111 Assert (!nav.MoveToPrevious ());
\r
113 AssertNavigator ("#3", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
114 Assert (!nav.MoveToNext ());
\r
118 public void XmlSimpleTextContent ()
\r
120 string xml = "<foo>Test.</foo>";
\r
122 nav = GetXmlDocumentNavigator (xml);
\r
123 XmlSimpleTextContent (nav);
\r
124 nav = GetXPathDocumentNavigator (document);
\r
125 XmlSimpleTextContent (nav);
\r
128 private void XmlSimpleTextContent (XPathNavigator nav)
\r
130 AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
\r
131 Assert (nav.MoveToFirstChild ());
\r
132 AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false);
\r
133 Assert (!nav.MoveToNext ());
\r
134 Assert (!nav.MoveToPrevious ());
\r
135 Assert (nav.MoveToFirstChild ());
\r
136 AssertNavigator ("#3", nav, XPathNodeType.Text, "", "", "", "", "Test.", false, false, false);
\r
138 Assert (nav.MoveToParent ());
\r
139 AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false);
\r
141 Assert (nav.MoveToParent ());
\r
142 AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
\r
144 nav.MoveToFirstChild ();
\r
145 nav.MoveToFirstChild ();
\r
147 AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);
\r
148 Assert (!nav.MoveToNext ());
\r
152 public void XmlSimpleElementContent ()
\r
154 string xml = "<foo><bar /></foo>";
\r
156 nav = GetXmlDocumentNavigator (xml);
\r
157 XmlSimpleElementContent (nav);
\r
158 nav = GetXPathDocumentNavigator (document);
\r
159 XmlSimpleElementContent (nav);
\r
162 private void XmlSimpleElementContent (XPathNavigator nav)
\r
164 AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
165 Assert (nav.MoveToFirstChild ());
\r
166 AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
\r
167 Assert (!nav.MoveToNext ());
\r
168 Assert (!nav.MoveToPrevious ());
\r
170 Assert (nav.MoveToFirstChild ());
\r
171 AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
\r
173 Assert (nav.MoveToParent ());
\r
174 AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
\r
177 AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
178 Assert (!nav.MoveToNext ());
\r
182 public void XmlTwoElementsContent ()
\r
184 string xml = "<foo><bar /><baz /></foo>";
\r
186 nav = GetXmlDocumentNavigator (xml);
\r
187 XmlTwoElementsContent (nav);
\r
188 nav = GetXPathDocumentNavigator (document);
\r
189 XmlTwoElementsContent (nav);
\r
192 private void XmlTwoElementsContent (XPathNavigator nav)
\r
194 AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
196 Assert (nav.MoveToFirstChild ());
\r
197 AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);
\r
198 Assert (!nav.MoveToNext ());
\r
199 Assert (!nav.MoveToPrevious ());
\r
201 Assert (nav.MoveToFirstChild ());
\r
202 AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
\r
203 Assert (!nav.MoveToFirstChild ());
\r
205 Assert (nav.MoveToNext ());
\r
206 AssertNavigator ("#4", nav, XPathNodeType.Element, "", "baz", "", "baz", "", false, false, true);
\r
207 Assert (!nav.MoveToFirstChild ());
\r
209 Assert (nav.MoveToPrevious ());
\r
210 AssertNavigator ("#5", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);
\r
213 AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
214 Assert (!nav.MoveToNext ());
\r
218 public void XmlElementWithAttributes ()
\r
220 string xml = "<img src='foo.png' alt='image Fooooooo!' />";
\r
222 nav = GetXmlDocumentNavigator (xml);
\r
223 XmlElementWithAttributes (nav);
\r
224 nav = GetXPathDocumentNavigator (document);
\r
225 XmlElementWithAttributes (nav);
\r
228 private void XmlElementWithAttributes (XPathNavigator nav)
\r
230 nav.MoveToFirstChild ();
\r
231 AssertNavigator ("#1", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true);
\r
232 Assert (!nav.MoveToNext ());
\r
233 Assert (!nav.MoveToPrevious ());
\r
235 Assert (nav.MoveToFirstAttribute ());
\r
236 AssertNavigator ("#2", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false);
\r
237 Assert (!nav.MoveToFirstAttribute ()); // On attributes, it fails.
\r
239 Assert (nav.MoveToNextAttribute ());
\r
240 AssertNavigator ("#3", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false);
\r
241 Assert (!nav.MoveToNextAttribute ());
\r
243 Assert (nav.MoveToParent ());
\r
244 AssertNavigator ("#4", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true);
\r
246 Assert (nav.MoveToAttribute ("alt", ""));
\r
247 AssertNavigator ("#5", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false);
\r
248 Assert (!nav.MoveToAttribute ("src", "")); // On attributes, it fails.
\r
249 Assert (nav.MoveToParent ());
\r
250 Assert (nav.MoveToAttribute ("src", ""));
\r
251 AssertNavigator ("#6", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false);
\r
254 AssertNavigator ("#7", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);
\r
258 // seems like MS does not want to fix their long-time-known
\r
259 // XPathNavigator bug, so just set it as NotDotNet.
\r
261 [Category ("NotDotNet")]
\r
262 public void XmlNamespaceNode ()
\r
264 string xml = "<html xmlns='http://www.w3.org/1999/xhtml'><body>test.</body></html>";
\r
266 nav = GetXmlDocumentNavigator (xml);
\r
267 XmlNamespaceNode (nav);
\r
268 nav = GetXPathDocumentNavigator (document);
\r
269 XmlNamespaceNode (nav);
\r
272 private void XmlNamespaceNode (XPathNavigator nav)
\r
274 string xhtml = "http://www.w3.org/1999/xhtml";
\r
275 string xmlNS = "http://www.w3.org/XML/1998/namespace";
\r
276 nav.MoveToFirstChild ();
\r
277 AssertNavigator ("#1", nav, XPathNodeType.Element,
\r
278 "", "html", xhtml, "html", "test.", false, true, false);
\r
279 Assert (nav.MoveToFirstNamespace (XPathNamespaceScope.Local));
\r
280 AssertNavigator ("#2", nav, XPathNodeType.Namespace,
\r
281 "", "", "", "", xhtml, false, false, false);
\r
283 // Test difference between Local, ExcludeXml and All.
\r
284 Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.Local));
\r
285 Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
\r
286 // LAMESPEC: MS.NET 1.0 XmlDocument seems to have some bugs around here.
\r
287 // see http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316808
\r
289 Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All));
\r
290 AssertNavigator ("#3", nav, XPathNodeType.Namespace,
\r
291 "", "xml", "", "xml", xmlNS, false, false, false);
\r
292 Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.All));
\r
294 // Test to check if MoveToRoot() resets Namespace node status.
\r
296 AssertNavigator ("#4", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);
\r
297 nav.MoveToFirstChild ();
\r
299 // Test without XPathNamespaceScope argument.
\r
300 Assert (nav.MoveToFirstNamespace ());
\r
301 Assert (nav.MoveToNextNamespace ());
\r
302 AssertNavigator ("#5", nav, XPathNodeType.Namespace,
\r
303 "", "xml", "", "xml", xmlNS, false, false, false);
\r
305 // Test MoveToParent()
\r
306 Assert (nav.MoveToParent ());
\r
307 AssertNavigator ("#6", nav, XPathNodeType.Element,
\r
308 "", "html", xhtml, "html", "test.", false, true, false);
\r
310 nav.MoveToFirstChild (); // body
\r
311 // Test difference between Local and ExcludeXml
\r
312 Assert ("Local should fail",
\r
313 !nav.MoveToFirstNamespace (XPathNamespaceScope.Local));
\r
314 Assert ("ExcludeXml should succeed",
\r
315 nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml));
\r
316 AssertNavigator ("#7", nav, XPathNodeType.Namespace,
\r
317 "", "", "", "", xhtml, false, false, false);
\r
319 Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All));
\r
320 AssertNavigator ("#8", nav, XPathNodeType.Namespace,
\r
321 "", "xml", "", "xml", xmlNS, false, false, false);
\r
322 Assert (nav.MoveToParent ());
\r
323 AssertNavigator ("#9", nav, XPathNodeType.Element,
\r
324 "", "body", xhtml, "body", "test.", false, true, false);
\r
327 AssertNavigator ("#10", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);
\r
331 public void MoveToNamespaces ()
\r
333 string xml = "<a xmlns:x='urn:x'><b xmlns:y='urn:y'/><c/><d><e attr='a'/></d></a>";
\r
335 nav = GetXmlDocumentNavigator (xml);
\r
336 MoveToNamespaces (nav);
\r
337 nav = GetXPathDocumentNavigator (document);
\r
338 MoveToNamespaces (nav);
\r
341 private void MoveToNamespaces (XPathNavigator nav)
\r
343 XPathNodeIterator iter = nav.Select ("//e");
\r
345 nav.MoveTo (iter.Current);
\r
346 AssertEquals ("e", nav.Name);
\r
347 nav.MoveToFirstNamespace ();
\r
348 AssertEquals ("x", nav.Name);
\r
349 nav.MoveToNextNamespace ();
\r
350 AssertEquals ("xml", nav.Name);
\r
354 public void IsDescendant ()
\r
356 string xml = "<a><b/><c/><d><e attr='a'/></d></a>";
\r
358 nav = GetXmlDocumentNavigator (xml);
\r
359 IsDescendant (nav);
\r
360 nav = GetXPathDocumentNavigator (document);
\r
361 IsDescendant (nav);
\r
364 private void IsDescendant (XPathNavigator nav)
\r
366 XPathNavigator tmp = nav.Clone ();
\r
367 XPathNodeIterator iter = nav.Select ("//e");
\r
369 Assert (nav.MoveTo (iter.Current));
\r
370 Assert (nav.MoveToFirstAttribute ());
\r
371 AssertEquals ("attr", nav.Name);
\r
372 AssertEquals ("", tmp.Name);
\r
373 Assert (tmp.IsDescendant (nav));
\r
374 Assert (!nav.IsDescendant (tmp));
\r
375 tmp.MoveToFirstChild ();
\r
376 AssertEquals ("a", tmp.Name);
\r
377 Assert (tmp.IsDescendant (nav));
\r
378 Assert (!nav.IsDescendant (tmp));
\r
379 tmp.MoveTo (iter.Current);
\r
380 AssertEquals ("e", tmp.Name);
\r
381 Assert (tmp.IsDescendant (nav));
\r
382 Assert (!nav.IsDescendant (tmp));
\r
386 public void LiterallySplittedText ()
\r
388 string xml = "<root><![CDATA[test]]> string</root>";
\r
390 nav = GetXmlDocumentNavigator (xml);
\r
391 LiterallySplittedText (nav);
\r
392 nav = GetXPathDocumentNavigator (document);
\r
393 LiterallySplittedText (nav);
\r
396 private void LiterallySplittedText (XPathNavigator nav)
\r
398 nav.MoveToFirstChild ();
\r
399 nav.MoveToFirstChild ();
\r
400 AssertEquals (XPathNodeType.Text, nav.NodeType);
\r
401 AssertEquals ("test string", nav.Value);
\r
406 public void SelectChildren ()
\r
408 string xml = "<root><foo xmlns='urn:foo' /><ns:foo xmlns:ns='urn:foo' /></root>";
\r
410 nav = GetXmlDocumentNavigator (xml);
\r
411 SelectChildrenNS (nav);
\r
412 nav = GetXPathDocumentNavigator (document);
\r
413 SelectChildrenNS (nav);
\r
416 private void SelectChildrenNS (XPathNavigator nav)
\r
418 nav.MoveToFirstChild (); // root
\r
419 XPathNodeIterator iter = nav.SelectChildren ("foo", "urn:foo");
\r
420 AssertEquals (2, iter.Count);
\r
427 public void OuterXml ()
\r
429 string xml = @"<?xml version=""1.0""?>
\r
431 <two>Some data.</two>
\r
434 nav = GetXmlDocumentNavigator (xml);
\r
436 nav = GetXPathDocumentNavigator (document);
\r
440 private void OuterXml (XPathNavigator nav)
\r
442 string ret = @"<one>
\r
443 <two>Some data.</two>
\r
445 AssertEquals (ret, nav.OuterXml.Replace ("\r\n", "\n"));
\r