New test.
[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 : Assertion
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. We should follow the fix.
53                 [Category ("NotWorking")]
54                 [Category ("NotDotNet")]
55 #endif
56                 public void CoreFunctionNodeSetLast ()
57                 {
58                         expression = navigator.Compile("last()");
59                         iterator = navigator.Select("/foo");
60                         AssertEquals ("0", navigator.Evaluate ("last()").ToString());
61                         AssertEquals ("0", navigator.Evaluate (expression, null).ToString ());
62                         AssertEquals ("1", navigator.Evaluate (expression, iterator).ToString ());
63                         iterator = navigator.Select("/foo/*");
64                         AssertEquals ("4", navigator.Evaluate (expression, iterator).ToString ());
65                         
66                         AssertEquals("3", navigator2.Evaluate ("string(//bar[last()]/@baz)"));
67                 }
68
69                 [Test]
70 #if NET_2_0
71                 // .NET 2.0 is fixed for position() to return 1 for the
72                 // initial context position. We should follow the fix.
73                 [Category ("NotWorking")]
74                 [Category ("NotDotNet")]
75 #endif
76                 public void CoreFunctionNodeSetPosition ()
77                 {
78                         expression = navigator.Compile("position()");
79                         iterator = navigator.Select("/foo");
80                         AssertEquals ("#1", "0", navigator.Evaluate ("position()").ToString ());
81                         AssertEquals ("#2", "0", navigator.Evaluate (expression, null).ToString ());
82                         AssertEquals ("#3", "0", navigator.Evaluate (expression, iterator).ToString ());
83                         iterator = navigator.Select("/foo/*");
84                         AssertEquals ("#4", "0", navigator.Evaluate (expression, iterator).ToString ());
85                         iterator.MoveNext();
86                         AssertEquals ("#5", "1", navigator.Evaluate (expression, iterator).ToString ());
87                         iterator.MoveNext ();
88                         AssertEquals ("#6", "2", navigator.Evaluate (expression, iterator).ToString ());
89                         iterator.MoveNext ();
90                         AssertEquals ("#7", "3", navigator.Evaluate (expression, iterator).ToString ());
91                 }
92
93                 [Test]
94                 public void CoreFunctionNodeSetCount ()
95                 {
96                         AssertEquals ("5", navigator.Evaluate ("count(//*)").ToString ());
97                         AssertEquals ("1", navigator.Evaluate ("count(//foo)").ToString ());
98                         AssertEquals ("1", navigator.Evaluate ("count(/foo)").ToString ());
99                         AssertEquals ("1", navigator.Evaluate ("count(/foo/bar)").ToString ());
100
101                         AssertEquals ("3", navigator2.Evaluate ("count(//bar)").ToString ());
102                 }
103
104                 public void saveTestCoreFunctionNodeSetID ()
105                 {
106                         document.LoadXml (
107                                 "<!DOCTYPE foo [" +
108                                 "<!ELEMENT foo (bar)>" +
109                                 "<!ELEMENT bar EMPTY>" +
110                                 "<!ATTLIST bar baz ID #REQUIRED>" +
111                                 "]>" +
112                                 "<foo><bar baz='1' qux='hello' /><bar baz='2' qux='world' /></foo>");
113                         navigator = document.CreateNavigator();
114
115                         AssertEquals ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString ());
116                         AssertEquals ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString ());
117                 }
118
119                 [Test]
120                 public void CoreFunctionLocalName ()
121                 {
122                         AssertEquals ("", navigator.Evaluate ("local-name()").ToString ());
123                         AssertEquals ("", navigator.Evaluate ("local-name(/bogus)").ToString ());
124                         AssertEquals ("foo", navigator.Evaluate ("local-name(/foo)").ToString ());
125                         AssertEquals ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString ());
126                 }
127
128                 // TODO:  umm.  Unable to make this return a namespace-uri so far...
129                 [Test]
130                 public void CoreFunctionNamespaceURI ()
131                 {
132                         document.LoadXml ("<foo:bar xmlns:foo='#foo'><foo:baz><foo:qux /></foo:baz></foo:bar>");
133                         navigator = document.CreateNavigator ();
134
135                         AssertEquals ("", navigator.Evaluate ("namespace-uri()").ToString ());
136                         AssertEquals ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString ());
137                         //AssertEquals("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString ());
138                         AssertEquals ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString ());
139                 }
140
141                 public void saveTestCoreFunctionString ()
142                 {
143                         document.LoadXml ("<foo>hello<bar>world</bar><baz>how are you</baz></foo>");
144                         navigator = document.CreateNavigator ();
145
146                         AssertEquals ("world", navigator.Evaluate ("string(/foo/*)").ToString ());
147                         AssertEquals ("NaN", navigator.Evaluate ("string(0 div 0)").ToString ());
148                         
149                         try {
150                                 navigator.Evaluate ("string(+0)");
151                                 Fail ("Expected an XPathException to be thrown.");
152                         } catch (XPathException) {}
153                         
154                         AssertEquals ("0", navigator.Evaluate ("string(-0)").ToString ());                      
155                         AssertEquals ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString ());
156                         AssertEquals ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString ());
157                         AssertEquals ("45", navigator.Evaluate ("string(45)").ToString ());
158                         AssertEquals ("-22", navigator.Evaluate ("string(-22)").ToString ());
159                         AssertEquals ("0.25", navigator.Evaluate ("string(.25)").ToString ());
160                         AssertEquals ("-0.25", navigator.Evaluate ("string(-.25)").ToString ());
161                         AssertEquals ("2", navigator.Evaluate ("string(2.0)").ToString ());
162                         AssertEquals ("2.01", navigator.Evaluate ("string(2.01)").ToString ());
163                         AssertEquals ("-3", navigator.Evaluate ("string(-3.0)").ToString ());
164                         AssertEquals ("3.45", navigator.Evaluate ("string(3.45)").ToString ());
165
166                         // Wonder what this will look like under a different platform.
167                         AssertEquals("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString ());
168                 }
169
170                 [Test]
171                 public void CoreFunctionConcat ()
172                 {
173                         try {
174                                 navigator.Evaluate ("concat()");
175                                 Fail ("Expected an XPathException to be thrown.");
176                         } catch (XPathException) {}
177
178                         try {
179                                 navigator.Evaluate ("concat('foo')");
180                                 Fail ("Expected an XPathException to be thrown.");
181                         } catch (XPathException) {}
182
183                         AssertEquals ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString ());
184                         AssertEquals ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString ());
185                         AssertEquals ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString ());
186                         AssertEquals ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString ());
187                 }
188
189                 [Test]
190                 public void CoreFunctionStartsWith ()
191                 {
192                         try {
193                                 navigator.Evaluate ("starts-with()");
194                                 Fail ("Expected an XPathException to be thrown.");
195                         } catch (XPathException) {}
196
197                         try {
198                                 navigator.Evaluate ("starts-with('foo')");
199                                 Fail ("Expected an XPathException to be thrown.");
200                         } catch (XPathException) {}
201
202                         try {
203                                 navigator.Evaluate ("starts-with('foo', 'bar', 'baz')");
204                                 Fail ("Expected an XPathException to be thrown.");
205                         } catch (XPathException) {}
206
207                         Assert ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')"));
208                         Assert (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')"));
209                 }
210
211                 [Test]
212                 public void CoreFunctionContains ()
213                 {
214                         try {
215                                 navigator.Evaluate ("contains()");
216                                 Fail ("Expected an XPathException to be thrown.");
217                         } catch (XPathException) {}
218
219                         try {
220                                 navigator.Evaluate ("contains('foo')");
221                                 Fail ("Expected an XPathException to be thrown.");
222                         } catch (XPathException) {}
223
224                         try {
225                                 navigator.Evaluate ("contains('foobar', 'oob', 'baz')");
226                                 Fail ("Expected an XPathException to be thrown.");
227                         } catch (XPathException) {}
228
229                         Assert ((bool)navigator.Evaluate ("contains('foobar', 'oob')"));
230                         Assert (!(bool)navigator.Evaluate ("contains('foobar', 'baz')"));
231                 }
232         }
233 }