2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / System.XML / Test / System.Xml.XPath / SelectNodesTests.cs
1 //
2 // MonoTests.System.Xml.SelectNodesTests
3 //
4 // Author: Jason Diamond <jason@injektilo.org>
5 // Author: Martin Willemoes Hansen <mwh@sysrq.dk>
6 //
7 // (C) 2002 Jason Diamond
8 // (C) 2003 Martin Willemoes Hansen
9 //
10
11 using System;
12 using System.Xml;
13
14 using NUnit.Framework;
15
16 namespace MonoTests.System.Xml.XPath
17 {
18         [TestFixture]
19         public class SelectNodesTests
20         {
21
22                 [Test]
23                 public void Root ()
24                 {
25                         XmlDocument document = new XmlDocument ();
26                         document.LoadXml ("<foo />");
27                         XmlNodeList nodes = document.SelectNodes ("/");
28                         Assert.AreEqual (1, nodes.Count, "#1");
29                         Assert.AreSame (document, nodes [0], "#2");
30                 }
31
32                 [Test]
33                 public void DocumentElement ()
34                 {
35                         XmlDocument document = new XmlDocument ();
36                         document.LoadXml ("<foo />");
37                         XmlNodeList nodes = document.SelectNodes ("/foo");
38                         Assert.AreEqual (1, nodes.Count, "#1");
39                         Assert.AreSame (document.DocumentElement, nodes [0], "#2");
40                 }
41
42                 [Test]
43                 public void BadDocumentElement ()
44                 {
45                         XmlDocument document = new XmlDocument ();
46                         document.LoadXml ("<foo />");
47                         XmlNodeList nodes = document.SelectNodes ("/bar");
48                         Assert.AreEqual (0, nodes.Count, "#1");
49                 }
50
51                 [Test]
52                 public void ElementWildcard ()
53                 {
54                         XmlDocument document = new XmlDocument ();
55                         document.LoadXml ("<foo><bar /><baz /></foo>");
56                         XmlNodeList nodes = document.SelectNodes ("/foo/*");
57                         Assert.AreEqual (2, nodes.Count, "#1");
58                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
59                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3");
60                 }
61
62                 [Test]
63                 public void OneChildElement ()
64                 {
65                         XmlDocument document = new XmlDocument ();
66                         document.LoadXml ("<foo><bar /><baz /></foo>");
67                         XmlNodeList nodes = document.SelectNodes ("/foo/bar");
68                         Assert.AreEqual (1, nodes.Count, "#1");
69                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
70                 }
71
72                 [Test]
73                 public void OneOtherChildElement ()
74                 {
75                         XmlDocument document = new XmlDocument ();
76                         document.LoadXml ("<foo><bar /><baz /></foo>");
77                         XmlNodeList nodes = document.SelectNodes ("/foo/baz");
78                         Assert.AreEqual (1, nodes.Count, "#1");
79                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0]);
80                 }
81
82                 [Test]
83                 public void TextNode ()
84                 {
85                         XmlDocument document = new XmlDocument ();
86                         document.LoadXml ("<foo>bar</foo>");
87                         XmlNodeList nodes = document.SelectNodes ("/foo/text()");
88                         Assert.AreEqual (1, nodes.Count, "#1");
89                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0]);
90                 }
91
92                 [Test]
93                 public void SplitTextNodes ()
94                 {
95                         XmlDocument document = new XmlDocument ();
96                         document.LoadXml ("<foo>bar<baz />quux</foo>");
97                         XmlNodeList nodes = document.SelectNodes ("/foo/text()");
98                         Assert.AreEqual (2, nodes.Count, "#1");
99                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
100                         Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [1], "#3");
101                 }
102
103                 [Test]
104                 public void AbbreviatedParentAxis ()
105                 {
106                         XmlDocument document = new XmlDocument ();
107                         document.LoadXml ("<foo><bar /></foo>");
108                         XmlNodeList nodes = document.SelectNodes ("/foo/bar/..");
109                         Assert.AreEqual (1, nodes.Count, "#1");
110                         Assert.AreSame (document.DocumentElement, nodes [0], "#2");
111                 }
112
113                 [Test]
114                 public void FullParentAxis ()
115                 {
116                         XmlDocument document = new XmlDocument ();
117                         document.LoadXml ("<foo><bar /></foo>");
118                         XmlNodeList nodes = document.SelectNodes ("/foo/bar/parent::node()");
119                         Assert.AreEqual (1, nodes.Count, "#1");
120                         Assert.AreSame (document.DocumentElement, nodes [0], "#2");
121                 }
122
123                 [Test]
124                 public void AbbreviatedAttributeAxis ()
125                 {
126                         XmlDocument document = new XmlDocument ();
127                         document.LoadXml ("<foo bar='baz' />");
128                         XmlNodeList nodes = document.SelectNodes ("/foo/@bar");
129                         Assert.AreEqual (1, nodes.Count, "#1");
130                         Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2");
131                 }
132
133                 [Test]
134                 public void FullAttributeAxis ()
135                 {
136                         XmlDocument document = new XmlDocument ();
137                         document.LoadXml ("<foo bar='baz' />");
138                         XmlNodeList nodes = document.SelectNodes ("/foo/attribute::bar");
139                         Assert.AreEqual (1, nodes.Count, "#1");
140                         Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2");
141                 }
142
143                 [Test]
144                 public void AbbreviatedAttributeWildcard ()
145                 {
146                         XmlDocument document = new XmlDocument ();
147                         document.LoadXml ("<foo bar='baz' quux='quuux' />");
148                         XmlNodeList nodes = document.SelectNodes ("/foo/@*");
149                         Assert.AreEqual (2, nodes.Count, "#1");
150                         // are the attributes guanteed to be ordered in the node list?
151                         Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2");
152                         Assert.AreSame (document.DocumentElement.Attributes ["quux"], nodes [1], "#3");
153                 }
154
155                 [Test]
156                 public void AttributeParent ()
157                 {
158                         XmlDocument document = new XmlDocument ();
159                         document.LoadXml ("<foo bar='baz' />");
160                         XmlNodeList nodes = document.SelectNodes ("/foo/@bar/..");
161                         Assert.AreEqual (1, nodes.Count, "#1");
162                         Assert.AreSame (document.DocumentElement, nodes [0], "#2");
163                 }
164                 
165                 [Test]
166                 public void UnionOperator ()
167                 {
168                         XmlDocument document = new XmlDocument ();
169                         document.LoadXml ("<foo><bar /><baz /></foo>");
170                         XmlNodeList nodes = document.SelectNodes ("/foo/bar|/foo/baz");
171                         Assert.AreEqual (2, nodes.Count, "#1");
172                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
173                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3");
174                 }
175                 
176                 [Test]
177                 public void NodeWildcard ()
178                 {
179                         XmlDocument document = new XmlDocument ();
180                         document.LoadXml ("<foo><bar />baz<quux /></foo>");
181                         XmlNodeList nodes = document.SelectNodes ("/foo/node()");
182                         Assert.AreEqual (3, nodes.Count, "#1");
183                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
184                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3");
185                         Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [2], "#4");
186                 }
187
188                 [Test]
189                 public void PositionalPredicate ()
190                 {
191                         XmlDocument document = new XmlDocument ();
192                         document.LoadXml ("<foo><bar>1</bar><bar>2</bar></foo>");
193                         XmlNodeList nodes = document.SelectNodes ("/foo/bar[1]");
194                         Assert.AreEqual (1, nodes.Count, "#1");
195                         Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2");
196                 }
197
198                 [Test]
199                 public void AllFollowingSiblings ()
200                 {
201                         XmlDocument document = new XmlDocument ();
202                         document.LoadXml ("<foo><bar /><baz /><quux /></foo>");
203                         XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::*");
204                         Assert.AreEqual (2, nodes.Count, "#1");
205                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0], "#2");
206                         Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [1], "#3");
207                 }
208
209                 [Test]
210                 public void FollowingSiblingBaz ()
211                 {
212                         XmlDocument document = new XmlDocument ();
213                         document.LoadXml ("<foo><bar /><baz /><quux /></foo>");
214                         XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::baz");
215                         Assert.AreEqual (1, nodes.Count, "#1");
216                         Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0], "#2");
217                 }
218
219                 [Test]
220                 public void FollowingSiblingQuux ()
221                 {
222                         XmlDocument document = new XmlDocument ();
223                         document.LoadXml ("<foo><bar /><baz /><quux /></foo>");
224                         XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::quux");
225                         Assert.AreEqual (1, nodes.Count, "#1");
226                         Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [0], "#2");
227                 }
228
229                 [Test]
230                 public void Union ()
231                 {
232                         XmlDocument document = new XmlDocument ();
233                         document.LoadXml ("<foo />");
234                         XmlNodeList nodes = document.SelectNodes ("(/foo) | (/foo)");
235                         Assert.AreEqual (1, nodes.Count);       // bug #27548, "#1");
236                         Assert.AreSame (document.DocumentElement, nodes [0], "#1");
237                 }
238
239                 [Test]
240                 public void AlphabetDigitMixedName ()
241                 {
242                         XmlDocument document = new XmlDocument ();
243                         document.LoadXml ("<foo1 />");
244                         XmlNodeList nodes = document.SelectNodes ("/foo1");
245                         Assert.AreEqual (1, nodes.Count, "#1");
246                         Assert.AreSame (document.DocumentElement, nodes [0], "#2");
247                 }
248
249                 [Test]
250                 public void NamespaceSelect ()
251                 {
252                         XmlDocument document = new XmlDocument ();
253                         document.LoadXml ("<root xmlns=\"urn:foo1:foo2\"/>");
254                         XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
255                         nsmgr.AddNamespace("foons", "urn:foo1:foo2");
256                         XmlNodeList nodes = document.SelectNodes ("/foons:root", nsmgr);
257                         Assert.AreEqual (1, nodes.Count, "#1");
258                 }
259
260                 [Test]
261                 public void NamespaceSelectWithNsElasure ()
262                 {
263                         XmlDocument doc = new XmlDocument ();
264
265                         doc.LoadXml ("<root xmlns='urn:root' xmlns:hoge='urn:hoge'><foo xmlns='urn:foo'><bar xmlns=''><baz/></bar></foo></root>");
266                         XmlNode n = doc.FirstChild.FirstChild.FirstChild.FirstChild; //baz
267                         XmlNodeList nl = n.SelectNodes ("namespace::*");
268                         Assert.AreEqual ("hoge", nl [0].LocalName, "#1");
269                         Assert.AreEqual ("xml", nl [1].LocalName, "#2");
270                         Assert.AreEqual (2, nl.Count, "#3");
271
272                         n = doc.FirstChild.FirstChild; // foo
273                         nl = n.SelectNodes ("namespace::*");
274                         Console.WriteLine ("at foo::");
275                         Assert.AreEqual ("xmlns", nl [0].LocalName, "#1");
276                         Assert.AreEqual ("hoge", nl [1].LocalName, "#2");
277                         Assert.AreEqual ("xml", nl [2].LocalName, "#3");
278                         Assert.AreEqual (3, nl.Count, "#4");
279                 }
280
281                 [Test]
282                 public void AncestorAxis () {
283                         XmlDocument doc = new XmlDocument ();
284                         doc.LoadXml ("<foo><bar><baz><bax /></baz></bar></foo>");
285
286                         XmlNode bar = doc.GetElementsByTagName ("bar") [0];
287                         XmlElement barClone = (XmlElement) bar.CloneNode (true);
288                         XmlNodeList baxs = barClone.GetElementsByTagName ("bax");
289
290                         XmlNode bax = baxs [0];
291                         XmlNodeList ans = bax.SelectNodes ("ancestor::*");
292                         Assert.AreEqual (2, ans.Count, "#1");
293                         Assert.AreEqual ("bar", ans [0].Name, "#2");
294                         Assert.AreEqual ("baz", ans [1].Name, "#3");
295                 }
296
297                 [Test] // bug #458245
298                 public void SelectFromDetachedAttribute ()
299                 {
300                         XmlDocument doc = new XmlDocument ();
301                         doc.LoadXml ("<a></a>");
302                         XmlNode attr = doc.CreateAttribute ("b");
303                         attr.SelectSingleNode ("//*[@id='foo']");
304                 }
305
306                 [Test]
307                 public void Bug443490 ()
308                 {
309                         string xml = "<foo xmlns='urn:foo'><bar><div id='e1'> <div id='e1.1'> <div id='e1.1.1'> <div id='e1.1.1.1'> <div id='e1.1.1.1.1'/> </div> <div id='e1.1.1.2'/> </div> </div> </div></bar></foo>";
310                         XmlDocument doc = new XmlDocument ();
311                         doc.LoadXml (xml);
312                         XmlNamespaceManager ns = new XmlNamespaceManager (doc.NameTable);
313                         ns.AddNamespace ("_", "urn:foo");
314                         string xpath = "//_:div//_:div//_:div";
315                         var nodes = doc.SelectNodes (xpath, ns);
316                         Assert.AreEqual (4, nodes.Count, "#1");
317                 }
318
319                 [Test]
320                 public void Bug443090_2 ()
321                 {
322                         string xml = @"
323 <html xmlns='http://www.w3.org/1999/xhtml'>
324 <body>
325 <div id='e1'>
326     <div id='e1.1'>
327         <div id='e1.1.1'/>
328         <div id='e1.1.2'>
329           <div id='e1.1.2.1'>
330               <div id='e1.1.2.1.1'>e1.1.2.1.1</div>
331           </div>
332         </div>
333     </div>
334 </div>
335 </body>
336 </html>";
337                         XmlDocument doc = new XmlDocument ();
338                         doc.LoadXml (xml);
339                         XmlNamespaceManager ns = new XmlNamespaceManager (doc.NameTable);
340                         ns.AddNamespace ("_", "http://www.w3.org/1999/xhtml");
341
342                         XmlNode n = doc.SelectSingleNode ("//_:html", ns);
343                         Assert.IsTrue (n != null, "#1");
344                         XmlNodeList nodes = n.SelectNodes (".//_:div//_:div", ns);
345                         Assert.AreEqual (5, nodes.Count, "#2");
346                 }
347         }
348 }