1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 package org.jaxen.test;
49
50 import java.util.List;
51
52 import javax.xml.parsers.DocumentBuilder;
53 import javax.xml.parsers.DocumentBuilderFactory;
54 import javax.xml.parsers.ParserConfigurationException;
55
56 import junit.framework.TestCase;
57
58 import org.jaxen.FunctionCallException;
59 import org.jaxen.JaxenException;
60 import org.jaxen.XPath;
61 import org.jaxen.dom.DOMXPath;
62 import org.jaxen.dom.DocumentNavigator;
63 import org.jaxen.function.StringFunction;
64 import org.w3c.dom.Document;
65
66 /***
67 * @author Elliotte Rusty Harold
68 *
69 */
70 public class StringTest extends TestCase {
71
72 private Document doc;
73
74 public void setUp() throws ParserConfigurationException
75 {
76 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
77 factory.setNamespaceAware(true);
78 DocumentBuilder builder = factory.newDocumentBuilder();
79 doc = builder.newDocument();
80 }
81
82
83 public StringTest(String name) {
84 super(name);
85 }
86
87
88 public void testStringFunctionOperatesOnFirstNodeInDocumentOrder()
89 throws JaxenException {
90
91 XPath xpath = new DOMXPath("string(//x)");
92 org.w3c.dom.Element a = doc.createElementNS("", "a");
93 org.w3c.dom.Element b = doc.createElementNS("", "b");
94 doc.appendChild(a);
95 a.appendChild(b);
96 org.w3c.dom.Element x2 = doc.createElementNS("", "x");
97 org.w3c.dom.Element x3 = doc.createElementNS("", "x");
98 org.w3c.dom.Element x4 = doc.createElementNS("", "x");
99 a.appendChild(x4);
100 b.appendChild(x2);
101 b.appendChild(x3);
102 x2.appendChild(doc.createTextNode("2"));
103 x3.appendChild(doc.createTextNode("3"));
104 x4.appendChild(doc.createTextNode("4"));
105
106 List result = xpath.selectNodes(doc);
107 assertEquals(1, result.size());
108 assertEquals("2", result.get(0));
109
110 }
111
112 public void testStringValueOfComment()
113 throws JaxenException {
114
115 XPath xpath = new DOMXPath("string(/a/comment())");
116 org.w3c.dom.Element a = doc.createElementNS("", "a");
117 doc.appendChild(a);
118 a.appendChild(doc.createComment("data"));
119
120 String result = (String) xpath.evaluate(doc);
121 assertEquals("data", result);
122
123 }
124
125 public void testStringValueOfNull() {
126 assertEquals("", StringFunction.evaluate(null, null));
127 }
128
129 public void testStringValueOfNullWithNonNullNavigator() {
130 assertEquals("", StringFunction.evaluate(null, new DocumentNavigator()));
131 }
132
133 public void testStringValueOfNamespaceNode()
134 throws JaxenException {
135
136 XPath xpath = new DOMXPath("string(/a/namespace::node())");
137 org.w3c.dom.Element a = doc.createElementNS("", "a");
138 doc.appendChild(a);
139
140 String result = (String) xpath.evaluate(doc);
141 assertEquals("http://www.w3.org/XML/1998/namespace", result);
142
143 }
144
145 public void testSmallNumbersDontUseExponentialNotation() throws JaxenException {
146 XPath xpath = new DOMXPath("string(0.0000003)");
147 String result = (String) xpath.evaluate(null);
148 assertEquals("0.0000003", result);
149 }
150
151 public void testBigNumbersDontUseExponentialNotation() throws JaxenException {
152 XPath xpath = new DOMXPath("string(100000000.5)");
153 String result = (String) xpath.evaluate(null);
154 assertEquals("100000000.5", result);
155 }
156
157 public void testStringOfInfinity() throws JaxenException {
158 XPath xpath = new DOMXPath("string(1 div 0)");
159 String result = (String) xpath.evaluate(null);
160 assertEquals("Infinity", result);
161 }
162
163 public void testStringOfNegativeInfinity() throws JaxenException {
164 XPath xpath = new DOMXPath("string(-1 div 0)");
165 String result = (String) xpath.evaluate(null);
166 assertEquals("-Infinity", result);
167 }
168
169 public void testStringOfNegativeZero() throws JaxenException {
170 XPath xpath = new DOMXPath("string(-0)");
171 String result = (String) xpath.evaluate(null);
172 assertEquals("0", result);
173 }
174
175 public void testIntegersAreFormattedAsInts() throws JaxenException {
176 XPath xpath = new DOMXPath("string(12)");
177 String result = (String) xpath.evaluate(null);
178 assertEquals("12", result);
179 }
180
181 public void testStringFunctionRequiresAtMostOneArgument()
182 throws JaxenException {
183
184 XPath xpath = new DOMXPath("string('a', 1)");
185
186 try {
187 xpath.selectNodes(doc);
188 fail("Allowed string function with two arguments");
189 }
190 catch (FunctionCallException ex) {
191 assertNotNull(ex.getMessage());
192 }
193
194 }
195 }