/*
* xtc - The eXTensible Compiler
* Copyright (C) 2007 IBM Corp.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.lang.blink;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import xtc.lang.JavaUnitTests;
import xtc.tree.GNode;
import xtc.tree.Node;
/**
* JUnit tests for classes in package xtc.lang.blink.
*
* This class is a good place to quickly try a method on some simple
* inputs. The test cases also document how to use certain API and
* what it does.
*
* To run from the console, set your CLASSPATH to include
* $JAVA_DEV_ROOT/classes and junit.jar, then run
*
* java -ea junit.textui.TestRunner xtc.lang.blink.UnitTests
*
* Or, to run from within eclipse, Run -> Run ... -> JUnit -> New, and
* specify xtc.lang.blink.UnitTests.
*
* @author Martin Hirzel
* @version $Revision: 1.2 $
*/
public final class UnitTests extends TestCase {
static final class BlinkDebuggerAnalyzerTest extends JavaUnitTests.IgnorableTest {
private final String _expected;
private final String _input;
private final String _language;
BlinkDebuggerAnalyzerTest(final boolean ignore, final String language,
final String input, final String expected) {
super(ignore);
_expected = expected;
_input = input;
_language = language;
}
public void runTestIgnorable() throws Exception {
final CommandAstAnalyzer ana = new CommandAstAnalyzer(Utilities.newRuntime());//, Utilities.debuggerNewSymbolMapper());
UnitTests.debuggerAnalyzerTestError(_language, _input, _expected, ana);
}
}
static final class BlinkDebuggerParserTest extends JavaUnitTests.IgnorableTest {
private final String _expected;
private final String _input;
private final String _language;
BlinkDebuggerParserTest(final boolean ignore, final String language, final String input) {
super(ignore);
_expected = input;
_input = input;
_language = language;
}
public void runTestIgnorable() throws Exception {
if (null == _language) {
UnitTests.debuggerParserTestRoundTrip("C", _input, _expected);
UnitTests.debuggerParserTestRoundTrip("Java", _input, _expected);
} else {
UnitTests.debuggerParserTestRoundTrip(_language, _input, _expected);
}
}
}
static void debuggerAnalyzerTestError(final String language ,final String input, final String expected, final CommandAstAnalyzer ana) throws Exception {
final Object astOrMsg = Utilities.debuggerParseAndAnalyze(language, input);//, Utilities.debuggerNewSymbolMapper());
final String msg = astOrMsg instanceof Node ? "" : trimAnalyzerOutput((String)astOrMsg);
assrtEquals(expected, msg);
}
static void debuggerParserTestRoundTrip(final String language, final String input, final String expected) throws Exception {
final GNode ast = Utilities.debuggerStringToAst(language, input);
final String result = Utilities.debuggerAstToString(ast);
assrtEquals(expected, result);
}
static String trimAnalyzerOutput(String output) {
output = JavaUnitTests.stripPrefix(output, "error:");
final int warningPos = output.indexOf("warning:");
if (-1 != warningPos)
output = output.substring(warningPos);
output = JavaUnitTests.stripSuffix(output, "\n");
output = output.trim();
return output;
}
private static TestSuite makeSuiteDebugger() {
final TestSuite s = new TestSuite();
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "next", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print $metaVar = f()", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print $metaVariable", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print &x", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print (*x).f", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print cVar = f()", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print known", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print x + `.Java this.f($mv) + &z", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print x + `this.f($mv)", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "C", "print x->f", "the Blink debugger does not support the IndirectComponentSelection feature"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "next", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "print $metaVar = f()", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "print &x", "expected"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "print `&x", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "print javaVar = f()", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "print new Object()", "the Blink debugger does not support the NewClassExpression feature"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, "Java", "watch all a.b.c.d.e.f", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "break file name.jni:123", "symbol characters expected"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "break file/name.jni:123", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "gdb break foo.c:10", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "gdbb break foo.c:10", "break class command expected"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "n", "break class command expected"));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "next", ""));
s.addTest(new BlinkDebuggerAnalyzerTest(false, null, "stop at my.pack.Clazz:123", ""));
s.addTest(new BlinkDebuggerParserTest(false, "C", "delete 42"));
s.addTest(new BlinkDebuggerParserTest(false, "C", "print $metaVariable"));
s.addTest(new BlinkDebuggerParserTest(false, "C", "print &x"));
s.addTest(new BlinkDebuggerParserTest(false, "C", "print x + `this.f($mv)"));
s.addTest(new BlinkDebuggerParserTest(false, "C", "print x + `this.f()"));
s.addTest(new BlinkDebuggerParserTest(false, "C", "watch x[0]"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "delete 42"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "print $metaVariable"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "print `&x + y"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "print my.pack.Clazz.staticField"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "watch access y.g"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "watch all a.b.c.d.e.f"));
s.addTest(new BlinkDebuggerParserTest(false, "Java", "watch my.pack.Clazz.h"));
s.addTest(new BlinkDebuggerParserTest(false, null, " stat "));
s.addTest(new BlinkDebuggerParserTest(false, null, " stop at my . pack . Clazz : 123 "));
s.addTest(new BlinkDebuggerParserTest(false, null, "break file/name.jni:123"));
s.addTest(new BlinkDebuggerParserTest(false, null, "continue"));
s.addTest(new BlinkDebuggerParserTest(false, null, "delete 42"));
s.addTest(new BlinkDebuggerParserTest(false, null, "down 3"));
s.addTest(new BlinkDebuggerParserTest(false, null, "exit"));
s.addTest(new BlinkDebuggerParserTest(false, null, "gdb break foo.c:10"));
s.addTest(new BlinkDebuggerParserTest(false, null, "help"));
s.addTest(new BlinkDebuggerParserTest(false, null, "info break"));
s.addTest(new BlinkDebuggerParserTest(false, null, "info watch"));
s.addTest(new BlinkDebuggerParserTest(false, null, "initj"));
s.addTest(new BlinkDebuggerParserTest(false, null, "jdb stop at foo.c:10"));
s.addTest(new BlinkDebuggerParserTest(false, null, "list"));
s.addTest(new BlinkDebuggerParserTest(false, null, "locals"));
s.addTest(new BlinkDebuggerParserTest(false, null, "next"));
s.addTest(new BlinkDebuggerParserTest(false, null, "step"));
s.addTest(new BlinkDebuggerParserTest(false, null, "stop at Clazz:1"));
s.addTest(new BlinkDebuggerParserTest(false, null, "stop at my.pack.Clazz:123"));
s.addTest(new BlinkDebuggerParserTest(false, null, "up 0"));
s.addTest(new BlinkDebuggerParserTest(false, null, "where"));
return s;
}
public static Test suite() {
final TestSuite s = new TestSuite();
s.addTestSuite(xtc.lang.blink.UnitTests.class);
s.addTest(makeSuiteDebugger());
return s;
}
static void assrtEquals(final String expected, final String actual) {
if (null == expected)
return;
final String e = JavaUnitTests.contractSpace(expected);
final String a = JavaUnitTests.contractSpace(actual);
if (e.equals(a))
return;
assertEquals(e, a);
}
}