2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / System.XML / Test / System.Xml.XPath / XPathNavigatorEvaluateTests.cs
1 //
2 // MonoTests.System.Xml.XPathNavigatorEvaluateTests
3 //
4 // Authors:
5 //   Kral Ferch <kral_ferch@hotmail.com>
6 //   Martin Willemoes Hansen <mwh@sysrq.dk>
7 //
8 // (C) 2002 Kral Ferch
9 // (C) 2003 Martin Willemoes Hansen
10 //
11
12 using System;
13 using System.Xml;
14 using System.Xml.XPath;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.System.Xml
19 {
20         [TestFixture]
21         public class XPathNavigatorEvaluateTests
22         {
23                 XmlDocument document;
24                 XPathNavigator navigator;
25                 XmlDocument document2;
26                 XPathNavigator navigator2;
27                 XmlDocument document3;
28                 XPathNavigator navigator3;
29                 XPathExpression expression;
30                 XPathNodeIterator iterator;
31
32                 [SetUp]
33                 public void GetReady ()
34                 {
35                         document = new XmlDocument ();
36                         document.LoadXml ("<foo><bar/><baz/><qux/><squonk/></foo>");
37                         navigator = document.CreateNavigator ();
38
39                         document2 = new XmlDocument ();
40                         document2.LoadXml ("<foo><bar baz='1'/><bar baz='2'/><bar baz='3'/></foo>");
41                         navigator2 = document2.CreateNavigator ();
42
43                         document3 = new XmlDocument ();
44                         document3.LoadXml ("<foo><bar/><baz/><qux/></foo>");
45                         navigator3 = document3.CreateNavigator ();
46                 }
47
48                 // Testing Core Funcetion Library functions defined at: http://www.w3.org/TR/xpath#corelib
49                 [Test]
50 #if !NET_2_0
51                 // .NET 2.0 is fixed for last() to return 1 for the
52                 // initial context position. Someone thinks we should follow
53                 // the fix, but in reality we should just discard this
54                 // pointless test. The positional value under those conditions
55                 // does not make any sense.
56                 [Category ("NotDotNet")]
57 #endif
58                 public void CoreFunctionNodeSetLast ()
59                 {
60                         expression = navigator.Compile("last()");
61                         iterator = navigator.Select("/foo");
62                         Assert.AreEqual ("1", navigator.Evaluate ("last()").ToString(), "#1");
63                         Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2");
64                         Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#3");
65                         iterator = navigator.Select("/foo/*");
66                         Assert.AreEqual ("4", navigator.Evaluate (expression, iterator).ToString (), "#4");
67                         
68                         Assert.AreEqual("3", navigator2.Evaluate ("string(//bar[last()]/@baz)"), "#5");
69                 }
70
71                 [Test]
72 #if !NET_2_0
73                 // .NET 2.0 is fixed for position() to return 1 for the
74                 // initial context position. Someone thinks we should follow
75                 // the fix, but in reality we should just discard this
76                 // pointless test. The positional value under those conditions
77                 // does not make any sense.
78 //              [Category ("NotWorking")]
79                 [Category ("NotDotNet")]
80 #endif
81                 public void CoreFunctionNodeSetPosition ()
82                 {
83                         expression = navigator.Compile("position()");
84                         iterator = navigator.Select("/foo");
85                         Assert.AreEqual ("1", navigator.Evaluate ("position()").ToString (), "#1");
86                         Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2");
87                         Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#3");
88                         iterator = navigator.Select("/foo/*");
89                         Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#4");
90                         iterator.MoveNext();
91                         Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#5");
92                         iterator.MoveNext ();
93                         Assert.AreEqual ("2", navigator.Evaluate (expression, iterator).ToString (), "#6");
94                         iterator.MoveNext ();
95                         Assert.AreEqual ("3", navigator.Evaluate (expression, iterator).ToString (), "#7");
96                 }
97
98                 [Test]
99                 public void CoreFunctionNodeSetCount ()
100                 {
101                         Assert.AreEqual ("5", navigator.Evaluate ("count(//*)").ToString (), "#1");
102                         Assert.AreEqual ("1", navigator.Evaluate ("count(//foo)").ToString (), "#2");
103                         Assert.AreEqual ("1", navigator.Evaluate ("count(/foo)").ToString (), "#3");
104                         Assert.AreEqual ("1", navigator.Evaluate ("count(/foo/bar)").ToString (), "#4");
105
106                         Assert.AreEqual ("3", navigator2.Evaluate ("count(//bar)").ToString (), "#5");
107                 }
108
109                 public void saveTestCoreFunctionNodeSetID ()
110                 {
111                         document.LoadXml (
112                                 "<!DOCTYPE foo [" +
113                                 "<!ELEMENT foo (bar)>" +
114                                 "<!ELEMENT bar EMPTY>" +
115                                 "<!ATTLIST bar baz ID #REQUIRED>" +
116                                 "]>" +
117                                 "<foo><bar baz='1' qux='hello' /><bar baz='2' qux='world' /></foo>");
118                         navigator = document.CreateNavigator();
119
120                         Assert.AreEqual ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString (), "#1");
121                         Assert.AreEqual ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString (), "#2");
122                 }
123
124                 [Test]
125                 public void CoreFunctionLocalName ()
126                 {
127                         Assert.AreEqual ("", navigator.Evaluate ("local-name()").ToString (), "#1");
128                         Assert.AreEqual ("", navigator.Evaluate ("local-name(/bogus)").ToString (), "#2");
129                         Assert.AreEqual ("foo", navigator.Evaluate ("local-name(/foo)").ToString (), "#3");
130                         Assert.AreEqual ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString (), "#4");
131                 }
132
133                 // TODO:  umm.  Unable to make this return a namespace-uri so far...
134                 [Test]
135                 public void CoreFunctionNamespaceURI ()
136                 {
137                         document.LoadXml ("<foo:bar xmlns:foo='#foo'><foo:baz><foo:qux /></foo:baz></foo:bar>");
138                         navigator = document.CreateNavigator ();
139
140                         Assert.AreEqual ("", navigator.Evaluate ("namespace-uri()").ToString (), "#1");
141                         Assert.AreEqual ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString (), "#2");
142                         //Assert.AreEqual("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString (), "#3");
143                         Assert.AreEqual ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString (), "#4");
144                 }
145
146                 public void saveTestCoreFunctionString ()
147                 {
148                         document.LoadXml ("<foo>hello<bar>world</bar><baz>how are you</baz></foo>");
149                         navigator = document.CreateNavigator ();
150
151                         Assert.AreEqual ("world", navigator.Evaluate ("string(/foo/*)").ToString (), "#1");
152                         Assert.AreEqual ("NaN", navigator.Evaluate ("string(0 div 0)").ToString (), "#2");
153                         
154                         try {
155                                 navigator.Evaluate ("string(+0)");
156                                 Assert.Fail ("Expected an XPathException to be thrown.");
157                         } catch (XPathException) {}
158                         
159                         Assert.AreEqual ("0", navigator.Evaluate ("string(-0)").ToString (), "#3");
160                         Assert.AreEqual ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString (), "#4");
161                         Assert.AreEqual ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString (), "#5");
162                         Assert.AreEqual ("45", navigator.Evaluate ("string(45)").ToString (), "#6");
163                         Assert.AreEqual ("-22", navigator.Evaluate ("string(-22)").ToString (), "#7");
164                         Assert.AreEqual ("0.25", navigator.Evaluate ("string(.25)").ToString (), "#8");
165                         Assert.AreEqual ("-0.25", navigator.Evaluate ("string(-.25)").ToString (), "#9");
166                         Assert.AreEqual ("2", navigator.Evaluate ("string(2.0)").ToString (), "#10");
167                         Assert.AreEqual ("2.01", navigator.Evaluate ("string(2.01)").ToString (), "#11");
168                         Assert.AreEqual ("-3", navigator.Evaluate ("string(-3.0)").ToString (), "#12");
169                         Assert.AreEqual ("3.45", navigator.Evaluate ("string(3.45)").ToString (), "#13");
170
171                         // Wonder what this will look like under a different platform.
172                         Assert.AreEqual("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString (), "#14");
173                 }
174
175                 [Test]
176                 public void CoreFunctionConcat ()
177                 {
178                         try {
179                                 navigator.Evaluate ("concat()");
180                                 Assert.Fail ("Expected an XPathException to be thrown.");
181                         } catch (XPathException) {}
182
183                         try {
184                                 navigator.Evaluate ("concat('foo')");
185                                 Assert.Fail ("Expected an XPathException to be thrown.");
186                         } catch (XPathException) {}
187
188                         Assert.AreEqual ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString (), "#1");
189                         Assert.AreEqual ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString (), "#2");
190                         Assert.AreEqual ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString (), "#3");
191                         Assert.AreEqual ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString (), "#4");
192                 }
193
194                 [Test]
195                 public void CoreFunctionStartsWith ()
196                 {
197                         try {
198                                 navigator.Evaluate ("starts-with()");
199                                 Assert.Fail ("Expected an XPathException to be thrown.");
200                         } catch (XPathException) {}
201
202                         try {
203                                 navigator.Evaluate ("starts-with('foo')");
204                                 Assert.Fail ("Expected an XPathException to be thrown.");
205                         } catch (XPathException) {}
206
207                         try {
208                                 navigator.Evaluate ("starts-with('foo', 'bar', 'baz')");
209                                 Assert.Fail ("Expected an XPathException to be thrown.");
210                         } catch (XPathException) {}
211
212                         Assert.IsTrue ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')"));
213                         Assert.IsTrue (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')"));
214                 }
215
216                 [Test]
217                 public void CoreFunctionContains ()
218                 {
219                         try {
220                                 navigator.Evaluate ("contains()");
221                                 Assert.Fail ("Expected an XPathException to be thrown.");
222                         } catch (XPathException) {}
223
224                         try {
225                                 navigator.Evaluate ("contains('foo')");
226                                 Assert.Fail ("Expected an XPathException to be thrown.");
227                         } catch (XPathException) {}
228
229                         try {
230                                 navigator.Evaluate ("contains('foobar', 'oob', 'baz')");
231                                 Assert.Fail ("Expected an XPathException to be thrown.");
232                         } catch (XPathException) {}
233
234                         Assert.IsTrue ((bool)navigator.Evaluate ("contains('foobar', 'oob')"));
235                         Assert.IsTrue (!(bool)navigator.Evaluate ("contains('foobar', 'baz')"));
236                 }
237         }
238 }