1 43 44 package de.susebox.jtopas; 45 46 import java.io.InputStream ; 50 import java.io.FileInputStream ; 51 import java.io.InputStreamReader ; 52 import java.util.Vector ; 53 import java.util.Properties ; 54 import java.net.URL ; 55 56 import junit.framework.Test; 57 import junit.framework.TestCase; 58 import junit.framework.TestSuite; 59 import junit.framework.Assert; 60 61 import de.susebox.java.lang.ExtRuntimeException; 62 63 import de.susebox.TestUtilities; 64 65 66 70 86 public class TestEmbeddedTokenizer extends TestCase { 87 88 92 96 public static final String CONFIG_FILE = "TestEmbeddedTokenizer.conf"; 97 98 101 public static final String PROP_PATH = "Path"; 102 103 106 public static final String PROP_JAVAPATH = "JavaPath"; 107 108 109 113 118 public static void main(String [] args) { 119 String [] tests = { TestEmbeddedTokenizer.class.getName() }; 120 121 TestUtilities.run(tests, args); 122 } 123 124 125 129 135 public static Test suite() { 136 TestSuite suite = new TestSuite(TestEmbeddedTokenizer.class.getName()); 137 Properties props = new Properties (); 138 int count = 1; 139 String path; 140 URL url; 141 142 try { 143 props.load(TestEmbeddedTokenizer.class.getResourceAsStream(CONFIG_FILE)); 144 } catch (Exception ex) { 145 throw new ExtRuntimeException(ex); 146 } 147 148 while ((path = props.getProperty(PROP_PATH + count)) != null) { 150 if ((url = TestEmbeddedTokenizer.class.getResource(path)) != null) { 151 path = url.getFile(); 152 } 153 suite.addTest(new TestEmbeddedTokenizer("testEmbeddedTokenizer", path)); 154 count++; 155 } 156 157 count = 1; 159 while ((path = props.getProperty(PROP_JAVAPATH + count)) != null) { 160 if ((url = TestEmbeddedTokenizer.class.getResource(path)) != null) { 161 path = url.getFile(); 162 } 163 suite.addTest(new TestEmbeddedTokenizer("testJavaTokenizer", path)); 164 count++; 165 } 166 return suite; 167 } 168 169 170 174 180 public TestEmbeddedTokenizer(String test, String path) { 181 super(test); 182 _path = path; 183 } 184 185 186 190 196 protected void setUp() throws Exception { 197 InputStream stream = new FileInputStream (_path); 198 199 _reader = new InputStreamReader (stream); 200 } 201 202 203 209 protected void tearDown() throws Exception { 210 _reader.close(); 211 } 212 213 217 218 227 public void testJavaTokenizer() throws Throwable { 228 long start = System.currentTimeMillis(); 229 StandardTokenizerProperties javaProps = new StandardTokenizerProperties(); 230 StandardTokenizerProperties docProps = new StandardTokenizerProperties(); 231 StandardTokenizer javaTokenizer = new StandardTokenizer(javaProps); 232 StandardTokenizer docTokenizer = new StandardTokenizer(docProps); 233 StandardTokenizer currTokenizer = javaTokenizer; 234 Object openBlock = new Object (); 235 Object closeBlock = new Object (); 236 Object atSign = new Object (); 237 int blockBalance = 0; 238 Token token; 239 int lastStartLineNo = -1; 240 int lastStartColNo = -1; 241 242 javaProps.setParseFlags(Flags.F_TOKEN_POS_ONLY | Flags.F_KEEP_DATA | Flags.F_COUNT_LINES); 243 docProps.setParseFlags(Flags.F_NO_CASE); 244 245 javaProps.addSpecialSequence("/**", docTokenizer); 246 javaProps.addSpecialSequence("{", openBlock); 247 javaProps.addSpecialSequence("}", closeBlock); 248 javaProps.addBlockComment(TokenizerProperties.DEFAULT_BLOCK_COMMENT_START, TokenizerProperties.DEFAULT_BLOCK_COMMENT_END); 249 javaProps.addLineComment(TokenizerProperties.DEFAULT_LINE_COMMENT); 250 javaProps.addString(TokenizerProperties.DEFAULT_STRING_START, TokenizerProperties.DEFAULT_STRING_END, TokenizerProperties.DEFAULT_STRING_ESCAPE); 251 javaProps.addString("'", "'", "\\"); 252 docProps.addSpecialSequence("*/", javaTokenizer); 253 docProps.addSpecialSequence("@", atSign); 254 docProps.addKeyword("param"); 255 docProps.addKeyword("return"); 256 docProps.addKeyword("throws"); 257 docProps.addKeyword("author"); 258 docProps.addKeyword("version"); 259 docProps.addKeyword("link"); 260 docProps.addKeyword("see"); 261 docProps.addKeyword("deprecated"); 262 263 javaTokenizer.setSource(_reader); 264 javaTokenizer.addTokenizer(docTokenizer); 265 266 System.out.println("\nStart parsing \"" + _path + "\""); 267 while (currTokenizer.hasMoreToken()) { 268 token = currTokenizer.nextToken(); 269 270 assertTrue(token.getStartLine() >= lastStartLineNo); 272 if (token.getStartLine() == lastStartLineNo) { 273 assertTrue(token.getStartColumn() >= lastStartColNo); 274 if (token.getEndLine() == lastStartLineNo) { 275 assertTrue(token.getEndColumn() == token.getStartColumn() + token.getLength()); 276 } 277 } 278 lastStartLineNo = token.getStartLine(); 279 lastStartColNo = token.getStartColumn(); 280 281 switch (token.getType()) { 283 case Token.SPECIAL_SEQUENCE: 284 if (token.getCompanion() instanceof StandardTokenizer) { 285 StandardTokenizer tokenizer = (StandardTokenizer)token.getCompanion(); 286 287 currTokenizer.switchTo(tokenizer); 288 currTokenizer = tokenizer; 289 } else if (token.getCompanion() == openBlock) { 290 blockBalance++; 291 } else if (token.getCompanion() == closeBlock) { 292 blockBalance--; 293 } else if (token.getCompanion() == atSign) { 294 token = currTokenizer.nextToken(); 295 assertTrue("Expected keyword after @ sign in javadoc comment, but found \"" + currTokenizer.currentImage(), 296 token.getType() == Token.KEYWORD); 297 } 298 break; 299 } 300 } 301 302 assertTrue("Braces should be balanced in Java file \"" 304 + _path + "\", but detected inbalance " + blockBalance, 305 blockBalance == 0); 306 307 long diff = System.currentTimeMillis() - start; 309 System.out.println("Finished after " + diff + " milliseconds"); 310 } 311 312 313 314 322 public void testEmbeddedTokenizer() throws Throwable { 323 long start = System.currentTimeMillis(); 324 StandardTokenizerProperties htmlProps = new StandardTokenizerProperties(); 325 StandardTokenizerProperties jsProps = new StandardTokenizerProperties(); 326 StandardTokenizerProperties cssProps = new StandardTokenizerProperties(); 327 StandardTokenizer htmlTokenizer = new StandardTokenizer(htmlProps); 328 StandardTokenizer jsTokenizer = new StandardTokenizer(jsProps); 329 StandardTokenizer cssTokenizer = new StandardTokenizer(cssProps); 330 String keywordLang = new String ("LANGUAGE"); 331 Object endOfEmbedded = new Object (); 332 Object startOfTag = new Object (); 333 Object endOfTag = new Object (); 334 Object endOfScript = new Object (); 335 Token token; 336 int lastStartLineNo = -1; 337 int lastStartColNo = -1; 338 339 htmlProps.setParseFlags(Flags.F_TOKEN_POS_ONLY 340 | Flags.F_KEEP_DATA 341 | Flags.F_COUNT_LINES); 342 cssProps.setParseFlags (Flags.F_TOKEN_POS_ONLY | Flags.F_NO_CASE); 343 jsProps.setParseFlags (Flags.F_TOKEN_POS_ONLY); 344 345 htmlProps.addKeyword("SCRIPT", jsTokenizer); 346 htmlProps.addKeyword("LANGUAGE", keywordLang); 347 htmlProps.addKeyword("STYLE", cssTokenizer); 348 htmlProps.addSpecialSequence("<", startOfTag); 349 htmlProps.addSpecialSequence(">", endOfTag); 350 htmlProps.addBlockComment("<!--", "-->"); 351 htmlProps.addString(TokenizerProperties.DEFAULT_STRING_START, TokenizerProperties.DEFAULT_STRING_END, TokenizerProperties.DEFAULT_STRING_ESCAPE); 352 htmlProps.setSeparators(TokenizerProperties.DEFAULT_SEPARATORS); 353 354 jsProps.addBlockComment(TokenizerProperties.DEFAULT_BLOCK_COMMENT_START, TokenizerProperties.DEFAULT_BLOCK_COMMENT_END); 355 jsProps.addSpecialSequence("<!--"); 356 jsProps.addSpecialSequence("-->", endOfEmbedded); 357 jsProps.setSeparators(TokenizerProperties.DEFAULT_SEPARATORS); 358 359 cssProps.addSpecialSequence("<!--"); 360 cssProps.addSpecialSequence("-->", endOfEmbedded); 361 362 htmlTokenizer.setSource(_reader); 363 htmlTokenizer.addTokenizer(jsTokenizer); 364 htmlTokenizer.addTokenizer(cssTokenizer); 365 366 System.out.println("\nStart parsing \"" + _path + "\""); 367 while (htmlTokenizer.hasMoreToken()) { 368 token = htmlTokenizer.nextToken(); 369 370 assertTrue(token.getStartLine() >= lastStartLineNo); 372 if (token.getStartLine() == lastStartLineNo) { 373 assertTrue(token.getStartColumn() >= lastStartColNo); 374 if (token.getEndLine() == lastStartLineNo) { 375 assertTrue(token.getEndColumn() == token.getStartColumn() + token.getLength()); 376 } 377 } 378 lastStartLineNo = token.getStartLine(); 379 lastStartColNo = token.getStartColumn(); 380 381 switch (token.getType()) { 383 case Token.SPECIAL_SEQUENCE: 384 385 if (token.getCompanion() == startOfTag) { 387 token = htmlTokenizer.nextToken(); 388 if (token.getType() == Token.KEYWORD && token.getCompanion() == jsTokenizer) { 389 token = htmlTokenizer.nextToken(); 390 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected \"" + keywordLang + "\".", 391 token.getCompanion() == keywordLang); token = htmlTokenizer.nextToken(); 393 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected \"=\".", 394 htmlTokenizer.currentImage().equals("=")); token = htmlTokenizer.nextToken(); 396 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected string.", 397 token.getType() == Token.STRING); 399 token = htmlTokenizer.nextToken(); 401 if (token.getCompanion() == endOfTag) { 402 htmlTokenizer.switchTo(jsTokenizer); 403 404 while (jsTokenizer.hasMoreToken()) { 406 token = jsTokenizer.nextToken(); 407 if (token.getType() == Token.SPECIAL_SEQUENCE && token.getCompanion() == endOfEmbedded) { 408 jsTokenizer.switchTo(htmlTokenizer); 409 break; 410 } 411 } 412 413 token = htmlTokenizer.nextToken(); 415 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected start of tag.", 416 token.getCompanion() == startOfTag); 417 token = htmlTokenizer.nextToken(); 418 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected \"/\".", 419 htmlTokenizer.currentImage().equals("/")); 420 token = htmlTokenizer.nextToken(); 421 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected script.", 422 token.getCompanion() == jsTokenizer); 423 token = htmlTokenizer.nextToken(); 424 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected end of tag.", 425 token.getCompanion() == endOfTag); 426 } 427 428 } else if (token.getType() == Token.KEYWORD && token.getCompanion() == jsTokenizer) { 430 token = htmlTokenizer.nextToken(); 431 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected end of tag.", 432 token.getCompanion() == endOfTag); 434 htmlTokenizer.switchTo(cssTokenizer); 435 while (cssTokenizer.hasMoreToken()) { 436 token = cssTokenizer.nextToken(); 437 if (token.getType() == Token.SPECIAL_SEQUENCE && token.getCompanion() == endOfEmbedded) { 438 jsTokenizer.switchTo(htmlTokenizer); 439 break; 440 } 441 } 442 443 token = htmlTokenizer.nextToken(); 445 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected start of tag.", 446 token.getCompanion() == startOfTag); 447 token = htmlTokenizer.nextToken(); 448 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected \"/\".", 449 htmlTokenizer.currentImage().equals("/")); 450 token = htmlTokenizer.nextToken(); 451 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected script.", 452 token.getCompanion() == cssTokenizer); 453 token = htmlTokenizer.nextToken(); 454 assertTrue("Found token \"" + htmlTokenizer.currentImage() + "\". Expected end of tag.", 455 token.getCompanion() == endOfTag); 456 } 457 } 458 break; 459 } 460 } 461 462 long diff = System.currentTimeMillis() - start; 463 System.out.println("Finished after " + diff + " milliseconds"); 464 } 465 466 467 protected InputStreamReader _reader = null; 471 protected String _path = null; 472 } 473 | Popular Tags |