2003-01-26 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / Test / XPathNavigatorEvaluateTests.cs
1 //
2 // MonoTests.System.Xml.XPathNavigatorEvaluateTests
3 //
4 // Author:
5 //   Kral Ferch <kral_ferch@hotmail.com>
6 //
7 // (C) 2002 Kral Ferch
8 //
9
10 using System;
11 using System.Xml;
12 using System.Xml.XPath;
13
14 using NUnit.Framework;
15
16 namespace MonoTests.System.Xml
17 {
18         public class XPathNavigatorEvaluateTests : TestCase
19         {
20                 public XPathNavigatorEvaluateTests () : base ("MonoTests.System.Xml.XPathNavigatorEvaluateTests testsuite") {}
21                 public XPathNavigatorEvaluateTests (string name) : base (name) {}
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                 protected override void SetUp ()
33                 {
34                         document = new XmlDocument ();
35                         document.LoadXml ("<foo><bar/><baz/><qux/><squonk/></foo>");
36                         navigator = document.CreateNavigator ();
37
38                         document2 = new XmlDocument ();
39                         document2.LoadXml ("<foo><bar baz='1'/><bar baz='2'/><bar baz='3'/></foo>");
40                         navigator2 = document2.CreateNavigator ();
41
42                         document3 = new XmlDocument ();
43                         document3.LoadXml ("<foo><bar/><baz/><qux/></foo>");
44                         navigator3 = document3.CreateNavigator ();
45                 }
46
47                 // Testing Core Function Library functions defined at: http://www.w3.org/TR/xpath#corelib
48                 public void TestCoreFunctionNodeSetLast ()
49                 {
50                         expression = navigator.Compile("last()");
51                         iterator = navigator.Select("/foo");
52                         AssertEquals ("0", navigator.Evaluate ("last()").ToString());
53                         AssertEquals ("0", navigator.Evaluate (expression, null).ToString ());
54                         AssertEquals ("1", navigator.Evaluate (expression, iterator).ToString ());
55                         iterator = navigator.Select("/foo/*");
56                         AssertEquals ("4", navigator.Evaluate (expression, iterator).ToString ());
57                         
58                         AssertEquals("3", navigator2.Evaluate ("string(//bar[last()]/@baz)"));
59                 }
60
61                 public void TestCoreFunctionNodeSetPosition ()
62                 {
63                         expression = navigator.Compile("position()");
64                         iterator = navigator.Select("/foo");
65                         AssertEquals ("0", navigator.Evaluate ("position()").ToString ());
66                         AssertEquals ("0", navigator.Evaluate (expression, null).ToString ());
67                         AssertEquals ("0", navigator.Evaluate (expression, iterator).ToString ());
68                         iterator = navigator.Select("/foo/*");
69                         AssertEquals ("0", navigator.Evaluate (expression, iterator).ToString ());
70                         iterator.MoveNext();
71                         AssertEquals ("1", navigator.Evaluate (expression, iterator).ToString ());
72                         iterator.MoveNext ();
73                         AssertEquals ("2", navigator.Evaluate (expression, iterator).ToString ());
74                         iterator.MoveNext ();
75                         AssertEquals ("3", navigator.Evaluate (expression, iterator).ToString ());
76                 }
77
78                 public void TestCoreFunctionNodeSetCount ()
79                 {
80                         AssertEquals ("5", navigator.Evaluate ("count(//*)").ToString ());
81                         AssertEquals ("1", navigator.Evaluate ("count(//foo)").ToString ());
82                         AssertEquals ("1", navigator.Evaluate ("count(/foo)").ToString ());
83                         AssertEquals ("1", navigator.Evaluate ("count(/foo/bar)").ToString ());
84
85                         AssertEquals ("3", navigator2.Evaluate ("count(//bar)").ToString ());
86                 }
87
88                 public void saveTestCoreFunctionNodeSetID ()
89                 {
90                         document.LoadXml (
91                                 "<!DOCTYPE foo [" +
92                                 "<!ELEMENT foo (bar)>" +
93                                 "<!ELEMENT bar EMPTY>" +
94                                 "<!ATTLIST bar baz ID #REQUIRED>" +
95                                 "]>" +
96                                 "<foo><bar baz='1' qux='hello' /><bar baz='2' qux='world' /></foo>");
97                         navigator = document.CreateNavigator();
98
99                         AssertEquals ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString ());
100                         AssertEquals ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString ());
101                 }
102
103                 public void TestCoreFunctionLocalName ()
104                 {
105                         AssertEquals ("", navigator.Evaluate ("local-name()").ToString ());
106                         AssertEquals ("", navigator.Evaluate ("local-name(/bogus)").ToString ());
107                         AssertEquals ("foo", navigator.Evaluate ("local-name(/foo)").ToString ());
108                         AssertEquals ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString ());
109                 }
110
111                 // TODO:  umm.  Unable to make this return a namespace-uri so far...
112                 public void TestCoreFunctionNamespaceURI ()
113                 {
114                         document.LoadXml ("<foo:bar xmlns:foo='#foo'><foo:baz><foo:qux /></foo:baz></foo:bar>");
115                         navigator = document.CreateNavigator ();
116
117                         AssertEquals ("", navigator.Evaluate ("namespace-uri()").ToString ());
118                         AssertEquals ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString ());
119                         //AssertEquals("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString ());
120                         AssertEquals ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString ());
121                 }
122
123                 public void saveTestCoreFunctionString ()
124                 {
125                         document.LoadXml ("<foo>hello<bar>world</bar><baz>how are you</baz></foo>");
126                         navigator = document.CreateNavigator ();
127
128                         AssertEquals ("world", navigator.Evaluate ("string(/foo/*)").ToString ());
129                         AssertEquals ("NaN", navigator.Evaluate ("string(0 div 0)").ToString ());
130                         
131                         try {
132                                 navigator.Evaluate ("string(+0)");
133                                 Fail ("Expected an XPathException to be thrown.");
134                         } catch (XPathException) {}
135                         
136                         AssertEquals ("0", navigator.Evaluate ("string(-0)").ToString ());                      
137                         AssertEquals ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString ());
138                         AssertEquals ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString ());
139                         AssertEquals ("45", navigator.Evaluate ("string(45)").ToString ());
140                         AssertEquals ("-22", navigator.Evaluate ("string(-22)").ToString ());
141                         AssertEquals ("0.25", navigator.Evaluate ("string(.25)").ToString ());
142                         AssertEquals ("-0.25", navigator.Evaluate ("string(-.25)").ToString ());
143                         AssertEquals ("2", navigator.Evaluate ("string(2.0)").ToString ());
144                         AssertEquals ("2.01", navigator.Evaluate ("string(2.01)").ToString ());
145                         AssertEquals ("-3", navigator.Evaluate ("string(-3.0)").ToString ());
146                         AssertEquals ("3.45", navigator.Evaluate ("string(3.45)").ToString ());
147
148                         // Wonder what this will look like under a different platform.
149                         AssertEquals("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString ());
150                 }
151
152                 public void TestCoreFunctionConcat ()
153                 {
154                         try {
155                                 navigator.Evaluate ("concat()");
156                                 Fail ("Expected an XPathException to be thrown.");
157                         } catch (XPathException) {}
158
159                         try {
160                                 navigator.Evaluate ("concat('foo')");
161                                 Fail ("Expected an XPathException to be thrown.");
162                         } catch (XPathException) {}
163
164                         AssertEquals ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString ());
165                         AssertEquals ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString ());
166                         AssertEquals ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString ());
167                         AssertEquals ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString ());
168                 }
169
170                 public void TestCoreFunctionStartsWith ()
171                 {
172                         try {
173                                 navigator.Evaluate ("starts-with()");
174                                 Fail ("Expected an XPathException to be thrown.");
175                         } catch (XPathException) {}
176
177                         try {
178                                 navigator.Evaluate ("starts-with('foo')");
179                                 Fail ("Expected an XPathException to be thrown.");
180                         } catch (XPathException) {}
181
182                         try {
183                                 navigator.Evaluate ("starts-with('foo', 'bar', 'baz')");
184                                 Fail ("Expected an XPathException to be thrown.");
185                         } catch (XPathException) {}
186
187                         Assert ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')"));
188                         Assert (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')"));
189                 }
190
191                 public void TestCoreFunctionContains ()
192                 {
193                         try {
194                                 navigator.Evaluate ("contains()");
195                                 Fail ("Expected an XPathException to be thrown.");
196                         } catch (XPathException) {}
197
198                         try {
199                                 navigator.Evaluate ("contains('foo')");
200                                 Fail ("Expected an XPathException to be thrown.");
201                         } catch (XPathException) {}
202
203                         try {
204                                 navigator.Evaluate ("contains('foobar', 'oob', 'baz')");
205                                 Fail ("Expected an XPathException to be thrown.");
206                         } catch (XPathException) {}
207
208                         Assert ((bool)navigator.Evaluate ("contains('foobar', 'oob')"));
209                         Assert (!(bool)navigator.Evaluate ("contains('foobar', 'baz')"));
210                 }
211         }
212 }