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 javax.xml.parsers.DocumentBuilder;
51 import javax.xml.parsers.DocumentBuilderFactory;
52 import javax.xml.parsers.ParserConfigurationException;
53
54 import junit.framework.TestCase;
55
56 import org.jaxen.FunctionCallException;
57 import org.jaxen.JaxenException;
58 import org.jaxen.XPath;
59 import org.jaxen.dom.DOMXPath;
60 import org.w3c.dom.Document;
61
62 /***
63 * @author Elliotte Rusty Harold
64 *
65 */
66 public class TranslateFunctionTest extends TestCase {
67
68 private Document doc;
69
70 protected void setUp() throws ParserConfigurationException
71 {
72 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
73 factory.setNamespaceAware(true);
74 DocumentBuilder builder = factory.newDocumentBuilder();
75 doc = builder.newDocument();
76 doc.appendChild(doc.createElement("root"));
77 }
78
79 public void testTranslate() throws JaxenException
80 {
81 XPath xpath = new DOMXPath( "translate('abc', 'b', 'd')" );
82 String result = (String) xpath.evaluate( doc );
83 assertEquals("adc", result);
84 }
85
86 public void testTranslateIgnoresExtraArguments() throws JaxenException
87 {
88 XPath xpath = new DOMXPath( "translate('abc', 'b', 'dghf')" );
89 String result = (String) xpath.evaluate( doc );
90 assertEquals("adc", result);
91 }
92
93 public void testTranslateFunctionRequiresAtLeastThreeArguments()
94 throws JaxenException {
95
96 XPath xpath = new DOMXPath("translate('a', 'b')");
97
98 try {
99 xpath.selectNodes(doc);
100 fail("Allowed translate function with two arguments");
101 }
102 catch (FunctionCallException ex) {
103 assertNotNull(ex.getMessage());
104 }
105
106 }
107
108 public void testTranslateRequiresAtMostThreeArguments()
109 throws JaxenException {
110
111 XPath xpath = new DOMXPath("substring-after('a', 'a', 'a', 'a')");
112
113 try {
114 xpath.selectNodes(doc);
115 fail("Allowed translate function with four arguments");
116 }
117 catch (FunctionCallException ex) {
118 assertNotNull(ex.getMessage());
119 }
120
121 }
122
123 public void testTranslateStringThatContainsNonBMPChars() throws JaxenException
124 {
125 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', 'b', 'd')" );
126 String result = (String) xpath.evaluate( doc );
127 assertEquals("ad\uD834\uDD00d", result);
128 }
129
130
131 public void testTranslateNonBMPChars() throws JaxenException
132 {
133 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'd')" );
134 String result = (String) xpath.evaluate( doc );
135 assertEquals("abdb", result);
136 }
137
138
139 public void testTranslateNonBMPChars2() throws JaxenException
140 {
141 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'da')" );
142 String result = (String) xpath.evaluate( doc );
143 assertEquals("abdb", result);
144 }
145
146
147 public void testTranslateWithNonBMPChars() throws JaxenException
148 {
149 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00')" );
150 String result = (String) xpath.evaluate( doc );
151 assertEquals("ab\uD834\uDD00", result);
152 }
153
154
155 public void testTranslateWithNonBMPChars2() throws JaxenException
156 {
157 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00b')" );
158 String result = (String) xpath.evaluate( doc );
159 assertEquals("ab\uD834\uDD00", result);
160 }
161
162
163 public void testTranslateWithMalformedSurrogatePair() throws JaxenException
164 {
165 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834X\uDD00b')" );
166 try {
167 xpath.evaluate( doc );
168 fail("Allowed malformed surrogate pair");
169 }
170 catch (FunctionCallException ex) {
171 assertNotNull(ex.getMessage());
172 }
173 }
174
175
176 public void testTranslateWithMissingLowSurrogate() throws JaxenException
177 {
178 XPath xpath = new DOMXPath( "translate('abc', 'c', 'AB\uD834X')" );
179 try {
180 xpath.evaluate( doc );
181 fail("Allowed malformed surrogate pair");
182 }
183 catch (FunctionCallException ex) {
184 assertNotNull(ex.getMessage());
185 }
186 }
187
188
189 public void testTranslateWithExtraCharsInReplacementString() throws JaxenException
190 {
191 XPath xpath = new DOMXPath( "translate('abc', 'c', 'def')" );
192 String result = (String) xpath.evaluate( doc );
193 assertEquals("abd", result);
194 }
195
196
197 }