eol-style:CRLF first (then, native).
[mono.git] / mcs / class / System.XML / Test / System.Xml.XPath / XPathNavigatorCommonTests.cs
1 //\r
2 // MonoTests.System.Xml.XPathNavigatorCommonTests\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
6 //\r
7 // (C) 2003 Atsushi Enomoto\r
8 //\r
9 \r
10 using System;\r
11 using System.IO;\r
12 using System.Xml;\r
13 using System.Xml.XPath;\r
14 using NUnit.Framework;\r
15 \r
16 namespace MonoTests.System.Xml\r
17 {\r
18         [TestFixture]\r
19         public class XPathNavigatorCommonTests : Assertion\r
20         {\r
21                 XmlDocument document;\r
22                 XPathNavigator nav;\r
23                 XPathDocument xpathDocument;\r
24 \r
25                 [SetUp]\r
26                 public void GetReady ()\r
27                 {\r
28                         document = new XmlDocument ();\r
29                 }\r
30 \r
31                 private XPathNavigator GetXmlDocumentNavigator (string xml)\r
32                 {\r
33                         document.LoadXml (xml);\r
34                         return document.CreateNavigator ();\r
35                 }\r
36                 \r
37                 private XPathNavigator GetXPathDocumentNavigator (XmlNode node)\r
38                 {\r
39                         XmlNodeReader xr = new XmlNodeReader (node);\r
40                         xpathDocument = new XPathDocument (xr);\r
41                         return xpathDocument.CreateNavigator ();\r
42                 }\r
43 \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
45                 {\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
56                 }\r
57 \r
58                 [Test]\r
59                 public void DocumentWithXmlDeclaration ()\r
60                 {\r
61                         string xml = "<?xml version=\"1.0\" standalone=\"yes\"?><foo>bar</foo>";\r
62 \r
63                         nav = GetXmlDocumentNavigator (xml);\r
64                         DocumentWithXmlDeclaration (nav);\r
65                         nav = GetXPathDocumentNavigator (document);\r
66                         DocumentWithXmlDeclaration (nav);\r
67                 }\r
68 \r
69                 public void DocumentWithXmlDeclaration (XPathNavigator nav)\r
70                 {\r
71                         nav.MoveToFirstChild ();\r
72                         AssertNavigator ("#1", nav, XPathNodeType.Element, "", "foo", "", "foo", "bar", false, true, false);\r
73                 }\r
74 \r
75                 [Test]\r
76                 public void DocumentWithProcessingInstruction ()\r
77                 {\r
78                         string xml = "<?xml-stylesheet href='foo.xsl' type='text/xsl' ?><foo />";\r
79 \r
80                         nav = GetXmlDocumentNavigator (xml);\r
81                         DocumentWithProcessingInstruction (nav);\r
82                         nav = GetXPathDocumentNavigator (document);\r
83                         DocumentWithProcessingInstruction (nav);\r
84                 }\r
85 \r
86                 public void DocumentWithProcessingInstruction (XPathNavigator nav)\r
87                 {\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
91                 }\r
92 \r
93                 [Test]\r
94                 public void XmlRootElementOnly ()\r
95                 {\r
96                         string xml = "<foo />";\r
97 \r
98                         nav = GetXmlDocumentNavigator (xml);\r
99                         XmlRootElementOnly (nav);\r
100                         nav = GetXPathDocumentNavigator (document);\r
101                         XmlRootElementOnly (nav);\r
102                 }\r
103 \r
104                 private void XmlRootElementOnly (XPathNavigator nav)\r
105                 {\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
112                         nav.MoveToRoot ();\r
113                         AssertNavigator ("#3", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);\r
114                         Assert (!nav.MoveToNext ());\r
115                 }\r
116 \r
117                 [Test]\r
118                 public void XmlSimpleTextContent ()\r
119                 {\r
120                         string xml = "<foo>Test.</foo>";\r
121 \r
122                         nav = GetXmlDocumentNavigator (xml);\r
123                         XmlSimpleTextContent (nav);\r
124                         nav = GetXPathDocumentNavigator (document);\r
125                         XmlSimpleTextContent (nav);\r
126                 }\r
127 \r
128                 private void XmlSimpleTextContent (XPathNavigator nav)\r
129                 {\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
137 \r
138                         Assert (nav.MoveToParent ());\r
139                         AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false);\r
140 \r
141                         Assert (nav.MoveToParent ());\r
142                         AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);\r
143 \r
144                         nav.MoveToFirstChild ();\r
145                         nav.MoveToFirstChild ();\r
146                         nav.MoveToRoot ();\r
147                         AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false);\r
148                         Assert (!nav.MoveToNext ());\r
149                 }\r
150 \r
151                 [Test]\r
152                 public void XmlSimpleElementContent ()\r
153                 {\r
154                         string xml = "<foo><bar /></foo>";\r
155 \r
156                         nav = GetXmlDocumentNavigator (xml);\r
157                         XmlSimpleElementContent (nav);\r
158                         nav = GetXPathDocumentNavigator (document);\r
159                         XmlSimpleElementContent (nav);\r
160                 }\r
161 \r
162                 private void XmlSimpleElementContent (XPathNavigator nav)\r
163                 {\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
169 \r
170                         Assert (nav.MoveToFirstChild ());\r
171                         AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);\r
172 \r
173                         Assert (nav.MoveToParent ());\r
174                         AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false);\r
175 \r
176                         nav.MoveToRoot ();\r
177                         AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);\r
178                         Assert (!nav.MoveToNext ());\r
179                 }\r
180 \r
181                 [Test]\r
182                 public void XmlTwoElementsContent ()\r
183                 {\r
184                         string xml = "<foo><bar /><baz /></foo>";\r
185 \r
186                         nav = GetXmlDocumentNavigator (xml);\r
187                         XmlTwoElementsContent (nav);\r
188                         nav = GetXPathDocumentNavigator (document);\r
189                         XmlTwoElementsContent (nav);\r
190                 }\r
191 \r
192                 private void XmlTwoElementsContent (XPathNavigator nav)\r
193                 {\r
194                         AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);\r
195 \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
200 \r
201                         Assert (nav.MoveToFirstChild ());\r
202                         AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);\r
203                         Assert (!nav.MoveToFirstChild ());\r
204 \r
205                         Assert (nav.MoveToNext ());\r
206                         AssertNavigator ("#4", nav, XPathNodeType.Element, "", "baz", "", "baz", "", false, false, true);\r
207                         Assert (!nav.MoveToFirstChild ());\r
208 \r
209                         Assert (nav.MoveToPrevious ());\r
210                         AssertNavigator ("#5", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true);\r
211 \r
212                         nav.MoveToRoot ();\r
213                         AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);\r
214                         Assert (!nav.MoveToNext ());\r
215                 }\r
216 \r
217                 [Test]\r
218                 public void XmlElementWithAttributes ()\r
219                 {\r
220                         string xml = "<img src='foo.png' alt='image Fooooooo!' />";\r
221 \r
222                         nav = GetXmlDocumentNavigator (xml);\r
223                         XmlElementWithAttributes (nav);\r
224                         nav = GetXPathDocumentNavigator (document);\r
225                         XmlElementWithAttributes (nav);\r
226                 }\r
227 \r
228                 private void XmlElementWithAttributes (XPathNavigator nav)\r
229                 {\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
234 \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
238 \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
242 \r
243                         Assert (nav.MoveToParent ());\r
244                         AssertNavigator ("#4", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true);\r
245 \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
252 \r
253                         nav.MoveToRoot ();\r
254                         AssertNavigator ("#7", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false);\r
255                 }\r
256 \r
257                 [Test]\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
260                 // We are better.\r
261                 [Category ("NotDotNet")]\r
262                 public void XmlNamespaceNode ()\r
263                 {\r
264                         string xml = "<html xmlns='http://www.w3.org/1999/xhtml'><body>test.</body></html>";\r
265 \r
266                         nav = GetXmlDocumentNavigator (xml);\r
267                         XmlNamespaceNode (nav);\r
268                         nav = GetXPathDocumentNavigator (document);\r
269                         XmlNamespaceNode (nav);\r
270                 }\r
271 \r
272                 private void XmlNamespaceNode (XPathNavigator nav)\r
273                 {\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
282 \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
288 #if true\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
293 #endif\r
294                         // Test to check if MoveToRoot() resets Namespace node status.\r
295                         nav.MoveToRoot ();\r
296                         AssertNavigator ("#4", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);\r
297                         nav.MoveToFirstChild ();\r
298 \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
304 \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
309 \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
318 \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
325 \r
326                         nav.MoveToRoot ();\r
327                         AssertNavigator ("#10", nav, XPathNodeType.Root, "", "", "", "", "test.", false, true, false);\r
328                 }\r
329 \r
330                 [Test]\r
331                 public void MoveToNamespaces ()\r
332                 {\r
333                         string xml = "<a xmlns:x='urn:x'><b xmlns:y='urn:y'/><c/><d><e attr='a'/></d></a>";\r
334 \r
335                         nav = GetXmlDocumentNavigator (xml);\r
336                         MoveToNamespaces (nav);\r
337                         nav = GetXPathDocumentNavigator (document);\r
338                         MoveToNamespaces (nav);\r
339                 }\r
340 \r
341                 private void MoveToNamespaces (XPathNavigator nav)\r
342                 {\r
343                         XPathNodeIterator iter = nav.Select ("//e");\r
344                         iter.MoveNext ();\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
351                 }\r
352 \r
353                 [Test]\r
354                 public void IsDescendant ()\r
355                 {\r
356                         string xml = "<a><b/><c/><d><e attr='a'/></d></a>";\r
357 \r
358                         nav = GetXmlDocumentNavigator (xml);\r
359                         IsDescendant (nav);\r
360                         nav = GetXPathDocumentNavigator (document);\r
361                         IsDescendant (nav);\r
362                 }\r
363 \r
364                 private void IsDescendant (XPathNavigator nav)\r
365                 {\r
366                         XPathNavigator tmp = nav.Clone ();\r
367                         XPathNodeIterator iter = nav.Select ("//e");\r
368                         iter.MoveNext ();\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
383                 }\r
384 \r
385                 [Test]\r
386                 public void LiterallySplittedText ()\r
387                 {\r
388                         string xml = "<root><![CDATA[test]]> string</root>";\r
389 \r
390                         nav = GetXmlDocumentNavigator (xml);\r
391                         LiterallySplittedText (nav);\r
392                         nav = GetXPathDocumentNavigator (document);\r
393                         LiterallySplittedText (nav);\r
394                 }\r
395 \r
396                 private void LiterallySplittedText (XPathNavigator nav)\r
397                 {\r
398                         nav.MoveToFirstChild ();\r
399                         nav.MoveToFirstChild ();\r
400                         AssertEquals (XPathNodeType.Text, nav.NodeType);\r
401                         AssertEquals ("test string", nav.Value);\r
402                 }\r
403 \r
404                 // bug #75609\r
405                 [Test]\r
406                 public void SelectChildren ()\r
407                 {\r
408                         string xml = "<root><foo xmlns='urn:foo' /><ns:foo xmlns:ns='urn:foo' /></root>";\r
409 \r
410                         nav = GetXmlDocumentNavigator (xml);\r
411                         SelectChildrenNS (nav);\r
412                         nav = GetXPathDocumentNavigator (document);\r
413                         SelectChildrenNS (nav);\r
414                 }\r
415 \r
416                 private void SelectChildrenNS (XPathNavigator nav)\r
417                 {\r
418                         nav.MoveToFirstChild (); // root\r
419                         XPathNodeIterator iter = nav.SelectChildren ("foo", "urn:foo");\r
420                         AssertEquals (2, iter.Count);\r
421                 }\r
422 \r
423 #if NET_2_0\r
424 \r
425                 [Test]\r
426                 // bug #78067\r
427                 public void OuterXml ()\r
428                 {\r
429                         string xml = @"<?xml version=""1.0""?>\r
430 <one>\r
431         <two>Some data.</two>\r
432 </one>";\r
433 \r
434                         nav = GetXmlDocumentNavigator (xml);\r
435                         OuterXml (nav);\r
436                         nav = GetXPathDocumentNavigator (document);\r
437                         OuterXml (nav);\r
438                 }\r
439 \r
440                 private void OuterXml (XPathNavigator nav)\r
441                 {\r
442                         string ret = @"<one>\r
443   <two>Some data.</two>\r
444 </one>";\r
445                         AssertEquals (ret, nav.OuterXml.Replace ("\r\n", "\n"));\r
446                 }\r
447 #endif\r
448         }\r
449 }\r