3 // Kral Ferch <kral_ferch@hotmail.com>
4 // Martin Willemoes Hansen <mwh@sysrq.dk>
5 // Atsushi Enomoto <atsushi@ximian.com>
8 // (C) 2003 Martin Willemoes Hansen
9 // Copyright (C) 2010 Novell, Inc.
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 // imported from XPathNavigatorEvaluateTests
37 using System.Xml.Linq;
38 using System.Xml.XPath;
40 using NUnit.Framework;
42 namespace MonoTests.System.Xml
45 public class ExtensionsTest3
48 XPathNavigator navigator;
50 XPathNavigator navigator2;
52 XPathNavigator navigator3;
53 XPathExpression expression;
54 XPathNodeIterator iterator;
57 public void GetReady ()
59 document = XDocument.Parse ("<foo><bar/><baz/><qux/><squonk/></foo>");
60 navigator = document.CreateNavigator ();
62 document2 = XDocument.Parse ("<foo><bar baz='1'/><bar baz='2'/><bar baz='3'/></foo>");
63 navigator2 = document2.CreateNavigator ();
65 document3 = XDocument.Parse ("<foo><bar/><baz/><qux/></foo>");
66 navigator3 = document3.CreateNavigator ();
69 // Testing Core Funcetion Library functions defined at: http://www.w3.org/TR/xpath#corelib
71 public void CoreFunctionNodeSetLast ()
73 expression = navigator.Compile("last()");
74 iterator = navigator.Select("/foo");
75 Assert.AreEqual ("1", navigator.Evaluate ("last()").ToString(), "#1");
76 Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2");
77 Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#3");
78 iterator = navigator.Select("/foo/*");
79 Assert.AreEqual ("4", navigator.Evaluate (expression, iterator).ToString (), "#4");
81 Assert.AreEqual("3", navigator2.Evaluate ("string(//bar[last()]/@baz)"), "#5");
85 public void CoreFunctionNodeSetPosition ()
87 expression = navigator.Compile("position()");
88 iterator = navigator.Select("/foo");
89 Assert.AreEqual ("1", navigator.Evaluate ("position()").ToString (), "#1");
90 Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2");
91 Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#3");
92 iterator = navigator.Select("/foo/*");
93 Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#4");
95 Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#5");
97 Assert.AreEqual ("2", navigator.Evaluate (expression, iterator).ToString (), "#6");
99 Assert.AreEqual ("3", navigator.Evaluate (expression, iterator).ToString (), "#7");
103 public void CoreFunctionNodeSetCount ()
105 Assert.AreEqual ("5", navigator.Evaluate ("count(//*)").ToString (), "#1");
106 Assert.AreEqual ("1", navigator.Evaluate ("count(//foo)").ToString (), "#2");
107 Assert.AreEqual ("1", navigator.Evaluate ("count(/foo)").ToString (), "#3");
108 Assert.AreEqual ("1", navigator.Evaluate ("count(/foo/bar)").ToString (), "#4");
110 Assert.AreEqual ("3", navigator2.Evaluate ("count(//bar)").ToString (), "#5");
113 public void saveTestCoreFunctionNodeSetID ()
115 document = XDocument.Parse (
117 "<!ELEMENT foo (bar)>" +
118 "<!ELEMENT bar EMPTY>" +
119 "<!ATTLIST bar baz ID #REQUIRED>" +
121 "<foo><bar baz='1' qux='hello' /><bar baz='2' qux='world' /></foo>");
122 navigator = document.CreateNavigator ();
124 Assert.AreEqual ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString (), "#1");
125 Assert.AreEqual ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString (), "#2");
129 public void CoreFunctionLocalName ()
131 Assert.AreEqual ("", navigator.Evaluate ("local-name()").ToString (), "#1");
132 Assert.AreEqual ("", navigator.Evaluate ("local-name(/bogus)").ToString (), "#2");
133 Assert.AreEqual ("foo", navigator.Evaluate ("local-name(/foo)").ToString (), "#3");
134 Assert.AreEqual ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString (), "#4");
137 // TODO: umm. Unable to make this return a namespace-uri so far...
139 public void CoreFunctionNamespaceURI ()
141 document = XDocument.Parse ("<foo:bar xmlns:foo='#foo'><foo:baz><foo:qux /></foo:baz></foo:bar>");
142 navigator = document.CreateNavigator ();
144 Assert.AreEqual ("", navigator.Evaluate ("namespace-uri()").ToString (), "#1");
145 Assert.AreEqual ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString (), "#2");
146 //Assert.AreEqual("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString (), "#3");
147 Assert.AreEqual ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString (), "#4");
150 public void saveTestCoreFunctionString ()
152 document = XDocument.Parse ("<foo>hello<bar>world</bar><baz>how are you</baz></foo>");
153 navigator = document.CreateNavigator ();
155 Assert.AreEqual ("world", navigator.Evaluate ("string(/foo/*)").ToString (), "#1");
156 Assert.AreEqual ("NaN", navigator.Evaluate ("string(0 div 0)").ToString (), "#2");
159 navigator.Evaluate ("string(+0)");
160 Assert.Fail ("Expected an XPathException to be thrown.");
161 } catch (XPathException) {}
163 Assert.AreEqual ("0", navigator.Evaluate ("string(-0)").ToString (), "#3");
164 Assert.AreEqual ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString (), "#4");
165 Assert.AreEqual ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString (), "#5");
166 Assert.AreEqual ("45", navigator.Evaluate ("string(45)").ToString (), "#6");
167 Assert.AreEqual ("-22", navigator.Evaluate ("string(-22)").ToString (), "#7");
168 Assert.AreEqual ("0.25", navigator.Evaluate ("string(.25)").ToString (), "#8");
169 Assert.AreEqual ("-0.25", navigator.Evaluate ("string(-.25)").ToString (), "#9");
170 Assert.AreEqual ("2", navigator.Evaluate ("string(2.0)").ToString (), "#10");
171 Assert.AreEqual ("2.01", navigator.Evaluate ("string(2.01)").ToString (), "#11");
172 Assert.AreEqual ("-3", navigator.Evaluate ("string(-3.0)").ToString (), "#12");
173 Assert.AreEqual ("3.45", navigator.Evaluate ("string(3.45)").ToString (), "#13");
175 // Wonder what this will look like under a different platform.
176 Assert.AreEqual("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString (), "#14");
180 public void CoreFunctionConcat ()
183 navigator.Evaluate ("concat()");
184 Assert.Fail ("Expected an XPathException to be thrown.");
185 } catch (XPathException) {}
188 navigator.Evaluate ("concat('foo')");
189 Assert.Fail ("Expected an XPathException to be thrown.");
190 } catch (XPathException) {}
192 Assert.AreEqual ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString (), "#1");
193 Assert.AreEqual ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString (), "#2");
194 Assert.AreEqual ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString (), "#3");
195 Assert.AreEqual ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString (), "#4");
199 public void CoreFunctionStartsWith ()
202 navigator.Evaluate ("starts-with()");
203 Assert.Fail ("Expected an XPathException to be thrown.");
204 } catch (XPathException) {}
207 navigator.Evaluate ("starts-with('foo')");
208 Assert.Fail ("Expected an XPathException to be thrown.");
209 } catch (XPathException) {}
212 navigator.Evaluate ("starts-with('foo', 'bar', 'baz')");
213 Assert.Fail ("Expected an XPathException to be thrown.");
214 } catch (XPathException) {}
216 Assert.IsTrue ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')"));
217 Assert.IsTrue (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')"));
221 public void CoreFunctionContains ()
224 navigator.Evaluate ("contains()");
225 Assert.Fail ("Expected an XPathException to be thrown.");
226 } catch (XPathException) {}
229 navigator.Evaluate ("contains('foo')");
230 Assert.Fail ("Expected an XPathException to be thrown.");
231 } catch (XPathException) {}
234 navigator.Evaluate ("contains('foobar', 'oob', 'baz')");
235 Assert.Fail ("Expected an XPathException to be thrown.");
236 } catch (XPathException) {}
238 Assert.IsTrue ((bool)navigator.Evaluate ("contains('foobar', 'oob')"));
239 Assert.IsTrue (!(bool)navigator.Evaluate ("contains('foobar', 'baz')"));