diff options
Diffstat (limited to 'tool/src/test/java/org/antlr/test/BaseTest.java')
-rw-r--r-- | tool/src/test/java/org/antlr/test/BaseTest.java | 904 |
1 files changed, 904 insertions, 0 deletions
diff --git a/tool/src/test/java/org/antlr/test/BaseTest.java b/tool/src/test/java/org/antlr/test/BaseTest.java new file mode 100644 index 0000000..aae0560 --- /dev/null +++ b/tool/src/test/java/org/antlr/test/BaseTest.java @@ -0,0 +1,904 @@ +/* + * [The "BSD license"] + * Copyright (c) 2010 Terence Parr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.antlr.test; + + +import org.antlr.Tool; +import org.antlr.analysis.Label; +import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.Token; +import org.antlr.runtime.TokenSource; +import org.stringtemplate.v4.ST; +import org.stringtemplate.v4.STGroup; +import org.antlr.tool.ANTLRErrorListener; +import org.antlr.tool.ErrorManager; +import org.antlr.tool.GrammarSemanticsMessage; +import org.antlr.tool.Message; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; + +import javax.tools.*; +import java.io.*; +import java.util.*; + + +public abstract class BaseTest { + public static final String newline = System.getProperty("line.separator"); + + public static final String jikes = null;//"/usr/bin/jikes"; + public static final String pathSep = System.getProperty("path.separator"); + + /** + * When runnning from Maven, the junit tests are run via the surefire plugin. It sets the + * classpath for the test environment into the following property. We need to pick this up + * for the junit tests that are going to generate and try to run code. + */ + public static final String SUREFIRE_CLASSPATH = System.getProperty("surefire.test.class.path", ""); + + /** + * Build up the full classpath we need, including the surefire path (if present) + */ + public static final String CLASSPATH = System.getProperty("java.class.path") + (SUREFIRE_CLASSPATH.equals("") ? "" : pathSep + SUREFIRE_CLASSPATH); + + public String tmpdir = null; + + /** reset during setUp and set to true if we find a problem */ + protected boolean lastTestFailed = false; + + /** If error during parser execution, store stderr here; can't return + * stdout and stderr. This doesn't trap errors from running antlr. + */ + protected String stderrDuringParse; + + @Before + public void setUp() throws Exception { + lastTestFailed = false; // hope for the best, but set to true in asserts that fail + // new output dir for each test + tmpdir = new File(System.getProperty("java.io.tmpdir"), + "antlr-"+getClass().getName()+"-"+ + System.currentTimeMillis()).getAbsolutePath(); + ErrorManager.resetErrorState(); + STGroup.defaultGroup = new STGroup(); + } + + @After + public void tearDown() throws Exception { + // remove tmpdir if no error. + if ( !lastTestFailed ) eraseTempDir(); + + } + + protected Tool newTool(String[] args) { + Tool tool = new Tool(args); + tool.setOutputDirectory(tmpdir); + return tool; + } + + protected Tool newTool() { + Tool tool = new Tool(); + tool.setOutputDirectory(tmpdir); + return tool; + } + + protected boolean compile(String fileName) { + String classpathOption = "-classpath"; + + String[] args = new String[] { + "javac", "-d", tmpdir, + classpathOption, tmpdir+pathSep+CLASSPATH, + tmpdir+"/"+fileName + }; + String cmdLine = "javac" +" -d "+tmpdir+" "+classpathOption+" "+tmpdir+pathSep+CLASSPATH+" "+fileName; + //System.out.println("compile: "+cmdLine); + + + File f = new File(tmpdir, fileName); + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + + StandardJavaFileManager fileManager = + compiler.getStandardFileManager(null, null, null); + + Iterable<? extends JavaFileObject> compilationUnits = + fileManager.getJavaFileObjectsFromFiles(Arrays.asList(f)); + + Iterable<String> compileOptions = + Arrays.asList(new String[]{"-d", tmpdir, "-cp", tmpdir+pathSep+CLASSPATH} ); + + JavaCompiler.CompilationTask task = + compiler.getTask(null, fileManager, null, compileOptions, null, + compilationUnits); + boolean ok = task.call(); + + try { + fileManager.close(); + } + catch (IOException ioe) { + ioe.printStackTrace(System.err); + } + return ok; + } + + /** Return true if all is ok, no errors */ + protected boolean antlr(String fileName, String grammarFileName, String grammarStr, boolean debug) { + boolean allIsWell = true; + mkdir(tmpdir); + writeFile(tmpdir, fileName, grammarStr); + try { + final List options = new ArrayList(); + if ( debug ) { + options.add("-debug"); + } + options.add("-o"); + options.add(tmpdir); + options.add("-lib"); + options.add(tmpdir); + options.add(new File(tmpdir,grammarFileName).toString()); + final String[] optionsA = new String[options.size()]; + options.toArray(optionsA); + /* + final ErrorQueue equeue = new ErrorQueue(); + ErrorManager.setErrorListener(equeue); + */ + Tool antlr = newTool(optionsA); + antlr.process(); + ANTLRErrorListener listener = ErrorManager.getErrorListener(); + if ( listener instanceof ErrorQueue ) { + ErrorQueue equeue = (ErrorQueue)listener; + if ( equeue.errors.size()>0 ) { + allIsWell = false; + System.err.println("antlr reports errors from "+options); + for (int i = 0; i < equeue.errors.size(); i++) { + Message msg = (Message) equeue.errors.get(i); + System.err.println(msg); + } + System.out.println("!!!\ngrammar:"); + System.out.println(grammarStr); + System.out.println("###"); + } + } + } + catch (Exception e) { + allIsWell = false; + System.err.println("problems building grammar: "+e); + e.printStackTrace(System.err); + } + return allIsWell; + } + + protected String execLexer(String grammarFileName, + String grammarStr, + String lexerName, + String input, + boolean debug) + { + rawGenerateAndBuildRecognizer(grammarFileName, + grammarStr, + null, + lexerName, + debug); + writeFile(tmpdir, "input", input); + return rawExecRecognizer(null, + null, + lexerName, + null, + null, + false, + false, + false, + debug); + } + + protected String execParser(String grammarFileName, + String grammarStr, + String parserName, + String lexerName, + String startRuleName, + String input, boolean debug) + { + rawGenerateAndBuildRecognizer(grammarFileName, + grammarStr, + parserName, + lexerName, + debug); + writeFile(tmpdir, "input", input); + boolean parserBuildsTrees = + grammarStr.indexOf("output=AST")>=0 || + grammarStr.indexOf("output = AST")>=0; + boolean parserBuildsTemplate = + grammarStr.indexOf("output=template")>=0 || + grammarStr.indexOf("output = template")>=0; + return rawExecRecognizer(parserName, + null, + lexerName, + startRuleName, + null, + parserBuildsTrees, + parserBuildsTemplate, + false, + debug); + } + + protected String execTreeParser(String parserGrammarFileName, + String parserGrammarStr, + String parserName, + String treeParserGrammarFileName, + String treeParserGrammarStr, + String treeParserName, + String lexerName, + String parserStartRuleName, + String treeParserStartRuleName, + String input) + { + return execTreeParser(parserGrammarFileName, + parserGrammarStr, + parserName, + treeParserGrammarFileName, + treeParserGrammarStr, + treeParserName, + lexerName, + parserStartRuleName, + treeParserStartRuleName, + input, + false); + } + + protected String execTreeParser(String parserGrammarFileName, + String parserGrammarStr, + String parserName, + String treeParserGrammarFileName, + String treeParserGrammarStr, + String treeParserName, + String lexerName, + String parserStartRuleName, + String treeParserStartRuleName, + String input, + boolean debug) + { + // build the parser + rawGenerateAndBuildRecognizer(parserGrammarFileName, + parserGrammarStr, + parserName, + lexerName, + debug); + + // build the tree parser + rawGenerateAndBuildRecognizer(treeParserGrammarFileName, + treeParserGrammarStr, + treeParserName, + lexerName, + debug); + + writeFile(tmpdir, "input", input); + + boolean parserBuildsTrees = + parserGrammarStr.indexOf("output=AST")>=0 || + parserGrammarStr.indexOf("output = AST")>=0; + boolean treeParserBuildsTrees = + treeParserGrammarStr.indexOf("output=AST")>=0 || + treeParserGrammarStr.indexOf("output = AST")>=0; + boolean parserBuildsTemplate = + parserGrammarStr.indexOf("output=template")>=0 || + parserGrammarStr.indexOf("output = template")>=0; + + return rawExecRecognizer(parserName, + treeParserName, + lexerName, + parserStartRuleName, + treeParserStartRuleName, + parserBuildsTrees, + parserBuildsTemplate, + treeParserBuildsTrees, + debug); + } + + /** Return true if all is well */ + protected boolean rawGenerateAndBuildRecognizer(String grammarFileName, + String grammarStr, + String parserName, + String lexerName, + boolean debug) + { + //System.out.println(grammarStr); + boolean allIsWell = + antlr(grammarFileName, grammarFileName, grammarStr, debug); + if ( lexerName!=null ) { + boolean ok; + if ( parserName!=null ) { + ok = compile(parserName+".java"); + if ( !ok ) { allIsWell = false; } + } + ok = compile(lexerName+".java"); + if ( !ok ) { allIsWell = false; } + } + else { + boolean ok = compile(parserName+".java"); + if ( !ok ) { allIsWell = false; } + } + return allIsWell; + } + + protected String rawExecRecognizer(String parserName, + String treeParserName, + String lexerName, + String parserStartRuleName, + String treeParserStartRuleName, + boolean parserBuildsTrees, + boolean parserBuildsTemplate, + boolean treeParserBuildsTrees, + boolean debug) + { + this.stderrDuringParse = null; + writeRecognizerAndCompile(parserName, treeParserName, lexerName, parserStartRuleName, treeParserStartRuleName, parserBuildsTrees, parserBuildsTemplate, treeParserBuildsTrees, debug); + + return execRecognizer(); + } + + public String execRecognizer() { + try { + String inputFile = new File(tmpdir, "input").getAbsolutePath(); + String[] args = new String[] { + "java", "-classpath", tmpdir+pathSep+CLASSPATH, + "Test", inputFile + }; + //String cmdLine = "java -classpath "+CLASSPATH+pathSep+tmpdir+" Test " + new File(tmpdir, "input").getAbsolutePath(); + //System.out.println("execParser: "+cmdLine); + Process process = + Runtime.getRuntime().exec(args, null, new File(tmpdir)); + StreamVacuum stdoutVacuum = new StreamVacuum(process.getInputStream(), inputFile); + StreamVacuum stderrVacuum = new StreamVacuum(process.getErrorStream(), inputFile); + stdoutVacuum.start(); + stderrVacuum.start(); + process.waitFor(); + stdoutVacuum.join(); + stderrVacuum.join(); + String output = null; + output = stdoutVacuum.toString(); + if ( stderrVacuum.toString().length()>0 ) { + this.stderrDuringParse = stderrVacuum.toString(); + System.err.println("exec stderrVacuum: "+ stderrVacuum); + } + return output; + } + catch (Exception e) { + System.err.println("can't exec recognizer"); + e.printStackTrace(System.err); + } + return null; + } + + public void writeRecognizerAndCompile(String parserName, String treeParserName, String lexerName, String parserStartRuleName, String treeParserStartRuleName, boolean parserBuildsTrees, boolean parserBuildsTemplate, boolean treeParserBuildsTrees, boolean debug) { + if ( treeParserBuildsTrees && parserBuildsTrees ) { + writeTreeAndTreeTestFile(parserName, + treeParserName, + lexerName, + parserStartRuleName, + treeParserStartRuleName, + debug); + } + else if ( parserBuildsTrees ) { + writeTreeTestFile(parserName, + treeParserName, + lexerName, + parserStartRuleName, + treeParserStartRuleName, + debug); + } + else if ( parserBuildsTemplate ) { + writeTemplateTestFile(parserName, + lexerName, + parserStartRuleName, + debug); + } + else if ( parserName==null ) { + writeLexerTestFile(lexerName, debug); + } + else { + writeTestFile(parserName, + lexerName, + parserStartRuleName, + debug); + } + + compile("Test.java"); + } + + protected void checkGrammarSemanticsError(ErrorQueue equeue, + GrammarSemanticsMessage expectedMessage) + throws Exception + { + /* + System.out.println(equeue.infos); + System.out.println(equeue.warnings); + System.out.println(equeue.errors); + assertTrue("number of errors mismatch", n, equeue.errors.size()); + */ + Message foundMsg = null; + for (int i = 0; i < equeue.errors.size(); i++) { + Message m = (Message)equeue.errors.get(i); + if (m.msgID==expectedMessage.msgID ) { + foundMsg = m; + } + } + assertNotNull("no error; "+expectedMessage.msgID+" expected", foundMsg); + assertTrue("error is not a GrammarSemanticsMessage", + foundMsg instanceof GrammarSemanticsMessage); + assertEquals(expectedMessage.arg, foundMsg.arg); + if ( equeue.size()!=1 ) { + System.err.println(equeue); + } + } + + protected void checkGrammarSemanticsWarning(ErrorQueue equeue, + GrammarSemanticsMessage expectedMessage) + throws Exception + { + Message foundMsg = null; + for (int i = 0; i < equeue.warnings.size(); i++) { + Message m = (Message)equeue.warnings.get(i); + if (m.msgID==expectedMessage.msgID ) { + foundMsg = m; + } + } + assertNotNull("no error; "+expectedMessage.msgID+" expected", foundMsg); + assertTrue("error is not a GrammarSemanticsMessage", + foundMsg instanceof GrammarSemanticsMessage); + assertEquals(expectedMessage.arg, foundMsg.arg); + } + + protected void checkError(ErrorQueue equeue, + Message expectedMessage) + throws Exception + { + //System.out.println("errors="+equeue); + Message foundMsg = null; + for (int i = 0; i < equeue.errors.size(); i++) { + Message m = (Message)equeue.errors.get(i); + if (m.msgID==expectedMessage.msgID ) { + foundMsg = m; + } + } + assertTrue("no error; "+expectedMessage.msgID+" expected", equeue.errors.size()>0); + assertTrue("too many errors; "+equeue.errors, equeue.errors.size()<=1); + assertNotNull("couldn't find expected error: "+expectedMessage.msgID, foundMsg); + /* + assertTrue("error is not a GrammarSemanticsMessage", + foundMsg instanceof GrammarSemanticsMessage); + */ + assertEquals(expectedMessage.arg, foundMsg.arg); + assertEquals(expectedMessage.arg2, foundMsg.arg2); + ErrorManager.resetErrorState(); // wack errors for next test + } + + public static class StreamVacuum implements Runnable { + StringBuffer buf = new StringBuffer(); + BufferedReader in; + Thread sucker; + String inputFile; + public StreamVacuum(InputStream in, String inputFile) { + this.in = new BufferedReader( new InputStreamReader(in) ); + this.inputFile = inputFile; + } + public void start() { + sucker = new Thread(this); + sucker.start(); + } + public void run() { + try { + String line = in.readLine(); + while (line!=null) { + if (line.startsWith(inputFile)) + line = line.substring(inputFile.length()+1); + buf.append(line); + buf.append('\n'); + line = in.readLine(); + } + } + catch (IOException ioe) { + System.err.println("can't read output from process"); + } + } + /** wait for the thread to finish */ + public void join() throws InterruptedException { + sucker.join(); + } + public String toString() { + return buf.toString(); + } + } + + public static class FilteringTokenStream extends CommonTokenStream { + public FilteringTokenStream(TokenSource src) { super(src); } + Set<Integer> hide = new HashSet<Integer>(); + protected void sync(int i) { + super.sync(i); + if ( hide.contains(get(i).getType()) ) get(i).setChannel(Token.HIDDEN_CHANNEL); + } + public void setTokenTypeChannel(int ttype, int channel) { + hide.add(ttype); + } + } + + protected void writeFile(String dir, String fileName, String content) { + try { + File f = new File(dir, fileName); + FileWriter w = new FileWriter(f); + BufferedWriter bw = new BufferedWriter(w); + bw.write(content); + bw.close(); + w.close(); + } + catch (IOException ioe) { + System.err.println("can't write file"); + ioe.printStackTrace(System.err); + } + } + + protected void mkdir(String dir) { + File f = new File(dir); + f.mkdirs(); + } + + protected void writeTestFile(String parserName, + String lexerName, + String parserStartRuleName, + boolean debug) + { + ST outputFileST = new ST( + "import org.antlr.runtime.*;\n" + + "import org.antlr.runtime.tree.*;\n" + + "import org.antlr.runtime.debug.*;\n" + + "\n" + + "class Profiler2 extends Profiler {\n" + + " public void terminate() { ; }\n" + + "}\n"+ + "public class Test {\n" + + " public static void main(String[] args) throws Exception {\n" + + " CharStream input = new ANTLRFileStream(args[0]);\n" + + " <lexerName> lex = new <lexerName>(input);\n" + + " CommonTokenStream tokens = new CommonTokenStream(lex);\n" + + " <createParser>\n"+ + " parser.<parserStartRuleName>();\n" + + " }\n" + + "}" + ); + ST createParserST = + new ST( + " Profiler2 profiler = new Profiler2();\n"+ + " <parserName> parser = new <parserName>(tokens,profiler);\n" + + " profiler.setParser(parser);\n"); + if ( !debug ) { + createParserST = + new ST( + " <parserName> parser = new <parserName>(tokens);\n"); + } + outputFileST.add("createParser", createParserST); + outputFileST.add("parserName", parserName); + outputFileST.add("lexerName", lexerName); + outputFileST.add("parserStartRuleName", parserStartRuleName); + writeFile(tmpdir, "Test.java", outputFileST.render()); + } + + protected void writeLexerTestFile(String lexerName, boolean debug) { + ST outputFileST = new ST( + "import org.antlr.runtime.*;\n" + + "import org.antlr.runtime.tree.*;\n" + + "import org.antlr.runtime.debug.*;\n" + + "\n" + + "class Profiler2 extends Profiler {\n" + + " public void terminate() { ; }\n" + + "}\n"+ + "public class Test {\n" + + " public static void main(String[] args) throws Exception {\n" + + " CharStream input = new ANTLRFileStream(args[0]);\n" + + " <lexerName> lex = new <lexerName>(input);\n" + + " CommonTokenStream tokens = new CommonTokenStream(lex);\n" + + " System.out.println(tokens);\n" + + " }\n" + + "}" + ); + outputFileST.add("lexerName", lexerName); + writeFile(tmpdir, "Test.java", outputFileST.render()); + } + + protected void writeTreeTestFile(String parserName, + String treeParserName, + String lexerName, + String parserStartRuleName, + String treeParserStartRuleName, + boolean debug) + { + ST outputFileST = new ST( + "import org.antlr.runtime.*;\n" + + "import org.antlr.runtime.tree.*;\n" + + "import org.antlr.runtime.debug.*;\n" + + "\n" + + "class Profiler2 extends Profiler {\n" + + " public void terminate() { ; }\n" + + "}\n"+ + "public class Test {\n" + + " public static void main(String[] args) throws Exception {\n" + + " CharStream input = new ANTLRFileStream(args[0]);\n" + + " <lexerName> lex = new <lexerName>(input);\n" + + " TokenRewriteStream tokens = new TokenRewriteStream(lex);\n" + + " <createParser>\n"+ + " <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" + + " <if(!treeParserStartRuleName)>\n" + + " if ( r.tree!=null ) {\n" + + " System.out.println(((Tree)r.tree).toStringTree());\n" + + " ((CommonTree)r.tree).sanityCheckParentAndChildIndexes();\n" + + " }\n" + + " <else>\n" + + " CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);\n" + + " nodes.setTokenStream(tokens);\n" + + " <treeParserName> walker = new <treeParserName>(nodes);\n" + + " walker.<treeParserStartRuleName>();\n" + + " <endif>\n" + + " }\n" + + "}" + ); + ST createParserST = + new ST( + " Profiler2 profiler = new Profiler2();\n"+ + " <parserName> parser = new <parserName>(tokens,profiler);\n" + + " profiler.setParser(parser);\n"); + if ( !debug ) { + createParserST = + new ST( + " <parserName> parser = new <parserName>(tokens);\n"); + } + outputFileST.add("createParser", createParserST); + outputFileST.add("parserName", parserName); + outputFileST.add("treeParserName", treeParserName); + outputFileST.add("lexerName", lexerName); + outputFileST.add("parserStartRuleName", parserStartRuleName); + outputFileST.add("treeParserStartRuleName", treeParserStartRuleName); + writeFile(tmpdir, "Test.java", outputFileST.render()); + } + + /** Parser creates trees and so does the tree parser */ + protected void writeTreeAndTreeTestFile(String parserName, + String treeParserName, + String lexerName, + String parserStartRuleName, + String treeParserStartRuleName, + boolean debug) + { + ST outputFileST = new ST( + "import org.antlr.runtime.*;\n" + + "import org.antlr.runtime.tree.*;\n" + + "import org.antlr.runtime.debug.*;\n" + + "\n" + + "class Profiler2 extends Profiler {\n" + + " public void terminate() { ; }\n" + + "}\n"+ + "public class Test {\n" + + " public static void main(String[] args) throws Exception {\n" + + " CharStream input = new ANTLRFileStream(args[0]);\n" + + " <lexerName> lex = new <lexerName>(input);\n" + + " TokenRewriteStream tokens = new TokenRewriteStream(lex);\n" + + " <createParser>\n"+ + " <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" + + " ((CommonTree)r.tree).sanityCheckParentAndChildIndexes();\n" + + " CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);\n" + + " nodes.setTokenStream(tokens);\n" + + " <treeParserName> walker = new <treeParserName>(nodes);\n" + + " <treeParserName>.<treeParserStartRuleName>_return r2 = walker.<treeParserStartRuleName>();\n" + + " CommonTree rt = ((CommonTree)r2.tree);\n" + + " if ( rt!=null ) System.out.println(((CommonTree)r2.tree).toStringTree());\n" + + " }\n" + + "}" + ); + ST createParserST = + new ST( + " Profiler2 profiler = new Profiler2();\n"+ + " <parserName> parser = new <parserName>(tokens,profiler);\n" + + " profiler.setParser(parser);\n"); + if ( !debug ) { + createParserST = + new ST( + " <parserName> parser = new <parserName>(tokens);\n"); + } + outputFileST.add("createParser", createParserST); + outputFileST.add("parserName", parserName); + outputFileST.add("treeParserName", treeParserName); + outputFileST.add("lexerName", lexerName); + outputFileST.add("parserStartRuleName", parserStartRuleName); + outputFileST.add("treeParserStartRuleName", treeParserStartRuleName); + writeFile(tmpdir, "Test.java", outputFileST.render()); + } + + protected void writeTemplateTestFile(String parserName, + String lexerName, + String parserStartRuleName, + boolean debug) + { + ST outputFileST = new ST( + "import org.antlr.runtime.*;\n" + + "import org.antlr.stringtemplate.*;\n" + + "import org.antlr.stringtemplate.language.*;\n" + + "import org.antlr.runtime.debug.*;\n" + + "import java.io.*;\n" + + "\n" + + "class Profiler2 extends Profiler {\n" + + " public void terminate() { ; }\n" + + "}\n"+ + "public class Test {\n" + + " static String templates = \"group T; foo(x,y) ::= \\\"\\<x> \\<y>\\\"\";\n" + + " static StringTemplateGroup group ="+ + " new StringTemplateGroup(new StringReader(templates)," + + " AngleBracketTemplateLexer.class);"+ + " public static void main(String[] args) throws Exception {\n" + + " CharStream input = new ANTLRFileStream(args[0]);\n" + + " <lexerName> lex = new <lexerName>(input);\n" + + " CommonTokenStream tokens = new CommonTokenStream(lex);\n" + + " <createParser>\n"+ + " parser.setTemplateLib(group);\n"+ + " <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" + + " if ( r.st!=null )\n" + + " System.out.print(r.st.toString());\n" + + " else\n" + + " System.out.print(\"\");\n" + + " }\n" + + "}" + ); + ST createParserST = + new ST( + " Profiler2 profiler = new Profiler2();\n"+ + " <parserName> parser = new <parserName>(tokens,profiler);\n" + + " profiler.setParser(parser);\n"); + if ( !debug ) { + createParserST = + new ST( + " <parserName> parser = new <parserName>(tokens);\n"); + } + outputFileST.add("createParser", createParserST); + outputFileST.add("parserName", parserName); + outputFileST.add("lexerName", lexerName); + outputFileST.add("parserStartRuleName", parserStartRuleName); + writeFile(tmpdir, "Test.java", outputFileST.render()); + } + + protected void eraseFiles(final String filesEndingWith) { + File tmpdirF = new File(tmpdir); + String[] files = tmpdirF.list(); + for(int i = 0; files!=null && i < files.length; i++) { + if ( files[i].endsWith(filesEndingWith) ) { + new File(tmpdir+"/"+files[i]).delete(); + } + } + } + + protected void eraseFiles() { + File tmpdirF = new File(tmpdir); + String[] files = tmpdirF.list(); + for(int i = 0; files!=null && i < files.length; i++) { + new File(tmpdir+"/"+files[i]).delete(); + } + } + + protected void eraseTempDir() { + File tmpdirF = new File(tmpdir); + if ( tmpdirF.exists() ) { + eraseFiles(); + tmpdirF.delete(); + } + } + + public String getFirstLineOfException() { + if ( this.stderrDuringParse ==null ) { + return null; + } + String[] lines = this.stderrDuringParse.split("\n"); + String prefix="Exception in thread \"main\" "; + return lines[0].substring(prefix.length(),lines[0].length()); + } + + public List realElements(List elements) { + List n = new ArrayList(); + for (int i = Label.NUM_FAUX_LABELS+Label.MIN_TOKEN_TYPE - 1; i < elements.size(); i++) { + Object o = (Object) elements.get(i); + if ( o!=null ) { + n.add(o); + } + } + return n; + } + + public List<String> realElements(Map<String, Integer> elements) { + List n = new ArrayList(); + Iterator iterator = elements.keySet().iterator(); + while (iterator.hasNext()) { + String tokenID = (String) iterator.next(); + if ( elements.get(tokenID) >= Label.MIN_TOKEN_TYPE ) { + n.add(tokenID+"="+elements.get(tokenID)); + } + } + Collections.sort(n); + return n; + } + + public String sortLinesInString(String s) { + String lines[] = s.split("\n"); + Arrays.sort(lines); + List<String> linesL = Arrays.asList(lines); + StringBuffer buf = new StringBuffer(); + for (String l : linesL) { + buf.append(l); + buf.append('\n'); + } + return buf.toString(); + } + + /** + * When looking at a result set that consists of a Map/HashTable + * we cannot rely on the output order, as the hashing algorithm or other aspects + * of the implementation may be different on differnt JDKs or platforms. Hence + * we take the Map, convert the keys to a List, sort them and Stringify the Map, which is a + * bit of a hack, but guarantees that we get the same order on all systems. We assume that + * the keys are strings. + * + * @param m The Map that contains keys we wish to return in sorted order + * @return A string that represents all the keys in sorted order. + */ + public String sortMapToString(Map m) { + + System.out.println("Map toString looks like: " + m.toString()); + // Pass in crap, and get nothing back + // + if (m == null) { + return null; + } + + // Sort the keys in the Map + // + TreeMap nset = new TreeMap(m); + + System.out.println("Tree map looks like: " + nset.toString()); + return nset.toString(); + } + + // override to track errors + + public void assertEquals(String msg, Object a, Object b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertEquals(Object a, Object b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertEquals(String msg, long a, long b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertEquals(long a, long b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} } + + public void assertTrue(String msg, boolean b) { try {Assert.assertTrue(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertTrue(boolean b) { try {Assert.assertTrue(b);} catch (Error e) {lastTestFailed=true; throw e;} } + + public void assertFalse(String msg, boolean b) { try {Assert.assertFalse(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertFalse(boolean b) { try {Assert.assertFalse(b);} catch (Error e) {lastTestFailed=true; throw e;} } + + public void assertNotNull(String msg, Object p) { try {Assert.assertNotNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertNotNull(Object p) { try {Assert.assertNotNull(p);} catch (Error e) {lastTestFailed=true; throw e;} } + + public void assertNull(String msg, Object p) { try {Assert.assertNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} } + public void assertNull(Object p) { try {Assert.assertNull(p);} catch (Error e) {lastTestFailed=true; throw e;} } +} |