package javassist.compiler;
import junit.framework.*;
import javassist.*;
import java.util.*;
import javassist.compiler.ast.*;
/*
public class Test{
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Print");
CtMethod cm = cc.getDeclaredMethod("print");
cm.insertBefore("{((Advice)(new
HelloAspect().getAdvice().get(0))).print();}");
//cm.insertBefore("{new Advice(\"advice\").print();}");
pool.write(cc.getName());
new Print().print();
}
}
*/
public class CompTest extends TestCase {
ClassPool sloader;
public CompTest(String name) {
super(name);
}
protected void print(String msg) {
System.out.println(msg);
}
protected void setUp() throws Exception {
sloader = ClassPool.getDefault();
}
public void testCast() throws Exception {
Javac jc = new Javac(sloader.get("javassist.compiler.Print"));
jc.compileStmnt(
"{((javassist.compiler.Advice)"
+ " (new javassist.compiler.HelloAspect().getAdvice().get(0)))"
+ " .print();}");
}
public void testStaticMember() throws Exception {
String src = "javassist.compiler.Print#k = 3;";
Parser p = new Parser(new Lex(src));
SymbolTable stb = new SymbolTable();
Stmnt s = p.parseStatement(stb);
Expr expr = (Expr)s.getLeft().getLeft();
assertEquals('#', expr.getOperator());
assertEquals("javassist.compiler.Print",
((Symbol)expr.oprand1()).get());
}
public void testStaticMember2() throws Exception {
String src = "String#k = 3;";
Parser p = new Parser(new Lex(src));
SymbolTable stb = new SymbolTable();
Stmnt s = p.parseStatement(stb);
Expr expr = (Expr)s.getLeft().getLeft();
assertEquals('#', expr.getOperator());
assertEquals("String", ((Symbol)expr.oprand1()).get());
}
public void testDoubleConst() {
Lex lex = new Lex("7d 0.3d 5e-2d .3d 3e2; .4D 2e-1D;");
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(';', lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(TokenId.DoubleConstant, lex.get());
assertEquals(';', lex.get());
}
public void testRecordLocalVar() throws Exception {
Javac jv = new Javac(sloader.get("javassist.compiler.Print"));
jv.gen.recordVariable("I", "i0", 0, jv.stable);
isRightDecl((Declarator)jv.stable.get("i0"), TokenId.INT, 0, null);
jv.gen.recordVariable("[I", "i1", 1, jv.stable);
isRightDecl((Declarator)jv.stable.get("i1"), TokenId.INT, 1, null);
jv.gen.recordVariable("[[D", "i2", 2, jv.stable);
isRightDecl((Declarator)jv.stable.get("i2"), TokenId.DOUBLE, 2, null);
jv.gen.recordVariable("Ljava/lang/String;", "i3", 4, jv.stable);
isRightDecl((Declarator)jv.stable.get("i3"), TokenId.CLASS, 0,
"java/lang/String");
jv.gen.recordVariable("[LTest;", "i4", 5, jv.stable);
isRightDecl((Declarator)jv.stable.get("i4"), TokenId.CLASS, 1,
"Test");
jv.gen.recordVariable("[[LTest;", "i5", 6, jv.stable);
isRightDecl((Declarator)jv.stable.get("i5"), TokenId.CLASS, 2,
"Test");
}
private void isRightDecl(Declarator d, int type, int dim, String cname) {
assertEquals(type, d.getType());
assertEquals(dim, d.getArrayDim());
assertEquals(cname, d.getClassName());
}
public void testArgTypesToString() {
String s;
s = TypeChecker.argTypesToString(new int[0], new int[0], new String[0]);
assertEquals("()", s);
s = TypeChecker.argTypesToString(new int[] { TokenId.INT, TokenId.CHAR, TokenId.CLASS },
new int[] { 0, 1, 0 },
new String[] { null, null, "String" });
assertEquals("(int,char[],String)", s);
}
public static void main(String[] args) {
// junit.textui.TestRunner.run(suite());
junit.awtui.TestRunner.main(new String[] {
"javassist.compiler.CompTest" });
}
public static Test suite() {
TestSuite suite = new TestSuite("Compiler Tests");
suite.addTestSuite(CompTest.class);
return suite;
}
}
class Print{
public void print(){ System.out.println("@@@"); }
public static int k;
}
class HelloAspect{
List list;
HelloAspect() {
list = new LinkedList();
list.add(new Advice("advice"));
}
List getAdvice() {
return list;
}
}
class Advice{
String str = "";
Advice(String str) {
this.str = str;
}
void print(){
System.out.println(str);
}
}