/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package test;
import junit.framework.TestCase;
import org.codehaus.aspectwerkz.annotation.Before;
import org.codehaus.aspectwerkz.transform.AspectWerkzPreProcessor;
import org.codehaus.aspectwerkz.transform.inlining.EmittedJoinPoint;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class LineNumberTest extends TestCase {
int m_field;
int s_field;
public LineNumberTest() {//ctor exe
m_field = 1;//field set
int mget = m_field;//field get
s_field = 2;//field set
int sget = s_field;//field get
}
public void exec() {//method exe
called();//method call
}
public void called() {//method exe
LineNumberTest t = new LineNumberTest();//ctor call
try {
throw new RuntimeException("fake");//ctor call
} catch (RuntimeException e) {//handler
;
}
}
public void testLineNumbers() throws Throwable {
AspectWerkzPreProcessor aw = new AspectWerkzPreProcessor();
aw.initialize();
String name = LineNumberTest.class.getName().replace('/', '.');
InputStream in = LineNumberTest.class.getClassLoader().getResourceAsStream(name.replace('.','/')+".class");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (in.available() > 0) {
int length = in.read(buffer);
if (length == -1) {
break;
}
bos.write(buffer, 0, length);
}
in.close();
byte[] inBytes = bos.toByteArray();
AspectWerkzPreProcessor.Output output = aw.preProcessWithOutput(name, inBytes, LineNumberTest.class.getClassLoader());
// we have 11 joinpoints
assertEquals(11, output.emittedJoinPoints.length);
//Note: this test depends upon visitor order
// adapt the output when needed
StringBuffer emitted = new StringBuffer();
for (int i = 0; i < output.emittedJoinPoints.length; i++) {
EmittedJoinPoint emittedJoinPoint = output.emittedJoinPoints[i];
//System.out.println(emittedJoinPoint);
emitted.append(emittedJoinPoint.toString());
emitted.append("\n");
}
String allJps = "ConstructorExecution , caller test/LineNumberTest.<init>()V , callee test/LineNumberTest.<init> ()V , line 0\n" +
"FieldSet , caller test/LineNumberTest.<init>()V , callee test/LineNumberTest.m_field I , line 28\n" +
"FieldGet , caller test/LineNumberTest.<init>()V , callee test/LineNumberTest.m_field I , line 29\n" +
"FieldSet , caller test/LineNumberTest.<init>()V , callee test/LineNumberTest.s_field I , line 30\n" +
"FieldGet , caller test/LineNumberTest.<init>()V , callee test/LineNumberTest.s_field I , line 31\n" +
"MethodExecution , caller test/LineNumberTest.exec()V , callee test/LineNumberTest.exec ()V , line 0\n" +
"MethodCall , caller test/LineNumberTest.exec()V , callee test/LineNumberTest.called ()V , line 35\n" +
"MethodExecution , caller test/LineNumberTest.called()V , callee test/LineNumberTest.called ()V , line 0\n" +
"ConstructorCall , caller test/LineNumberTest.called()V , callee test/LineNumberTest.<init> ()V , line 39\n" +
"ConstructorCall , caller test/LineNumberTest.called()V , callee java/lang/RuntimeException.<init> (Ljava/lang/String;)V , line 41\n" +
"Handler , caller test/LineNumberTest.called()V , callee java/lang/RuntimeException. Ljava/lang/RuntimeException; , line 42\n" +
"";
assertEquals(allJps, emitted.toString());
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static junit.framework.Test suite() {
return new junit.framework.TestSuite(LineNumberTest.class);
}
public static class Aspect {
@Before("within(test.LineNumberTest) && !withincode(* test*(..)) && !withincode(* main(..)) && !withincode(* suite())")
void before() {
}
}
}