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
49
50
51
52
53
54
55
56
57
58
59
60
61
62 package org.jaxen.function;
63
64 import javax.xml.parsers.DocumentBuilder;
65 import javax.xml.parsers.DocumentBuilderFactory;
66 import javax.xml.parsers.ParserConfigurationException;
67
68 import junit.framework.TestCase;
69
70 import org.jaxen.FunctionCallException;
71 import org.jaxen.JaxenException;
72 import org.jaxen.XPath;
73 import org.jaxen.dom.DOMXPath;
74 import org.w3c.dom.Document;
75
76 /***
77 * @author Elliotte Rusty Harold
78 *
79 */
80 public class SubstringTest extends TestCase {
81
82 private Document doc;
83
84 public void setUp() throws ParserConfigurationException
85 {
86 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
87 factory.setNamespaceAware(true);
88 DocumentBuilder builder = factory.newDocumentBuilder();
89 doc = builder.newDocument();
90 doc.appendChild(doc.createElement("root"));
91 }
92
93
94 public SubstringTest(String name) {
95 super(name);
96 }
97
98 public void testSubstringOfNumber() throws JaxenException
99 {
100 XPath xpath = new DOMXPath( "substring(1234, 3)" );
101 String result = (String) xpath.evaluate( doc );
102 assertEquals("34", result);
103 }
104
105 public void testSubstringOfNumber2() throws JaxenException
106 {
107 XPath xpath = new DOMXPath( "substring(1234, 2, 3)" );
108 String result = (String) xpath.evaluate( doc );
109 assertEquals("234", result);
110 }
111
112
113
114 public void testUnusualSubstring1() throws JaxenException
115 {
116 XPath xpath = new DOMXPath( "substring('12345', 1.5, 2.6)" );
117 String result = (String) xpath.evaluate( doc );
118 assertEquals("234", result);
119 }
120
121
122 public void testUnusualSubstring2() throws JaxenException
123 {
124 XPath xpath = new DOMXPath( "substring('12345', 0, 3)" );
125 String result = (String) xpath.evaluate( doc );
126 assertEquals("12", result);
127 }
128
129
130 public void testUnusualSubstring3() throws JaxenException
131 {
132 XPath xpath = new DOMXPath( "substring('12345', 0 div 0, 3)" );
133 String result = (String) xpath.evaluate( doc );
134 assertEquals("", result);
135 }
136
137 public void testUnusualSubstring4() throws JaxenException
138 {
139 XPath xpath = new DOMXPath( "substring('12345', 1, 0 div 0)" );
140 String result = (String) xpath.evaluate( doc );
141 assertEquals("", result);
142 }
143
144 public void testUnusualSubstring5() throws JaxenException
145 {
146 XPath xpath = new DOMXPath( "substring('12345', -42, 1 div 0)" );
147 String result = (String) xpath.evaluate( doc );
148 assertEquals("12345", result);
149 }
150
151 public void testUnusualSubstring6() throws JaxenException
152 {
153 XPath xpath = new DOMXPath( "substring('12345', -1 div 0, 1 div 0)" );
154 String result = (String) xpath.evaluate( doc );
155 assertEquals("", result);
156 }
157
158
159 public void testSubstringOfNaN() throws JaxenException
160 {
161 XPath xpath = new DOMXPath( "substring(0 div 0, 2)" );
162 String result = (String) xpath.evaluate( doc );
163 assertEquals("aN", result);
164 }
165
166
167 public void testSubstringOfEmptyString() throws JaxenException
168 {
169 XPath xpath = new DOMXPath( "substring('', 2)" );
170 String result = (String) xpath.evaluate( doc );
171 assertEquals("", result);
172 }
173
174
175 public void testSubstringWithNegativeLength() throws JaxenException
176 {
177 XPath xpath = new DOMXPath( "substring('12345', 2, -3)" );
178 String result = (String) xpath.evaluate( doc );
179 assertEquals("", result);
180 }
181
182
183 public void testSubstringWithExcessiveLength() throws JaxenException
184 {
185 XPath xpath = new DOMXPath( "substring('12345', 2, 32)" );
186 String result = (String) xpath.evaluate( doc );
187 assertEquals("2345", result);
188 }
189
190
191 public void testSubstringWithNegativeLength2() throws JaxenException
192 {
193 XPath xpath = new DOMXPath( "substring('12345', 2, -1)" );
194 String result = (String) xpath.evaluate( doc );
195 assertEquals("", result);
196 }
197
198
199 public void testSubstringFunctionRequiresAtLeastTwoArguments()
200 throws JaxenException {
201
202 XPath xpath = new DOMXPath("substring('a')");
203
204 try {
205 xpath.selectNodes(doc);
206 fail("Allowed substring function with one argument");
207 }
208 catch (FunctionCallException ex) {
209 assertNotNull(ex.getMessage());
210 }
211
212 }
213
214 public void testNegativeStartNoLength()
215 throws JaxenException {
216
217 XPath xpath = new DOMXPath("substring('Hello', -50)");
218 String result = (String) xpath.evaluate( doc );
219 assertEquals("Hello", result);
220
221 }
222
223 public void testNegativeStartWithLength()
224 throws JaxenException {
225
226 XPath xpath = new DOMXPath("substring('Hello', -50, 20)");
227 String result = (String) xpath.evaluate( doc );
228 assertEquals("", result);
229
230 }
231
232 public void testSubstringFunctionRequiresAtMostThreeArguments()
233 throws JaxenException {
234
235 XPath xpath = new DOMXPath("substring('a', 1, 1, 4)");
236
237 try {
238 xpath.selectNodes(doc);
239 fail("Allowed substring function with four arguments");
240 }
241 catch (FunctionCallException ex) {
242 assertNotNull(ex.getMessage());
243 }
244
245 }
246
247 public void testStringLengthCountsUnicodeCharactersNotJavaChars()
248 throws JaxenException {
249
250 XPath xpath = new DOMXPath("substring('A\uD834\uDD00', 1, 2)");
251 String result = (String) xpath.evaluate( doc );
252 assertEquals("A\uD834\uDD00", result);
253
254 }
255
256
257 public void testStringLengthIndexesUnicodeCharactersNotJavaChars()
258 throws JaxenException {
259
260 XPath xpath = new DOMXPath("substring('A\uD834\uDD00', 3, 1)");
261 String result = (String) xpath.evaluate( doc );
262 assertEquals("", result);
263
264 }
265
266
267 public void testStringLengthIndexesAndCountsUnicodeCharactersNotJavaChars()
268 throws JaxenException {
269
270 XPath xpath = new DOMXPath("substring('A\uD834\uDD00123', 3, 2)");
271 String result = (String) xpath.evaluate( doc );
272 assertEquals("12", result);
273
274 }
275
276
277 }