2009-06-12 Bill Holmes <billholmes54@gmail.com>
[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 : Assertion
20         {
21
22                 [Test]
23                 public void Root ()
24                 {
25                         XmlDocument document = new XmlDocument ();
26                         document.LoadXml ("<foo />");
27                         XmlNodeList nodes = document.SelectNodes ("/");
28                         AssertEquals (1, nodes.Count);
29                         AssertSame (document, nodes [0]);
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                         AssertEquals (1, nodes.Count);
39                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (0, nodes.Count);
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                         AssertEquals (2, nodes.Count);
58                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
59                         AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]);
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                         AssertEquals (1, nodes.Count);
69                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
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                         AssertEquals (1, nodes.Count);
79                         AssertSame (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                         AssertEquals (1, nodes.Count);
89                         AssertSame (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                         AssertEquals (2, nodes.Count);
99                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
100                         AssertSame (document.DocumentElement.ChildNodes [2], nodes [1]);
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                         AssertEquals (1, nodes.Count);
110                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (1, nodes.Count);
120                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (1, nodes.Count);
130                         AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]);
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                         AssertEquals (1, nodes.Count);
140                         AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]);
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                         AssertEquals (2, nodes.Count);
150                         // are the attributes guanteed to be ordered in the node list?
151                         AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]);
152                         AssertSame (document.DocumentElement.Attributes ["quux"], nodes [1]);
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                         AssertEquals (1, nodes.Count);
162                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (2, nodes.Count);
172                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
173                         AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]);
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                         AssertEquals (3, nodes.Count);
183                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
184                         AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]);
185                         AssertSame (document.DocumentElement.ChildNodes [2], nodes [2]);
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                         AssertEquals (1, nodes.Count);
195                         AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]);
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                         AssertEquals (2, nodes.Count);
205                         AssertSame (document.DocumentElement.ChildNodes [1], nodes [0]);
206                         AssertSame (document.DocumentElement.ChildNodes [2], nodes [1]);
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                         AssertEquals (1, nodes.Count);
216                         AssertSame (document.DocumentElement.ChildNodes [1], nodes [0]);
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                         AssertEquals (1, nodes.Count);
226                         AssertSame (document.DocumentElement.ChildNodes [2], nodes [0]);
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                         AssertEquals (1, nodes.Count);  // bug #27548
236                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (1, nodes.Count);
246                         AssertSame (document.DocumentElement, nodes [0]);
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                         AssertEquals (1, nodes.Count);
258                 }
259
260                 [Test]
261                 public void NamespaceSelectWithNsElasure ()
262                 {
263                         XmlDocument doc = new XmlDocument ();\r
264 \r
265                         doc.LoadXml ("<root xmlns='urn:root' xmlns:hoge='urn:hoge'><foo xmlns='urn:foo'><bar xmlns=''><baz/></bar></foo></root>");\r
266                         XmlNode n = doc.FirstChild.FirstChild.FirstChild.FirstChild; //baz\r
267                         XmlNodeList nl = n.SelectNodes ("namespace::*");\r
268                         AssertEquals ("hoge", nl [0].LocalName);\r
269                         AssertEquals ("xml", nl [1].LocalName);\r
270                         AssertEquals (2, nl.Count);\r
271 \r
272                         n = doc.FirstChild.FirstChild; // foo\r
273                         nl = n.SelectNodes ("namespace::*");\r
274                         Console.WriteLine ("at foo::");\r
275                         AssertEquals ("xmlns", nl [0].LocalName);\r
276                         AssertEquals ("hoge", nl [1].LocalName);\r
277                         AssertEquals ("xml", nl [2].LocalName);\r
278                         AssertEquals (3, nl.Count);\r
279                 }\r
280 \r
281                 [Test]\r
282                 public void AncestorAxis () {\r
283                         XmlDocument doc = new XmlDocument ();\r
284                         doc.LoadXml ("<foo><bar><baz><bax /></baz></bar></foo>");\r
285 \r
286                         XmlNode bar = doc.GetElementsByTagName ("bar") [0];\r
287                         XmlElement barClone = (XmlElement) bar.CloneNode (true);\r
288                         XmlNodeList baxs = barClone.GetElementsByTagName ("bax");\r
289 \r
290                         XmlNode bax = baxs [0];\r
291                         XmlNodeList ans = bax.SelectNodes ("ancestor::*");\r
292                         AssertEquals (2, ans.Count);\r
293                         AssertEquals ("bar", ans [0].Name);\r
294                         AssertEquals ("baz", ans [1].Name);\r
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                         AssertEquals (4, nodes.Count);
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 ("#1", n != null);
344                         XmlNodeList nodes = n.SelectNodes (".//_:div//_:div", ns);
345                         AssertEquals ("#2", 5, nodes.Count);
346                 }
347         }
348 }