1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Copyright (c) 2010 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.test;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.Tool;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.analysis.Label;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.CommonTokenStream;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.Token;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.TokenSource;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.ST;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STGroup;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.ANTLRErrorListener;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.ErrorManager;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.GrammarSemanticsMessage;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Message;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.After;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Assert;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Before;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport javax.tools.*;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.*;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.*;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic abstract class BaseTest {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static final String newline = System.getProperty("line.separator");
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static final String jikes = null;//"/usr/bin/jikes";
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public static final String pathSep = System.getProperty("path.separator");
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   /**
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    * When runnning from Maven, the junit tests are run via the surefire plugin. It sets the
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    * classpath for the test environment into the following property. We need to pick this up
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    * for the junit tests that are going to generate and try to run code.
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static final String SUREFIRE_CLASSPATH = System.getProperty("surefire.test.class.path", "");
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Build up the full classpath we need, including the surefire path (if present)
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static final String CLASSPATH = System.getProperty("java.class.path") + (SUREFIRE_CLASSPATH.equals("") ? "" : pathSep + SUREFIRE_CLASSPATH);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public String tmpdir = null;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** reset during setUp and set to true if we find a problem */
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected boolean lastTestFailed = false;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** If error during parser execution, store stderr here; can't return
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  stdout and stderr.  This doesn't trap errors from running antlr.
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String stderrDuringParse;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Before
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public void setUp() throws Exception {
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lastTestFailed = false; // hope for the best, but set to true in asserts that fail
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // new output dir for each test
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tmpdir = new File(System.getProperty("java.io.tmpdir"),
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						  "antlr-"+getClass().getName()+"-"+
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						  System.currentTimeMillis()).getAbsolutePath();
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ErrorManager.resetErrorState();
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        STGroup.defaultGroup = new STGroup();
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @After
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void tearDown() throws Exception {
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // remove tmpdir if no error.
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !lastTestFailed ) eraseTempDir();
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected Tool newTool(String[] args) {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool tool = new Tool(args);
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tool.setOutputDirectory(tmpdir);
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return tool;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected Tool newTool() {
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool tool = new Tool();
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tool.setOutputDirectory(tmpdir);
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return tool;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected boolean compile(String fileName) {
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String classpathOption = "-classpath";
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String[] args = new String[] {
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					"javac", "-d", tmpdir,
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					classpathOption, tmpdir+pathSep+CLASSPATH,
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					tmpdir+"/"+fileName
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		};
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String cmdLine = "javac" +" -d "+tmpdir+" "+classpathOption+" "+tmpdir+pathSep+CLASSPATH+" "+fileName;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//System.out.println("compile: "+cmdLine);
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		File f = new File(tmpdir, fileName);
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StandardJavaFileManager fileManager =
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			compiler.getStandardFileManager(null, null, null);
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Iterable<? extends JavaFileObject> compilationUnits =
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			fileManager.getJavaFileObjectsFromFiles(Arrays.asList(f));
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Iterable<String> compileOptions =
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Arrays.asList(new String[]{"-d", tmpdir, "-cp", tmpdir+pathSep+CLASSPATH} );
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		JavaCompiler.CompilationTask task =
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			compiler.getTask(null, fileManager, null, compileOptions, null,
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							 compilationUnits);
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean ok = task.call();
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try {
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			fileManager.close();
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (IOException ioe) {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ioe.printStackTrace(System.err);
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return ok;
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Return true if all is ok, no errors */
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected boolean antlr(String fileName, String grammarFileName, String grammarStr, boolean debug) {
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean allIsWell = true;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		mkdir(tmpdir);
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, fileName, grammarStr);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try {
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			final List options = new ArrayList();
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( debug ) {
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				options.add("-debug");
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.add("-o");
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.add(tmpdir);
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.add("-lib");
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.add(tmpdir);
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.add(new File(tmpdir,grammarFileName).toString());
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			final String[] optionsA = new String[options.size()];
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			options.toArray(optionsA);
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			/*
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			final ErrorQueue equeue = new ErrorQueue();
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ErrorManager.setErrorListener(equeue);
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			*/
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Tool antlr = newTool(optionsA);
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			antlr.process();
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ANTLRErrorListener listener = ErrorManager.getErrorListener();
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( listener instanceof ErrorQueue ) {
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				ErrorQueue equeue = (ErrorQueue)listener;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if ( equeue.errors.size()>0 ) {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					allIsWell = false;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					System.err.println("antlr reports errors from "+options);
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					for (int i = 0; i < equeue.errors.size(); i++) {
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						Message msg = (Message) equeue.errors.get(i);
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						System.err.println(msg);
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					}
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    System.out.println("!!!\ngrammar:");
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    System.out.println(grammarStr);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    System.out.println("###");
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (Exception e) {
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			allIsWell = false;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			System.err.println("problems building grammar: "+e);
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			e.printStackTrace(System.err);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return allIsWell;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String execLexer(String grammarFileName,
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   String grammarStr,
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   String lexerName,
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   String input,
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   boolean debug)
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		rawGenerateAndBuildRecognizer(grammarFileName,
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  grammarStr,
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  null,
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  lexerName,
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  debug);
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "input", input);
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return rawExecRecognizer(null,
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 null,
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 lexerName,
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 null,
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 null,
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 false,
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 false,
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 false,
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 debug);
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String execParser(String grammarFileName,
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String grammarStr,
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String parserName,
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String lexerName,
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String startRuleName,
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String input, boolean debug)
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		rawGenerateAndBuildRecognizer(grammarFileName,
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  grammarStr,
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  parserName,
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  lexerName,
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  debug);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "input", input);
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean parserBuildsTrees =
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			grammarStr.indexOf("output=AST")>=0 ||
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			grammarStr.indexOf("output = AST")>=0;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean parserBuildsTemplate =
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			grammarStr.indexOf("output=template")>=0 ||
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			grammarStr.indexOf("output = template")>=0;
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return rawExecRecognizer(parserName,
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 null,
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 lexerName,
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 startRuleName,
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 null,
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 parserBuildsTrees,
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 parserBuildsTemplate,
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 false,
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 debug);
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String execTreeParser(String parserGrammarFileName,
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserGrammarStr,
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserName,
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserGrammarFileName,
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserGrammarStr,
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserName,
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String lexerName,
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserStartRuleName,
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserStartRuleName,
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String input)
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return execTreeParser(parserGrammarFileName,
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  parserGrammarStr,
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  parserName,
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserGrammarFileName,
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserGrammarStr,
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserName,
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  lexerName,
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  parserStartRuleName,
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserStartRuleName,
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  input,
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  false);
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String execTreeParser(String parserGrammarFileName,
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserGrammarStr,
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserName,
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserGrammarFileName,
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserGrammarStr,
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserName,
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String lexerName,
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String parserStartRuleName,
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String treeParserStartRuleName,
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									String input,
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									boolean debug)
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// build the parser
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		rawGenerateAndBuildRecognizer(parserGrammarFileName,
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  parserGrammarStr,
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  parserName,
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  lexerName,
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  debug);
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// build the tree parser
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		rawGenerateAndBuildRecognizer(treeParserGrammarFileName,
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeParserGrammarStr,
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeParserName,
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  lexerName,
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  debug);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "input", input);
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean parserBuildsTrees =
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			parserGrammarStr.indexOf("output=AST")>=0 ||
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			parserGrammarStr.indexOf("output = AST")>=0;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean treeParserBuildsTrees =
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			treeParserGrammarStr.indexOf("output=AST")>=0 ||
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			treeParserGrammarStr.indexOf("output = AST")>=0;
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean parserBuildsTemplate =
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			parserGrammarStr.indexOf("output=template")>=0 ||
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			parserGrammarStr.indexOf("output = template")>=0;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return rawExecRecognizer(parserName,
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 treeParserName,
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 lexerName,
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 parserStartRuleName,
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 treeParserStartRuleName,
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 parserBuildsTrees,
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 parserBuildsTemplate,
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 treeParserBuildsTrees,
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 debug);
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Return true if all is well */
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected boolean rawGenerateAndBuildRecognizer(String grammarFileName,
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													String grammarStr,
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													String parserName,
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													String lexerName,
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													boolean debug)
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//System.out.println(grammarStr);
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean allIsWell =
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			antlr(grammarFileName, grammarFileName, grammarStr, debug);
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( lexerName!=null ) {
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			boolean ok;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( parserName!=null ) {
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				ok = compile(parserName+".java");
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if ( !ok ) { allIsWell = false; }
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ok = compile(lexerName+".java");
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( !ok ) { allIsWell = false; }
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else {
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			boolean ok = compile(parserName+".java");
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( !ok ) { allIsWell = false; }
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return allIsWell;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected String rawExecRecognizer(String parserName,
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   String treeParserName,
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   String lexerName,
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   String parserStartRuleName,
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   String treeParserStartRuleName,
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   boolean parserBuildsTrees,
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   boolean parserBuildsTemplate,
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   boolean treeParserBuildsTrees,
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									   boolean debug)
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        this.stderrDuringParse = null;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeRecognizerAndCompile(parserName, treeParserName, lexerName, parserStartRuleName, treeParserStartRuleName, parserBuildsTrees, parserBuildsTemplate, treeParserBuildsTrees, debug);
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return execRecognizer();
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public String execRecognizer() {
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try {
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String inputFile = new File(tmpdir, "input").getAbsolutePath();
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String[] args = new String[] {
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"java", "-classpath", tmpdir+pathSep+CLASSPATH,
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"Test", inputFile
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			};
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			//String cmdLine = "java -classpath "+CLASSPATH+pathSep+tmpdir+" Test " + new File(tmpdir, "input").getAbsolutePath();
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			//System.out.println("execParser: "+cmdLine);
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Process process =
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				Runtime.getRuntime().exec(args, null, new File(tmpdir));
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			StreamVacuum stdoutVacuum = new StreamVacuum(process.getInputStream(), inputFile);
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			StreamVacuum stderrVacuum = new StreamVacuum(process.getErrorStream(), inputFile);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stdoutVacuum.start();
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stderrVacuum.start();
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			process.waitFor();
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stdoutVacuum.join();
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stderrVacuum.join();
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String output = null;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			output = stdoutVacuum.toString();
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( stderrVacuum.toString().length()>0 ) {
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				this.stderrDuringParse = stderrVacuum.toString();
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				System.err.println("exec stderrVacuum: "+ stderrVacuum);
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return output;
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (Exception e) {
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			System.err.println("can't exec recognizer");
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			e.printStackTrace(System.err);
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return null;
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public void writeRecognizerAndCompile(String parserName, String treeParserName, String lexerName, String parserStartRuleName, String treeParserStartRuleName, boolean parserBuildsTrees, boolean parserBuildsTemplate, boolean treeParserBuildsTrees, boolean debug) {
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( treeParserBuildsTrees && parserBuildsTrees ) {
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			writeTreeAndTreeTestFile(parserName,
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 treeParserName,
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 lexerName,
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 parserStartRuleName,
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 treeParserStartRuleName,
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 debug);
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if ( parserBuildsTrees ) {
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			writeTreeTestFile(parserName,
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserName,
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  lexerName,
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  parserStartRuleName,
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  treeParserStartRuleName,
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  debug);
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if ( parserBuildsTemplate ) {
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			writeTemplateTestFile(parserName,
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								  lexerName,
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								  parserStartRuleName,
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								  debug);
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if ( parserName==null ) {
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			writeLexerTestFile(lexerName, debug);
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else {
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			writeTestFile(parserName,
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						  lexerName,
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						  parserStartRuleName,
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						  debug);
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		compile("Test.java");
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkGrammarSemanticsError(ErrorQueue equeue,
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											  GrammarSemanticsMessage expectedMessage)
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/*
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				System.out.println(equeue.infos);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				System.out.println(equeue.warnings);
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				System.out.println(equeue.errors);
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertTrue("number of errors mismatch", n, equeue.errors.size());
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						   */
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Message foundMsg = null;
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < equeue.errors.size(); i++) {
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Message m = (Message)equeue.errors.get(i);
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (m.msgID==expectedMessage.msgID ) {
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				foundMsg = m;
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("no error; "+expectedMessage.msgID+" expected", foundMsg);
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("error is not a GrammarSemanticsMessage",
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   foundMsg instanceof GrammarSemanticsMessage);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedMessage.arg, foundMsg.arg);
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( equeue.size()!=1 ) {
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			System.err.println(equeue);
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkGrammarSemanticsWarning(ErrorQueue equeue,
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver												GrammarSemanticsMessage expectedMessage)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Message foundMsg = null;
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < equeue.warnings.size(); i++) {
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Message m = (Message)equeue.warnings.get(i);
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (m.msgID==expectedMessage.msgID ) {
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				foundMsg = m;
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("no error; "+expectedMessage.msgID+" expected", foundMsg);
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("error is not a GrammarSemanticsMessage",
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   foundMsg instanceof GrammarSemanticsMessage);
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedMessage.arg, foundMsg.arg);
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected void checkError(ErrorQueue equeue,
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                              Message expectedMessage)
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        throws Exception
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //System.out.println("errors="+equeue);
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Message foundMsg = null;
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (int i = 0; i < equeue.errors.size(); i++) {
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Message m = (Message)equeue.errors.get(i);
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (m.msgID==expectedMessage.msgID ) {
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                foundMsg = m;
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertTrue("no error; "+expectedMessage.msgID+" expected", equeue.errors.size()>0);
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertTrue("too many errors; "+equeue.errors, equeue.errors.size()<=1);
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertNotNull("couldn't find expected error: "+expectedMessage.msgID, foundMsg);
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /*
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertTrue("error is not a GrammarSemanticsMessage",
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   foundMsg instanceof GrammarSemanticsMessage);
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals(expectedMessage.arg, foundMsg.arg);
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals(expectedMessage.arg2, foundMsg.arg2);
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ErrorManager.resetErrorState(); // wack errors for next test
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static class StreamVacuum implements Runnable {
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringBuffer buf = new StringBuffer();
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		BufferedReader in;
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Thread sucker;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String inputFile;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public StreamVacuum(InputStream in, String inputFile) {
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			this.in = new BufferedReader( new InputStreamReader(in) );
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			this.inputFile = inputFile;
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void start() {
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			sucker = new Thread(this);
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			sucker.start();
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void run() {
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			try {
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				String line = in.readLine();
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				while (line!=null) {
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					if (line.startsWith(inputFile))
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver						line = line.substring(inputFile.length()+1);
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					buf.append(line);
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					buf.append('\n');
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					line = in.readLine();
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				}
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			catch (IOException ioe) {
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				System.err.println("can't read output from process");
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** wait for the thread to finish */
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void join() throws InterruptedException {
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			sucker.join();
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public String toString() {
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return buf.toString();
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static class FilteringTokenStream extends CommonTokenStream {
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public FilteringTokenStream(TokenSource src) { super(src); }
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Set<Integer> hide = new HashSet<Integer>();
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected void sync(int i) {
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            super.sync(i);
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( hide.contains(get(i).getType()) ) get(i).setChannel(Token.HIDDEN_CHANNEL);
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public void setTokenTypeChannel(int ttype, int channel) {
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            hide.add(ttype);
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeFile(String dir, String fileName, String content) {
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try {
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			File f = new File(dir, fileName);
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			FileWriter w = new FileWriter(f);
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			BufferedWriter bw = new BufferedWriter(w);
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			bw.write(content);
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			bw.close();
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			w.close();
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (IOException ioe) {
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			System.err.println("can't write file");
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ioe.printStackTrace(System.err);
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void mkdir(String dir) {
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		File f = new File(dir);
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		f.mkdirs();
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeTestFile(String parserName,
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 String lexerName,
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 String parserStartRuleName,
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								 boolean debug)
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST outputFileST = new ST(
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.*;\n" +
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.tree.*;\n" +
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.debug.*;\n" +
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\n" +
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"class Profiler2 extends Profiler {\n" +
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public void terminate() { ; }\n" +
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n"+
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"public class Test {\n" +
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public static void main(String[] args) throws Exception {\n" +
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CharStream input = new ANTLRFileStream(args[0]);\n" +
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <lexerName> lex = new <lexerName>(input);\n" +
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CommonTokenStream tokens = new CommonTokenStream(lex);\n" +
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <createParser>\n"+
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        parser.<parserStartRuleName>();\n" +
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    }\n" +
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}"
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			);
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST createParserST =
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ST(
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        Profiler2 profiler = new Profiler2();\n"+
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName> parser = new <parserName>(tokens,profiler);\n" +
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        profiler.setParser(parser);\n");
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( !debug ) {
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			createParserST =
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new ST(
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        <parserName> parser = new <parserName>(tokens);\n");
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("createParser", createParserST);
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserName", parserName);
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("lexerName", lexerName);
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserStartRuleName", parserStartRuleName);
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "Test.java", outputFileST.render());
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeLexerTestFile(String lexerName, boolean debug) {
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST outputFileST = new ST(
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.*;\n" +
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.tree.*;\n" +
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.debug.*;\n" +
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\n" +
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"class Profiler2 extends Profiler {\n" +
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public void terminate() { ; }\n" +
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n"+
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"public class Test {\n" +
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public static void main(String[] args) throws Exception {\n" +
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CharStream input = new ANTLRFileStream(args[0]);\n" +
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <lexerName> lex = new <lexerName>(input);\n" +
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CommonTokenStream tokens = new CommonTokenStream(lex);\n" +
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        System.out.println(tokens);\n" +
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    }\n" +
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}"
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			);
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("lexerName", lexerName);
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "Test.java", outputFileST.render());
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeTreeTestFile(String parserName,
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 String treeParserName,
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 String lexerName,
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 String parserStartRuleName,
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 String treeParserStartRuleName,
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									 boolean debug)
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST outputFileST = new ST(
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.*;\n" +
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.tree.*;\n" +
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.debug.*;\n" +
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\n" +
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"class Profiler2 extends Profiler {\n" +
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public void terminate() { ; }\n" +
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n"+
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"public class Test {\n" +
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public static void main(String[] args) throws Exception {\n" +
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CharStream input = new ANTLRFileStream(args[0]);\n" +
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <lexerName> lex = new <lexerName>(input);\n" +
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        TokenRewriteStream tokens = new TokenRewriteStream(lex);\n" +
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <createParser>\n"+
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" +
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <if(!treeParserStartRuleName)>\n" +
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        if ( r.tree!=null ) {\n" +
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"            System.out.println(((Tree)r.tree).toStringTree());\n" +
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"            ((CommonTree)r.tree).sanityCheckParentAndChildIndexes();\n" +
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"		 }\n" +
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <else>\n" +
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);\n" +
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        nodes.setTokenStream(tokens);\n" +
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <treeParserName> walker = new <treeParserName>(nodes);\n" +
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        walker.<treeParserStartRuleName>();\n" +
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <endif>\n" +
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    }\n" +
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}"
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			);
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST createParserST =
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ST(
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        Profiler2 profiler = new Profiler2();\n"+
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName> parser = new <parserName>(tokens,profiler);\n" +
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        profiler.setParser(parser);\n");
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( !debug ) {
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			createParserST =
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new ST(
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        <parserName> parser = new <parserName>(tokens);\n");
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("createParser", createParserST);
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserName", parserName);
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("treeParserName", treeParserName);
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("lexerName", lexerName);
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserStartRuleName", parserStartRuleName);
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("treeParserStartRuleName", treeParserStartRuleName);
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "Test.java", outputFileST.render());
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Parser creates trees and so does the tree parser */
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeTreeAndTreeTestFile(String parserName,
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											String treeParserName,
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											String lexerName,
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											String parserStartRuleName,
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											String treeParserStartRuleName,
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver											boolean debug)
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST outputFileST = new ST(
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.*;\n" +
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.tree.*;\n" +
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.debug.*;\n" +
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\n" +
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"class Profiler2 extends Profiler {\n" +
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public void terminate() { ; }\n" +
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n"+
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"public class Test {\n" +
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public static void main(String[] args) throws Exception {\n" +
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CharStream input = new ANTLRFileStream(args[0]);\n" +
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <lexerName> lex = new <lexerName>(input);\n" +
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        TokenRewriteStream tokens = new TokenRewriteStream(lex);\n" +
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <createParser>\n"+
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" +
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        ((CommonTree)r.tree).sanityCheckParentAndChildIndexes();\n" +
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);\n" +
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        nodes.setTokenStream(tokens);\n" +
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <treeParserName> walker = new <treeParserName>(nodes);\n" +
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <treeParserName>.<treeParserStartRuleName>_return r2 = walker.<treeParserStartRuleName>();\n" +
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"		 CommonTree rt = ((CommonTree)r2.tree);\n" +
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"		 if ( rt!=null ) System.out.println(((CommonTree)r2.tree).toStringTree());\n" +
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    }\n" +
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}"
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			);
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST createParserST =
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ST(
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        Profiler2 profiler = new Profiler2();\n"+
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName> parser = new <parserName>(tokens,profiler);\n" +
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        profiler.setParser(parser);\n");
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( !debug ) {
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			createParserST =
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new ST(
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        <parserName> parser = new <parserName>(tokens);\n");
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("createParser", createParserST);
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserName", parserName);
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("treeParserName", treeParserName);
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("lexerName", lexerName);
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserStartRuleName", parserStartRuleName);
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("treeParserStartRuleName", treeParserStartRuleName);
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "Test.java", outputFileST.render());
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void writeTemplateTestFile(String parserName,
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 String lexerName,
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 String parserStartRuleName,
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 boolean debug)
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST outputFileST = new ST(
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.*;\n" +
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.stringtemplate.*;\n" +
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.stringtemplate.language.*;\n" +
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import org.antlr.runtime.debug.*;\n" +
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"import java.io.*;\n" +
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\n" +
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"class Profiler2 extends Profiler {\n" +
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public void terminate() { ; }\n" +
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n"+
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"public class Test {\n" +
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    static String templates = \"group T; foo(x,y) ::= \\\"\\<x> \\<y>\\\"\";\n" +
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    static StringTemplateGroup group ="+
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    		new StringTemplateGroup(new StringReader(templates)," +
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"					AngleBracketTemplateLexer.class);"+
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    public static void main(String[] args) throws Exception {\n" +
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CharStream input = new ANTLRFileStream(args[0]);\n" +
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <lexerName> lex = new <lexerName>(input);\n" +
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        CommonTokenStream tokens = new CommonTokenStream(lex);\n" +
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <createParser>\n"+
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"		 parser.setTemplateLib(group);\n"+
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName>.<parserStartRuleName>_return r = parser.<parserStartRuleName>();\n" +
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        if ( r.st!=null )\n" +
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"            System.out.print(r.st.toString());\n" +
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"	 	 else\n" +
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"            System.out.print(\"\");\n" +
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"    }\n" +
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}"
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			);
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST createParserST =
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ST(
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        Profiler2 profiler = new Profiler2();\n"+
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        <parserName> parser = new <parserName>(tokens,profiler);\n" +
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"        profiler.setParser(parser);\n");
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( !debug ) {
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			createParserST =
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new ST(
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        <parserName> parser = new <parserName>(tokens);\n");
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("createParser", createParserST);
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserName", parserName);
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("lexerName", lexerName);
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		outputFileST.add("parserStartRuleName", parserStartRuleName);
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "Test.java", outputFileST.render());
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected void eraseFiles(final String filesEndingWith) {
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        File tmpdirF = new File(tmpdir);
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String[] files = tmpdirF.list();
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for(int i = 0; files!=null && i < files.length; i++) {
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( files[i].endsWith(filesEndingWith) ) {
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                new File(tmpdir+"/"+files[i]).delete();
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected void eraseFiles() {
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        File tmpdirF = new File(tmpdir);
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String[] files = tmpdirF.list();
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for(int i = 0; files!=null && i < files.length; i++) {
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new File(tmpdir+"/"+files[i]).delete();
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected void eraseTempDir() {
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        File tmpdirF = new File(tmpdir);
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( tmpdirF.exists() ) {
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            eraseFiles();
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tmpdirF.delete();
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public String getFirstLineOfException() {
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( this.stderrDuringParse ==null ) {
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return null;
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String[] lines = this.stderrDuringParse.split("\n");
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String prefix="Exception in thread \"main\" ";
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return lines[0].substring(prefix.length(),lines[0].length());
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public List realElements(List elements) {
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List n = new ArrayList();
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = Label.NUM_FAUX_LABELS+Label.MIN_TOKEN_TYPE - 1; i < elements.size(); i++) {
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Object o = (Object) elements.get(i);
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( o!=null ) {
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				n.add(o);
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return n;
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public List<String> realElements(Map<String, Integer> elements) {
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List n = new ArrayList();
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Iterator iterator = elements.keySet().iterator();
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while (iterator.hasNext()) {
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String tokenID = (String) iterator.next();
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( elements.get(tokenID) >= Label.MIN_TOKEN_TYPE ) {
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				n.add(tokenID+"="+elements.get(tokenID));
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Collections.sort(n);
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return n;
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String sortLinesInString(String s) {
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String lines[] = s.split("\n");
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Arrays.sort(lines);
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        List<String> linesL = Arrays.asList(lines);
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        StringBuffer buf = new StringBuffer();
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (String l : linesL) {
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.append(l);
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.append('\n');
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return buf.toString();
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * When looking at a result set that consists of a Map/HashTable
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * we cannot rely on the output order, as the hashing algorithm or other aspects
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * of the implementation may be different on differnt JDKs or platforms. Hence
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * we take the Map, convert the keys to a List, sort them and Stringify the Map, which is a
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * bit of a hack, but guarantees that we get the same order on all systems. We assume that
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * the keys are strings.
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @param m The Map that contains keys we wish to return in sorted order
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return A string that represents all the keys in sorted order.
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public String sortMapToString(Map m) {
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.out.println("Map toString looks like: " + m.toString());
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Pass in crap, and get nothing back
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if  (m == null) {
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Sort the keys in the Map
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TreeMap nset = new TreeMap(m);
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.out.println("Tree map looks like: " + nset.toString());
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return nset.toString();
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // override to track errors
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertEquals(String msg, Object a, Object b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertEquals(Object a, Object b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertEquals(String msg, long a, long b) { try {Assert.assertEquals(msg,a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertEquals(long a, long b) { try {Assert.assertEquals(a,b);} catch (Error e) {lastTestFailed=true; throw e;} }
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertTrue(String msg, boolean b) { try {Assert.assertTrue(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} }
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertTrue(boolean b) { try {Assert.assertTrue(b);} catch (Error e) {lastTestFailed=true; throw e;} }
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertFalse(String msg, boolean b) { try {Assert.assertFalse(msg,b);} catch (Error e) {lastTestFailed=true; throw e;} }
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertFalse(boolean b) { try {Assert.assertFalse(b);} catch (Error e) {lastTestFailed=true; throw e;} }
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertNotNull(String msg, Object p) { try {Assert.assertNotNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} }
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertNotNull(Object p) { try {Assert.assertNotNull(p);} catch (Error e) {lastTestFailed=true; throw e;} }
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertNull(String msg, Object p) { try {Assert.assertNull(msg, p);} catch (Error e) {lastTestFailed=true; throw e;} }
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void assertNull(Object p) { try {Assert.assertNull(p);} catch (Error e) {lastTestFailed=true; throw e;} }
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
905