2 // MonoTests.System.Xml.SelectNodesTests
4 // Author: Jason Diamond <jason@injektilo.org>
5 // Author: Martin Willemoes Hansen <mwh@sysrq.dk>
7 // (C) 2002 Jason Diamond
8 // (C) 2003 Martin Willemoes Hansen
14 using NUnit.Framework;
16 namespace MonoTests.System.Xml.XPath
19 public class SelectNodesTests
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");
33 public void DocumentElement ()
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");
43 public void BadDocumentElement ()
45 XmlDocument document = new XmlDocument ();
46 document.LoadXml ("<foo />");
47 XmlNodeList nodes = document.SelectNodes ("/bar");
48 Assert.AreEqual (0, nodes.Count, "#1");
52 public void ElementWildcard ()
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");
63 public void OneChildElement ()
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");
73 public void OneOtherChildElement ()
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]);
83 public void TextNode ()
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]);
93 public void SplitTextNodes ()
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");
104 public void AbbreviatedParentAxis ()
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");
114 public void FullParentAxis ()
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");
124 public void AbbreviatedAttributeAxis ()
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");
134 public void FullAttributeAxis ()
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");
144 public void AbbreviatedAttributeWildcard ()
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");
156 public void AttributeParent ()
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");
166 public void UnionOperator ()
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");
177 public void NodeWildcard ()
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");
189 public void PositionalPredicate ()
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");
199 public void AllFollowingSiblings ()
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");
210 public void FollowingSiblingBaz ()
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");
220 public void FollowingSiblingQuux ()
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");
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");
240 public void AlphabetDigitMixedName ()
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");
250 public void NamespaceSelect ()
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");
261 public void NamespaceSelectWithNsElasure ()
263 XmlDocument doc = new XmlDocument ();
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");
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");
282 public void AncestorAxis () {
283 XmlDocument doc = new XmlDocument ();
284 doc.LoadXml ("<foo><bar><baz><bax /></baz></bar></foo>");
286 XmlNode bar = doc.GetElementsByTagName ("bar") [0];
287 XmlElement barClone = (XmlElement) bar.CloneNode (true);
288 XmlNodeList baxs = barClone.GetElementsByTagName ("bax");
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");
297 [Test] // bug #458245
298 public void SelectFromDetachedAttribute ()
300 XmlDocument doc = new XmlDocument ();
301 doc.LoadXml ("<a></a>");
302 XmlNode attr = doc.CreateAttribute ("b");
303 attr.SelectSingleNode ("//*[@id='foo']");
307 public void Bug443490 ()
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 ();
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");
320 public void Bug443090_2 ()
323 <html xmlns='http://www.w3.org/1999/xhtml'>
330 <div id='e1.1.2.1.1'>e1.1.2.1.1</div>
337 XmlDocument doc = new XmlDocument ();
339 XmlNamespaceManager ns = new XmlNamespaceManager (doc.NameTable);
340 ns.AddNamespace ("_", "http://www.w3.org/1999/xhtml");
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");