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