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
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 public void testTranslateStringThatContainsPrivateUseChars() throws JaxenException
131 {
132 XPath xpath = new DOMXPath( "translate('ab\uE000\uE001', '\uE000', '\uE001')" );
133 String result = (String) xpath.evaluate( doc );
134 assertEquals("ab\uE001\uE001", result);
135 }
136
137 public void testTranslateNonBMPChars() throws JaxenException
138 {
139 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'd')" );
140 String result = (String) xpath.evaluate( doc );
141 assertEquals("abdb", result);
142 }
143
144
145 public void testTranslateNonBMPChars2() throws JaxenException
146 {
147 XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'da')" );
148 String result = (String) xpath.evaluate( doc );
149 assertEquals("abdb", result);
150 }
151
152
153 public void testTranslateWithNonBMPChars() throws JaxenException
154 {
155 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00')" );
156 String result = (String) xpath.evaluate( doc );
157 assertEquals("ab\uD834\uDD00", result);
158 }
159
160
161 public void testTranslateWithNonBMPChars2() throws JaxenException
162 {
163 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00b')" );
164 String result = (String) xpath.evaluate( doc );
165 assertEquals("ab\uD834\uDD00", result);
166 }
167
168
169 public void testTranslateWithMalformedSurrogatePair() throws JaxenException
170 {
171 XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834X\uDD00b')" );
172 try {
173 xpath.evaluate( doc );
174 fail("Allowed malformed surrogate pair");
175 }
176 catch (FunctionCallException ex) {
177 assertNotNull(ex.getMessage());
178 }
179 }
180
181
182 public void testTranslateWithMissingLowSurrogate() throws JaxenException
183 {
184 XPath xpath = new DOMXPath( "translate('abc', 'c', 'AB\uD834X')" );
185 try {
186 xpath.evaluate( doc );
187 fail("Allowed malformed surrogate pair");
188 }
189 catch (FunctionCallException ex) {
190 assertNotNull(ex.getMessage());
191 }
192 }
193
194
195 public void testTranslateWithExtraCharsInReplacementString() throws JaxenException
196 {
197 XPath xpath = new DOMXPath( "translate('abc', 'c', 'def')" );
198 String result = (String) xpath.evaluate( doc );
199 assertEquals("abd", result);
200 }
201
202
203 }