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 TranslateFunctionTest 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 public void testTranslate() throws JaxenException
94 {
95 XPath xpath = new DOMXPath( "translate('abc', 'b', 'd')" );
96 String result = (String) xpath.evaluate( doc );
97 assertEquals("adc", result);
98 }
99
100 public void testTranslateIgnoresExtraArguments() throws JaxenException
101 {
102 XPath xpath = new DOMXPath( "translate('abc', 'b', 'dghf')" );
103 String result = (String) xpath.evaluate( doc );
104 assertEquals("adc", result);
105 }
106
107 public void testTranslateFunctionRequiresAtLeastThreeArguments()
108 throws JaxenException {
109
110 XPath xpath = new DOMXPath("translate('a', 'b')");
111
112 try {
113 xpath.selectNodes(doc);
114 fail("Allowed translate function with two arguments");
115 }
116 catch (FunctionCallException ex) {
117 assertNotNull(ex.getMessage());
118 }
119
120 }
121
122 public void testTranslateRequiresAtMostThreeArguments()
123 throws JaxenException {
124
125 XPath xpath = new DOMXPath("substring-after('a', 'a', 'a', 'a')");
126
127 try {
128 xpath.selectNodes(doc);
129 fail("Allowed translate function with four arguments");
130 }
131 catch (FunctionCallException ex) {
132 assertNotNull(ex.getMessage());
133 }
134
135 }
136
137 public void testTranslateStringThatContainsNonBMPChars() throws JaxenException
138 {
139 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', 'b', 'd')" );
140 String result = (String) xpath.evaluate( doc );
141 assertEquals("ad\uD834\uDD00d", result);
142 }
143
144
145 public void testTranslateNonBMPChars() throws JaxenException
146 {
147 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'd')" );
148 String result = (String) xpath.evaluate( doc );
149 assertEquals("abdb", result);
150 }
151
152
153 public void testTranslateNonBMPChars2() throws JaxenException
154 {
155 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'da')" );
156 String result = (String) xpath.evaluate( doc );
157 assertEquals("abdb", result);
158 }
159
160
161 public void testTranslateWithNonBMPChars() throws JaxenException
162 {
163 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00')" );
164 String result = (String) xpath.evaluate( doc );
165 assertEquals("ab\uD834\uDD00", result);
166 }
167
168
169 public void testTranslateWithNonBMPChars2() throws JaxenException
170 {
171 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00b')" );
172 String result = (String) xpath.evaluate( doc );
173 assertEquals("ab\uD834\uDD00", result);
174 }
175
176
177 public void testTranslateWithMalformedSurrogatePair() throws JaxenException
178 {
179 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834X\uDD00b')" );
180 try {
181 xpath.evaluate( doc );
182 fail("Allowed malformed surrogate pair");
183 }
184 catch (FunctionCallException ex) {
185 assertNotNull(ex.getMessage());
186 }
187 }
188
189
190 public void testTranslateWithMissingLowSurrogate() throws JaxenException
191 {
192 XPath xpath = new DOMXPath( "translate('abc', 'c', 'AB\uD834X')" );
193 try {
194 xpath.evaluate( doc );
195 fail("Allowed malformed surrogate pair");
196 }
197 catch (FunctionCallException ex) {
198 assertNotNull(ex.getMessage());
199 }
200 }
201
202
203 public void testTranslateWithExtraCharsInReplacementString() throws JaxenException
204 {
205 XPath xpath = new DOMXPath( "translate('abc', 'c', 'def')" );
206 String result = (String) xpath.evaluate( doc );
207 assertEquals("abd", result);
208 }
209
210
211 }