1 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 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 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 } 278 | Popular Tags |