diff --git a/test/build.xml b/test/build.xml
index 139cc10250a3e5f8697ef20b7792ebc2d3f1eb14..d15a263e4a18d1d47091f5f1145793229b8f2923 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -153,7 +153,6 @@
-
diff --git a/test/conform/org/objectweb/asm/AttributeTest.java b/test/conform/org/objectweb/asm/AttributeTest.java
index 6b83b8b349e7880ed127f30827410fe728d75e6b..6b177066b0e851028d37921f2ad7b25ba51f19b5 100644
--- a/test/conform/org/objectweb/asm/AttributeTest.java
+++ b/test/conform/org/objectweb/asm/AttributeTest.java
@@ -27,15 +27,18 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
/**
* Attribute unit tests.
*
* @author Eric Bruneton
*/
-public class AttributeTest extends TestCase {
+public class AttributeTest {
+ @Test
public void testUnknown() {
assertTrue(new Attribute("Comment").isUnknown());
}
diff --git a/test/conform/org/objectweb/asm/ClassReaderUnitTest.java b/test/conform/org/objectweb/asm/ClassReaderUnitTest.java
index a41f8f74973a96ff0d2fda5ae22e6450f670ec7a..0aba0237bbbd354f9d834991d798b4568de47f11 100644
--- a/test/conform/org/objectweb/asm/ClassReaderUnitTest.java
+++ b/test/conform/org/objectweb/asm/ClassReaderUnitTest.java
@@ -27,10 +27,15 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.io.IOException;
import java.io.InputStream;
-import junit.framework.TestCase;
+import org.junit.Test;
/**
* ClassReader unit tests.
@@ -38,8 +43,9 @@ import junit.framework.TestCase;
* @author Eric Bruneton
* @author Eugene Kuleshov
*/
-public class ClassReaderUnitTest extends TestCase implements Opcodes {
+public class ClassReaderUnitTest implements Opcodes {
+ @Test
public void testIllegalConstructorArgument() {
try {
new ClassReader((InputStream) null);
@@ -48,6 +54,7 @@ public class ClassReaderUnitTest extends TestCase implements Opcodes {
}
}
+ @Test
public void testGetItem() throws IOException {
ClassReader cr = new ClassReader(getClass().getName());
int item = cr.getItem(1);
@@ -55,28 +62,33 @@ public class ClassReaderUnitTest extends TestCase implements Opcodes {
assertTrue(item < cr.header);
}
+ @Test
public void testReadByte() throws IOException {
ClassReader cr = new ClassReader(getClass().getName());
assertEquals(cr.b[0] & 0xFF, cr.readByte(0));
}
+ @Test
public void testGetAccess() throws Exception {
String name = getClass().getName();
assertEquals(Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, new ClassReader(name).getAccess());
}
+ @Test
public void testGetClassName() throws Exception {
String name = getClass().getName();
assertEquals(name.replace('.', '/'), new ClassReader(name).getClassName());
}
+ @Test
public void testGetSuperName() throws Exception {
assertEquals(
- TestCase.class.getName().replace('.', '/'),
+ Object.class.getName().replace('.', '/'),
new ClassReader(getClass().getName()).getSuperName());
assertEquals(null, new ClassReader(Object.class.getName()).getSuperName());
}
+ @Test
public void testGetInterfaces() throws Exception {
String[] interfaces = new ClassReader(getClass().getName()).getInterfaces();
assertNotNull(interfaces);
diff --git a/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java b/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java
index 507f83d4cda6a7f568ae1c24313392c5cee82c7e..97a071bb2f40756fda109a1e312141a9def26f00 100644
--- a/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java
+++ b/test/conform/org/objectweb/asm/ClassWriterComputeMaxsUnitTest.java
@@ -27,6 +27,9 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.lang.reflect.Field;
@@ -38,14 +41,15 @@ import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
/**
* ClassWriter unit tests for COMPUTE_MAXS option with JSR instructions.
*
* @author Eric Bruneton
*/
-public class ClassWriterComputeMaxsUnitTest extends TestCase {
+public class ClassWriterComputeMaxsUnitTest {
private Field successors;
@@ -61,8 +65,8 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
private Label start;
- @Override
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
Class> lClass = Label.class;
Class> eClass = Edge.class;
try {
@@ -281,6 +285,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testBasic() {
Label L0 = new Label();
Label L1 = new Label();
@@ -351,6 +356,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testIfElseInFinally() {
Label L0 = new Label();
Label L1 = new Label();
@@ -433,6 +439,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testSimpleNestedFinally() {
Label L0 = new Label();
Label L1 = new Label();
@@ -524,6 +531,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testSubroutineWithNoRet() {
Label L0 = new Label();
Label L1 = new Label();
@@ -589,6 +597,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* RETURN
*
*/
+ @Test
public void testSubroutineWithNoRet2() {
Label L0 = new Label();
Label L1 = new Label();
@@ -629,6 +638,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testImplicitExit() {
Label L0 = new Label();
Label L1 = new Label();
@@ -714,6 +724,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify
* Static and Dynamic Analysis" by Cyrille Artho and Armin Biere.
*/
+ @Test
public void testImplicitExitToAnotherSubroutine() {
Label T1 = new Label();
Label C1 = new Label();
@@ -805,6 +816,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
+ "N45=N5,N10\n");
}
+ @Test
public void testImplicitExitToAnotherSubroutine2() {
Label L1 = new Label();
Label L2 = new Label();
@@ -840,6 +852,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
*
*
This would not normally be produced by a java compiler.
*/
+ @Test
public void testInterleavedCode() {
Label L1 = new Label();
Label L2 = new Label();
@@ -907,6 +920,7 @@ public class ClassWriterComputeMaxsUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testImplicitExitInTryCatch() {
Label T1 = new Label();
Label C1 = new Label();
diff --git a/test/conform/org/objectweb/asm/ClassWriterUnitTest.java b/test/conform/org/objectweb/asm/ClassWriterUnitTest.java
index 5ffa1e0346819b493d6f096c642055acbfa753e0..4891d222b2ac9f418b11448236e972acd32d9a80 100644
--- a/test/conform/org/objectweb/asm/ClassWriterUnitTest.java
+++ b/test/conform/org/objectweb/asm/ClassWriterUnitTest.java
@@ -27,15 +27,18 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm;
-import junit.framework.TestCase;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
/**
* ClassWriter unit tests.
*
* @author Eric Bruneton
*/
-public class ClassWriterUnitTest extends TestCase {
+public class ClassWriterUnitTest {
+ @Test
public void testNewConst() {
ClassWriter cw = new ClassWriter(0);
cw.newConst(new Byte((byte) 0));
@@ -46,6 +49,7 @@ public class ClassWriterUnitTest extends TestCase {
cw.newMethod("A", "m", "()V", false);
}
+ @Test
public void testIllegalNewConstArgument() {
ClassWriter cw = new ClassWriter(0);
try {
@@ -55,6 +59,7 @@ public class ClassWriterUnitTest extends TestCase {
}
}
+ @Test
public void testIllegalGetCommonSuperClassArguments() {
ClassWriter cw = new ClassWriter(0);
try {
diff --git a/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java b/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java
index b0b4c5e89afe3adddde6d50e95e239ed9a5a5501..8cfb5c3f86c98d612f3cf8067f50e4cc67363ba3 100644
--- a/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java
+++ b/test/conform/org/objectweb/asm/commons/ClassRemapperUnitTest.java
@@ -25,17 +25,17 @@
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
-
package org.objectweb.asm.commons;
+import static org.junit.Assert.assertEquals;
+
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.ListIterator;
import java.util.Map;
-import junit.framework.TestCase;
-
+import org.junit.Test;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
@@ -54,8 +54,9 @@ import org.objectweb.asm.tree.MultiANewArrayInsnNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
import org.objectweb.asm.tree.TypeInsnNode;
-public class ClassRemapperUnitTest extends TestCase implements Opcodes {
+public class ClassRemapperUnitTest implements Opcodes {
+ @Test
public void testClassRemapper() throws Exception {
Map map = new HashMap();
map.put("Boo", "B1");
diff --git a/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java b/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java
index 5f265febf99ef8cc2a363d96f5651b22c4f3af06..c8228364b5c72beeda040dc93162d319fa5a2591 100644
--- a/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java
+++ b/test/conform/org/objectweb/asm/commons/JSRInlinerAdapterUnitTest.java
@@ -27,8 +27,11 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.commons;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import org.junit.Before;
+import org.junit.Test;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
@@ -42,15 +45,14 @@ import org.objectweb.asm.util.Textifier;
*
* @author Eugene Kuleshov, Niko Matsakis, Eric Bruneton
*/
-public class JSRInlinerAdapterUnitTest extends TestCase {
+public class JSRInlinerAdapterUnitTest {
private JSRInlinerAdapter jsr;
private MethodNode exp;
private MethodVisitor current;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setUp() throws Exception {
jsr =
new JSRInlinerAdapter(Opcodes.ASM5, null, 0, "m", "()V", null, null) {
@Override
@@ -193,6 +195,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testBasic() {
{
Label L0 = new Label();
@@ -290,7 +293,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 4);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -310,6 +313,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testIfElseInFinally() {
{
Label L0 = new Label();
@@ -431,7 +435,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 4);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -452,6 +456,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testSimpleNestedFinally() {
{
Label L0 = new Label();
@@ -613,7 +618,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(2, 6);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -637,6 +642,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testSubroutineWithNoRet() {
{
Label L0 = new Label();
@@ -739,7 +745,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 4);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -752,6 +758,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* RETURN
*
*/
+ @Test
public void testSubroutineWithNoRet2() {
{
Label L0 = new Label();
@@ -783,7 +790,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 1);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -808,6 +815,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testImplicitExit() {
{
Label L0 = new Label();
@@ -923,7 +931,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 4);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -951,6 +959,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify
* Static and Dynamic Analysis" by Cyrille Artho and Armin Biere.
*/
+ @Test
public void testImplicitExitToAnotherSubroutine() {
{
Label T1 = new Label();
@@ -1185,7 +1194,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 6);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -1195,6 +1204,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
*
*
I don't believe this can be represented in Java.
*/
+ @Test
public void testCommonCodeWhichMustBeDuplicated() {
{
Label L1 = new Label();
@@ -1294,7 +1304,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 2);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -1303,6 +1313,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
*
*
This would not normally be produced by a java compiler.
*/
+ @Test
public void testInterleavedCode() {
{
Label L1 = new Label();
@@ -1393,7 +1404,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 3);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -1424,6 +1435,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* }
*
*/
+ @Test
public void testImplicitExitInTryCatch() {
{
Label T1 = new Label();
@@ -1705,7 +1717,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 6);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
/**
@@ -1723,6 +1735,7 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
* LV "a" from 1 to 6
*
*/
+ @Test
public void testBasicLineNumberAndLocalVars() {
{
Label LM1 = new Label();
@@ -1837,10 +1850,10 @@ public class JSRInlinerAdapterUnitTest extends TestCase {
END(1, 4);
}
- assertEquals(exp, jsr);
+ assertMethodEquals(exp, jsr);
}
- public void assertEquals(final MethodNode exp, final MethodNode actual) {
+ public void assertMethodEquals(final MethodNode exp, final MethodNode actual) {
String textexp = getText(exp);
String textact = getText(actual);
System.err.println("Expected=" + textexp);
diff --git a/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java b/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java
index 9603d4b1961c82beb526a135e0e9361b864d19f1..d18deddaa7bbdcd91230536b642adadac80b06a7 100644
--- a/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java
+++ b/test/conform/org/objectweb/asm/commons/SerialVersionUIDAdderUnitTest.java
@@ -27,11 +27,12 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.commons;
+import static org.junit.Assert.assertEquals;
+
import java.io.IOException;
import java.io.Serializable;
-import junit.framework.TestCase;
-
+import org.junit.Test;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
@@ -64,7 +65,7 @@ enum SerialVersionEnum {
* @author Alexandre Vasseur
* @author Eric Bruneton
*/
-public class SerialVersionUIDAdderUnitTest extends TestCase implements Serializable {
+public class SerialVersionUIDAdderUnitTest implements Serializable {
static {
System.setIn(System.in);
@@ -84,21 +85,25 @@ public class SerialVersionUIDAdderUnitTest extends TestCase implements Serializa
return svuid[0];
}
+ @Test
public void testClass() throws Throwable {
long UID = computeSerialVersionUID(SerialVersionClass.class.getName());
assertEquals(4737241769335595888L, UID);
}
+ @Test
public void testInterface() throws Throwable {
long UID = computeSerialVersionUID(SerialVersionInterface.class.getName());
assertEquals(-1271936742430161320L, UID);
}
+ @Test
public void testEmptyInterface() throws Throwable {
long UID = computeSerialVersionUID(SerialVersionEmptyInterface.class.getName());
assertEquals(8675733916152748550L, UID);
}
+ @Test
public void testEnum() throws Throwable {
long UID = computeSerialVersionUID(SerialVersionEnum.class.getName());
assertEquals(0L, UID);
diff --git a/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java b/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java
index 2e8da8d2f7d2622204ec74517284d086d6fb5f89..063bfa80e0cb0d1c1c6b1500bac23600074aecd9 100644
--- a/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java
+++ b/test/conform/org/objectweb/asm/commons/SignatureRemapperUnitTest.java
@@ -28,22 +28,26 @@
package org.objectweb.asm.commons;
+import static org.junit.Assert.assertEquals;
+
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import junit.framework.TestCase;
+import org.junit.Test;
-public class SignatureRemapperUnitTest extends TestCase {
+public class SignatureRemapperUnitTest {
- public static void testRemappingParentOnlyNestedClassExtends() {
+ @Test
+ public void testRemappingParentOnlyNestedClassExtends() {
Remapper remapper = new SimpleRemapper(Collections.singletonMap("Outer", "RenamedOuter"));
assertEquals(
"LRenamedOuter.Inner;",
remapper.mapSignature("LOuter.Inner;", false));
}
- public static void testRemappingChildOnlyNestedClassExtends() {
+ @Test
+ public void testRemappingChildOnlyNestedClassExtends() {
Remapper remapper =
new SimpleRemapper(Collections.singletonMap("Outer$Inner", "Outer$RenamedInner"));
assertEquals(
@@ -51,7 +55,8 @@ public class SignatureRemapperUnitTest extends TestCase {
remapper.mapSignature("LOuter.Inner;", false));
}
- public static void testRemappingBothParentAndChildNestedClassExtends() {
+ @Test
+ public void testRemappingBothParentAndChildNestedClassExtends() {
Map mapping = new HashMap();
mapping.put("Outer", "RenamedOuter");
mapping.put("Outer$Inner", "RenamedOuter$RenamedInner");
diff --git a/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java b/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java
index 5658025463ed2c669993cbca504508bc9eb2d3ef..f91bd5b901cd5bd37a189014d1f15059a814d3fa 100644
--- a/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java
+++ b/test/conform/org/objectweb/asm/commons/StaticInitMergerTest.java
@@ -27,8 +27,9 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.commons;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
@@ -39,10 +40,11 @@ import org.objectweb.asm.Opcodes;
*
* @author Eric Bruneton
*/
-public class StaticInitMergerTest extends TestCase implements Opcodes {
+public class StaticInitMergerTest implements Opcodes {
private static final TestClassLoader LOADER = new TestClassLoader();
+ @Test
public void test() throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new StaticInitMerger("$clinit$", cw);
diff --git a/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java b/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java
index 3d2d41b86590bc62bfb5072695fb14d12723877c..b34bf8a6d8f38a655b488f3bf2957e27d8b6c973 100644
--- a/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java
+++ b/test/conform/org/objectweb/asm/tree/ClassNodeUnitTest.java
@@ -27,8 +27,10 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.tree;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
@@ -38,19 +40,22 @@ import org.objectweb.asm.Opcodes;
*
* @author Eric Bruneton
*/
-public class ClassNodeUnitTest extends TestCase implements Opcodes {
+public class ClassNodeUnitTest implements Opcodes {
+ @Test
public void testFrameNode() {
FrameNode fn = new FrameNode(F_SAME, 0, null, 0, null);
assertEquals(AbstractInsnNode.FRAME, fn.getType());
}
+ @Test
public void testInsnNode() {
InsnNode in = new InsnNode(NOP);
assertEquals(in.getOpcode(), NOP);
assertEquals(AbstractInsnNode.INSN, in.getType());
}
+ @Test
public void testIntInsnNode() {
IntInsnNode iin = new IntInsnNode(BIPUSH, 0);
iin.setOpcode(SIPUSH);
@@ -58,6 +63,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.INT_INSN, iin.getType());
}
+ @Test
public void testVarInsnNode() {
VarInsnNode vn = new VarInsnNode(ALOAD, 0);
vn.setOpcode(ASTORE);
@@ -65,6 +71,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.VAR_INSN, vn.getType());
}
+ @Test
public void testTypeInsnNode() {
TypeInsnNode tin = new TypeInsnNode(NEW, "java/lang/Object");
tin.setOpcode(CHECKCAST);
@@ -72,6 +79,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.TYPE_INSN, tin.getType());
}
+ @Test
public void testFieldInsnNode() {
FieldInsnNode fn = new FieldInsnNode(GETSTATIC, "owner", "name", "I");
fn.setOpcode(PUTSTATIC);
@@ -79,6 +87,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.FIELD_INSN, fn.getType());
}
+ @Test
public void testMethodInsnNode() {
MethodInsnNode mn = new MethodInsnNode(INVOKESTATIC, "owner", "name", "I", false);
mn.setOpcode(INVOKESPECIAL);
@@ -86,6 +95,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.METHOD_INSN, mn.getType());
}
+ @Test
public void testInvokeDynamicInsnNode() {
Handle bsm = new Handle(Opcodes.H_INVOKESTATIC, "owner", "name", "()V", false);
InvokeDynamicInsnNode mn = new InvokeDynamicInsnNode("name", "()V", bsm, new Object[0]);
@@ -94,6 +104,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.INVOKE_DYNAMIC_INSN, mn.getType());
}
+ @Test
public void testJumpInsnNode() {
JumpInsnNode jn = new JumpInsnNode(GOTO, new LabelNode());
jn.setOpcode(IFEQ);
@@ -101,6 +112,7 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
assertEquals(AbstractInsnNode.JUMP_INSN, jn.getType());
}
+ @Test
public void testLabelNode() {
LabelNode ln = new LabelNode();
assertEquals(AbstractInsnNode.LABEL, ln.getType());
@@ -110,31 +122,37 @@ public class ClassNodeUnitTest extends TestCase implements Opcodes {
ln.getLabel().info = new Object();
}
+ @Test
public void testIincInsnNode() {
IincInsnNode iincn = new IincInsnNode(1, 1);
assertEquals(AbstractInsnNode.IINC_INSN, iincn.getType());
}
+ @Test
public void testLdcInsnNode() {
LdcInsnNode ldcn = new LdcInsnNode("s");
assertEquals(AbstractInsnNode.LDC_INSN, ldcn.getType());
}
+ @Test
public void testLookupSwitchInsnNode() {
LookupSwitchInsnNode lsn = new LookupSwitchInsnNode(null, null, null);
assertEquals(AbstractInsnNode.LOOKUPSWITCH_INSN, lsn.getType());
}
+ @Test
public void testTableSwitchInsnNode() {
TableSwitchInsnNode tsn = new TableSwitchInsnNode(0, 1, null, (LabelNode[]) null);
assertEquals(AbstractInsnNode.TABLESWITCH_INSN, tsn.getType());
}
+ @Test
public void testMultiANewArrayInsnNode() {
MultiANewArrayInsnNode manan = new MultiANewArrayInsnNode("[[I", 2);
assertEquals(AbstractInsnNode.MULTIANEWARRAY_INSN, manan.getType());
}
+ @Test
public void testCloneMethod() {
MethodNode n = new MethodNode();
Label l0 = new Label();
diff --git a/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java b/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java
index d63a2515e1055d9400b69e6cffa92498febd06e9..7ca6884dc4d60177167bc88b210cfad7db83cfeb 100644
--- a/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java
+++ b/test/conform/org/objectweb/asm/tree/InsnListUnitTest.java
@@ -27,11 +27,18 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.tree;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.util.ListIterator;
import java.util.NoSuchElementException;
-import junit.framework.TestCase;
-
+import org.junit.Before;
+import org.junit.Test;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
@@ -42,7 +49,7 @@ import org.objectweb.asm.Opcodes;
* @author Eric Bruneton
* @author Eugene Kuleshov
*/
-public class InsnListUnitTest extends TestCase {
+public class InsnListUnitTest {
InsnList l1;
@@ -52,9 +59,8 @@ public class InsnListUnitTest extends TestCase {
InsnNode in2;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setUp() throws Exception {
l1 = new CheckedInsnList();
l2 = new CheckedInsnList();
in1 = new InsnNode(0);
@@ -63,25 +69,29 @@ public class InsnListUnitTest extends TestCase {
l2.add(in2);
}
- protected void assertEquals(final AbstractInsnNode[] expected, final AbstractInsnNode[] value) {
+ void assertInsnEquals(final AbstractInsnNode[] expected, final AbstractInsnNode[] value) {
assertEquals(expected.length, value.length);
for (int i = 0; i < value.length; ++i) {
assertEquals(expected[i], value[i]);
}
}
+ @Test
public void testSize() {
assertEquals(0, l1.size());
}
+ @Test
public void testGetFirst() {
assertEquals(null, l1.getFirst());
}
+ @Test
public void testGetLast() {
assertEquals(null, l1.getLast());
}
+ @Test
public void testInvalidGet() {
try {
l1.get(0);
@@ -90,10 +100,12 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testContains() {
assertEquals(false, l1.contains(new InsnNode(0)));
}
+ @Test
public void testIterator() {
InsnNode insn = new InsnNode(0);
@@ -178,6 +190,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(in2, it.next());
}
+ @Test
public void testIterator2() {
ListIterator it = l2.iterator(l2.size());
@@ -207,6 +220,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(3, it.nextIndex());
}
+ @Test
public void testIterator3() {
InsnNode insn = new InsnNode(0);
l2.add(insn);
@@ -239,6 +253,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(in1, l2.getFirst());
}
+ @Test
public void testIterator4() {
try {
new InsnList().iterator().next();
@@ -247,6 +262,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testIterator5() {
// Call add() on empty list
ListIterator it = l1.iterator();
@@ -276,6 +292,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(1, it.next().opcode);
}
+ @Test
public void testInvalidIndexOf() {
try {
l1.indexOf(new InsnNode(0));
@@ -284,10 +301,12 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testToArray() {
assertEquals(0, l1.toArray().length);
}
+ @Test
public void testInvalidSet() {
try {
l1.set(new InsnNode(0), new InsnNode(0));
@@ -296,6 +315,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testSet() {
l1.add(new InsnNode(0));
AbstractInsnNode insn = new InsnNode(0);
@@ -319,6 +339,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(insn, l1.get(1));
}
+ @Test
public void testInvalidAdd() {
try {
l1.add(in1);
@@ -327,6 +348,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testAddEmpty() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -336,11 +358,12 @@ public class InsnListUnitTest extends TestCase {
assertEquals(insn, l1.get(0));
assertEquals(true, l1.contains(insn));
assertEquals(0, l1.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray());
assertEquals(null, insn.getPrevious());
assertEquals(null, insn.getNext());
}
+ @Test
public void testAddNonEmpty() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -352,14 +375,16 @@ public class InsnListUnitTest extends TestCase {
assertEquals(true, l1.contains(insn));
}
+ @Test
public void testAddEmptyList() {
l1.add(new InsnList());
assertEquals(0, l1.size());
assertEquals(null, l1.getFirst());
assertEquals(null, l1.getLast());
- assertEquals(new AbstractInsnNode[0], l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[0], l1.toArray());
}
+ @Test
public void testInvalidAddAll() {
try {
l1.add(l1);
@@ -368,6 +393,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testAddAllEmpty() {
l1.add(l2);
assertEquals(2, l1.size());
@@ -378,9 +404,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(true, l1.contains(in2));
assertEquals(0, l1.indexOf(in1));
assertEquals(1, l1.indexOf(in2));
- assertEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray());
}
+ @Test
public void testAddAllNonEmpty() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -395,9 +422,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(0, l1.indexOf(insn));
assertEquals(1, l1.indexOf(in1));
assertEquals(2, l1.indexOf(in2));
- assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray());
}
+ @Test
public void testInvalidInsert() {
try {
l1.insert(in1);
@@ -406,6 +434,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInsertEmpty() {
InsnNode insn = new InsnNode(0);
l1.insert(insn);
@@ -415,9 +444,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(insn, l1.get(0));
assertEquals(true, l1.contains(insn));
assertEquals(0, l1.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray());
}
+ @Test
public void testInsertNonEmpty() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -429,6 +459,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(0, l1.indexOf(insn));
}
+ @Test
public void testInvalidInsertAll() {
try {
l1.insert(l1);
@@ -437,14 +468,16 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInsertAllEmptyList() {
l1.insert(new InsnList());
assertEquals(0, l1.size());
assertEquals(null, l1.getFirst());
assertEquals(null, l1.getLast());
- assertEquals(new AbstractInsnNode[0], l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[0], l1.toArray());
}
+ @Test
public void testInsertAllEmpty() {
l1.insert(l2);
assertEquals(2, l1.size(), 2);
@@ -455,9 +488,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(true, l1.contains(in2));
assertEquals(0, l1.indexOf(in1));
assertEquals(1, l1.indexOf(in2));
- assertEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, in2}, l1.toArray());
}
+ @Test
public void testInsertAllNonEmpty() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -472,9 +506,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(0, l1.indexOf(in1));
assertEquals(1, l1.indexOf(in2));
assertEquals(2, l1.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray());
}
+ @Test
public void testInvalidInsert2() {
try {
l1.insert(new InsnNode(0), new InsnNode(0));
@@ -483,6 +518,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInsert2NotLast() {
InsnNode insn = new InsnNode(0);
l2.insert(in1, insn);
@@ -492,9 +528,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(in1, l2.get(0));
assertEquals(true, l2.contains(insn));
assertEquals(1, l2.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray());
}
+ @Test
public void testInsert2Last() {
InsnNode insn = new InsnNode(0);
l2.insert(in2, insn);
@@ -504,9 +541,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(in1, l2.get(0));
assertEquals(true, l2.contains(insn));
assertEquals(2, l2.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l2.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l2.toArray());
}
+ @Test
public void testInsertBefore() {
InsnNode insn = new InsnNode(0);
l2.insertBefore(in2, insn);
@@ -516,9 +554,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(insn, l2.get(1));
assertEquals(true, l2.contains(insn));
assertEquals(1, l2.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, insn, in2}, l2.toArray());
}
+ @Test
public void testInsertBeforeFirst() {
InsnNode insn = new InsnNode(0);
l2.insertBefore(in1, insn);
@@ -528,9 +567,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(insn, l2.get(0));
assertEquals(true, l2.contains(insn));
assertEquals(0, l2.indexOf(insn));
- assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l2.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l2.toArray());
}
+ @Test
public void testInvalidInsertBefore() {
try {
l1.insertBefore(new InsnNode(0), new InsnNode(0));
@@ -539,6 +579,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInvalidInsertAll2() {
try {
l1.insert(new InsnNode(0), new InsnList());
@@ -547,6 +588,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInsertAll2EmptyList() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -554,9 +596,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(1, l1.size());
assertEquals(insn, l1.getFirst());
assertEquals(insn, l1.getLast());
- assertEquals(new AbstractInsnNode[] {insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray());
}
+ @Test
public void testInsertAll2NotLast() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -573,6 +616,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(2, l1.indexOf(in2));
}
+ @Test
public void testInsertAll2Last() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -587,9 +631,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(0, l1.indexOf(insn));
assertEquals(1, l1.indexOf(in1));
assertEquals(2, l1.indexOf(in2));
- assertEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn, in1, in2}, l1.toArray());
}
+ @Test
public void testInvalidInsertBeforeAll() {
try {
l1.insertBefore(new InsnNode(0), new InsnList());
@@ -598,6 +643,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testInsertBeforeAll2EmptyList() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -605,9 +651,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(1, l1.size());
assertEquals(insn, l1.getFirst());
assertEquals(insn, l1.getLast());
- assertEquals(new AbstractInsnNode[] {insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {insn}, l1.toArray());
}
+ @Test
public void testInsertBeforeAll2NotLast() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -624,6 +671,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(2, l1.indexOf(in2));
}
+ @Test
public void testInsertBeforeAll2First() {
InsnNode insn = new InsnNode(0);
l1.insert(insn);
@@ -638,9 +686,10 @@ public class InsnListUnitTest extends TestCase {
assertEquals(2, l1.indexOf(insn));
assertEquals(0, l1.indexOf(in1));
assertEquals(1, l1.indexOf(in2));
- assertEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[] {in1, in2, insn}, l1.toArray());
}
+ @Test
public void testInvalidRemove() {
try {
l1.remove(new InsnNode(0));
@@ -648,6 +697,7 @@ public class InsnListUnitTest extends TestCase {
}
}
+ @Test
public void testRemoveSingle() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -656,11 +706,12 @@ public class InsnListUnitTest extends TestCase {
assertEquals(null, l1.getFirst());
assertEquals(null, l1.getLast());
assertEquals(false, l1.contains(insn));
- assertEquals(new AbstractInsnNode[0], l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[0], l1.toArray());
assertEquals(null, insn.getPrevious());
assertEquals(null, insn.getNext());
}
+ @Test
public void testRemoveFirst() {
InsnNode insn = new InsnNode(0);
l1.add(insn);
@@ -671,6 +722,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(null, insn.getNext());
}
+ @Test
public void testRemoveMiddle() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -682,6 +734,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(null, insn.getNext());
}
+ @Test
public void testRemoveLast() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -692,6 +745,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(null, insn.getNext());
}
+ @Test
public void testClear() {
InsnNode insn = new InsnNode(0);
l1.add(new InsnNode(0));
@@ -702,11 +756,12 @@ public class InsnListUnitTest extends TestCase {
assertEquals(null, l1.getFirst());
assertEquals(null, l1.getLast());
assertEquals(false, l1.contains(insn));
- assertEquals(new AbstractInsnNode[0], l1.toArray());
+ assertInsnEquals(new AbstractInsnNode[0], l1.toArray());
assertEquals(null, insn.getPrevious());
assertEquals(null, insn.getNext());
}
+ @Test
public void testAcceptor1() {
l1.add(new InsnNode(55));
l1.add(new InsnNode(77));
@@ -724,6 +779,7 @@ public class InsnListUnitTest extends TestCase {
assertEquals(77, lst.get(1).opcode);
}
+ @Test
public void testResetLabels() throws Exception {
LabelNode labelNode = new LabelNode();
diff --git a/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java b/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java
index 4d817137600664887e0e86e5981490f9a9d1c8b1..224a44d21cd3dfd43d73ae87d51a2f038fbd974b 100644
--- a/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java
+++ b/test/conform/org/objectweb/asm/tree/analysis/AnalyzerUnitTest.java
@@ -27,9 +27,15 @@
// THE POSSIBILITY OF SUCH DAMAGE.
package org.objectweb.asm.tree.analysis;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriterComputeMaxsUnitTest;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.MethodNode;
@@ -39,14 +45,776 @@ import org.objectweb.asm.tree.MethodNode;
*
* @author Eric Bruneton
*/
-public class AnalyzerUnitTest extends ClassWriterComputeMaxsUnitTest {
+public class AnalyzerUnitTest {
+
+ protected ClassWriter cw;
+
+ protected MethodVisitor mv;
+
+ private Label start;
+
+ @Before
+ public void setUp() throws Exception {
+ cw = new ClassWriter(0);
+ cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "C", null, "java/lang/Object", null);
+ mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false);
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "m", "()V", null, null);
+ mv.visitCode();
+ start = new Label();
+ LABEL(start);
+ }
+
+ private void NOP() {
+ mv.visitInsn(Opcodes.NOP);
+ }
+
+ private void PUSH() {
+ mv.visitInsn(Opcodes.ICONST_0);
+ }
+
+ private void ICONST_0() {
+ mv.visitInsn(Opcodes.ICONST_0);
+ }
+
+ private void ISTORE(final int var) {
+ mv.visitVarInsn(Opcodes.ISTORE, var);
+ }
+
+ private void ALOAD(final int var) {
+ mv.visitVarInsn(Opcodes.ALOAD, var);
+ }
+
+ private void ILOAD(final int var) {
+ mv.visitVarInsn(Opcodes.ILOAD, var);
+ }
+
+ private void ASTORE(final int var) {
+ mv.visitVarInsn(Opcodes.ASTORE, var);
+ }
+
+ private void RET(final int var) {
+ mv.visitVarInsn(Opcodes.RET, var);
+ }
+
+ private void ATHROW() {
+ mv.visitInsn(Opcodes.ATHROW);
+ }
+
+ private void ACONST_NULL() {
+ mv.visitInsn(Opcodes.ACONST_NULL);
+ }
+
+ private void RETURN() {
+ mv.visitInsn(Opcodes.RETURN);
+ }
+
+ private void LABEL(final Label l) {
+ mv.visitLabel(l);
+ }
+
+ private void IINC(final int var, final int amnt) {
+ mv.visitIincInsn(var, amnt);
+ }
+
+ private void GOTO(final Label l) {
+ mv.visitJumpInsn(Opcodes.GOTO, l);
+ }
+
+ private void JSR(final Label l) {
+ mv.visitJumpInsn(Opcodes.JSR, l);
+ }
- @Override
- protected boolean isComputeMaxs() {
- return false;
+ private void IFNONNULL(final Label l) {
+ mv.visitJumpInsn(Opcodes.IFNONNULL, l);
+ }
+
+ private void IFNE(final Label l) {
+ mv.visitJumpInsn(Opcodes.IFNE, l);
+ }
+
+ private void TRYCATCH(final Label start, final Label end, final Label handler) {
+ mv.visitTryCatchBlock(start, end, handler, null);
+ }
+
+ protected static class TestClassLoader extends ClassLoader {
+
+ public TestClassLoader() {}
+
+ public Class> defineClass(final String name, final byte[] b) {
+ return defineClass(name, b, 0, b.length);
+ }
+ }
+
+ /**
+ * Tests a method which has the most basic try{}finally form imaginable:
+ *
+ *
+ * public void a1() {
+ * int a = 0;
+ * try {
+ * a += 1;
+ * } finally {
+ * try {
+ * a += 2;
+ * } finally {
+ * a += 3;
+ * }
+ * }
+ * }
+ *
+ */
+ @Test
+ public void testSimpleNestedFinally() {
+ Label L0 = new Label();
+ Label L1 = new Label();
+ Label L2 = new Label();
+ Label L3 = new Label();
+ Label L4 = new Label();
+ Label L5 = new Label();
+
+ ICONST_0(); // N0
+ ISTORE(1);
+
+ // L0: Body of try block:
+ LABEL(L0); // N2
+ IINC(1, 1);
+ JSR(L3);
+ GOTO(L1); // N8
+
+ // L2: First exception handler:
+ LABEL(L2); // N11
+ ASTORE(4);
+ JSR(L3);
+ ALOAD(4); // N16
+ ATHROW();
+
+ // L3: First subroutine:
+ LABEL(L3); // N19
+ ASTORE(2);
+ IINC(1, 2);
+ JSR(L4);
+ PUSH(); // N26
+ PUSH();
+ RET(2);
+
+ // L5: Second exception handler:
+ LABEL(L5); // N30
+ ASTORE(5);
+ JSR(L4);
+ ALOAD(5); // N35
+ ATHROW();
+
+ // L4: Second subroutine:
+ LABEL(L4); // N38
+ ASTORE(3);
+ PUSH();
+ PUSH();
+ IINC(1, 3);
+ RET(3);
+
+ // L1: On normal exit, try block jumps here:
+ LABEL(L1); // N46
+ RETURN();
+
+ TRYCATCH(L0, L2, L2);
+ TRYCATCH(L3, L5, L5);
+
+ assertMaxs(5, 6);
+ }
+
+ /**
+ * This tests a subroutine which has no ret statement, but ends in a "return" instead.
+ *
+ *
We structure this as a try/finally with a break in the finally. Because the while loop is
+ * infinite, it's clear from the byte code that the only path which reaches the RETURN instruction
+ * is through the subroutine.
+ *
+ *
+ * public void a1() {
+ * int a = 0;
+ * while (true) {
+ * try {
+ * a += 1;
+ * } finally {
+ * a += 2;
+ * break;
+ * }
+ * }
+ * }
+ *
+ */
+ @Test
+ public void testSubroutineWithNoRet() {
+ Label L0 = new Label();
+ Label L1 = new Label();
+ Label L2 = new Label();
+ Label L3 = new Label();
+ Label L4 = new Label();
+
+ ICONST_0(); // N0
+ ISTORE(1);
+
+ // L0: while loop header/try block
+ LABEL(L0); // N2
+ IINC(1, 1);
+ JSR(L1);
+ GOTO(L2); // N8
+
+ // L3: implicit catch block
+ LABEL(L3); // N11
+ ASTORE(2);
+ JSR(L1);
+ PUSH(); // N15
+ PUSH();
+ ALOAD(2);
+ ATHROW();
+
+ // L1: subroutine ...
+ LABEL(L1); // N19
+ ASTORE(3);
+ IINC(1, 2);
+ GOTO(L4); // ...not that it does not return!
+
+ // L2: end of the loop... goes back to the top!
+ LABEL(L2); // N26
+ GOTO(L0);
+
+ // L4:
+ LABEL(L4); // N29
+ RETURN();
+
+ TRYCATCH(L0, L3, L3);
+
+ assertMaxs(1, 4);
+ }
+
+ /**
+ * This tests a subroutine which has no ret statement, but ends in a "return" instead.
+ *
+ *
+ */
+ @Test
+ public void testSubroutineWithNoRet2() {
+ Label L0 = new Label();
+ Label L1 = new Label();
+
+ ACONST_NULL(); // N0
+ JSR(L0);
+ NOP(); // N4
+ LABEL(L0); // N5
+ ASTORE(0);
+ ASTORE(0);
+ RETURN();
+ LABEL(L1); // N8
+ mv.visitLocalVariable("i", "I", null, L0, L1, 1);
+
+ assertMaxs(2, 2);
+ }
+
+ /**
+ * This tests a subroutine which has no ret statement, but instead exits implicitely by branching
+ * to code which is not part of the subroutine. (Sadly, this is legal)
+ *
+ *
We structure this as a try/finally in a loop with a break in the finally. The loop is not
+ * trivially infinite, so the RETURN statement is reachable both from the JSR subroutine and from
+ * the main entry point.
+ *
+ *
+ * public void a1() {
+ * int a = 0;
+ * while (null == null) {
+ * try {
+ * a += 1;
+ * } finally {
+ * a += 2;
+ * break;
+ * }
+ * }
+ * }
+ *
+ */
+ @Test
+ public void testImplicitExit() {
+ Label L0 = new Label();
+ Label L1 = new Label();
+ Label L2 = new Label();
+ Label L3 = new Label();
+ Label L4 = new Label();
+ Label L5 = new Label();
+
+ ICONST_0(); // N0
+ ISTORE(1);
+
+ // L5: while loop header
+ LABEL(L5); // N2
+ ACONST_NULL();
+ IFNONNULL(L4);
+
+ // L0: try block
+ LABEL(L0); // N6
+ IINC(1, 1);
+ JSR(L1);
+ GOTO(L2); // N12
+
+ // L3: implicit catch block
+ LABEL(L3); // N15
+ ASTORE(2);
+ JSR(L1);
+ ALOAD(2); // N19
+ PUSH();
+ PUSH();
+ ATHROW();
+
+ // L1: subroutine ...
+ LABEL(L1); // N23
+ ASTORE(3);
+ IINC(1, 2);
+ GOTO(L4); // ...not that it does not return!
+
+ // L2: end of the loop... goes back to the top!
+ LABEL(L2); // N30
+ GOTO(L0);
+
+ // L4:
+ LABEL(L4); // N33
+ RETURN();
+
+ TRYCATCH(L0, L3, L3);
+
+ assertMaxs(1, 4);
+ }
+
+ /**
+ * Tests a nested try/finally with implicit exit from one subroutine to the other subroutine.
+ * Equivalent to the following java code:
+ *
+ *
+ *
+ * This example is from the paper, "Subroutine Inlining and Bytecode Abstraction to Simplify
+ * Static and Dynamic Analysis" by Cyrille Artho and Armin Biere.
+ */
+ @Test
+ public void testImplicitExitToAnotherSubroutine() {
+ Label T1 = new Label();
+ Label C1 = new Label();
+ Label S1 = new Label();
+ Label L = new Label();
+ Label C2 = new Label();
+ Label S2 = new Label();
+ Label W = new Label();
+ Label X = new Label();
+
+ // variable numbers:
+ int b = 1;
+ int e1 = 2;
+ int e2 = 3;
+ int r1 = 4;
+ int r2 = 5;
+
+ ICONST_0(); // N0
+ ISTORE(1);
+
+ // T1: first try:
+ LABEL(T1); // N2
+ JSR(S1);
+ RETURN(); // N5
+
+ // C1: exception handler for first try
+ LABEL(C1); // N6
+ ASTORE(e1);
+ JSR(S1);
+ PUSH(); // N10
+ PUSH();
+ ALOAD(e1);
+ ATHROW();
+
+ // S1: first finally handler
+ LABEL(S1); // N14
+ ASTORE(r1);
+ PUSH();
+ PUSH();
+ GOTO(W);
+
+ // L: body of while loop, also second try
+ LABEL(L); // N21
+ JSR(S2);
+ RETURN(); // N24
+
+ // C2: exception handler for second try
+ LABEL(C2); // N25
+ ASTORE(e2);
+ PUSH();
+ PUSH();
+ JSR(S2);
+ ALOAD(e2); // N31
+ ATHROW();
+
+ // S2: second finally handler
+ LABEL(S2); // N33
+ ASTORE(r2);
+ ILOAD(b);
+ IFNE(X);
+ RET(r2);
+
+ // W: test for the while loop
+ LABEL(W); // N41
+ ILOAD(b);
+ IFNE(L); // falls through to X
+
+ // X: exit from finally{} block
+ LABEL(X); // N45
+ RET(r1);
+
+ TRYCATCH(T1, C1, C1);
+ TRYCATCH(L, C2, C2);
+
+ assertMaxs(5, 6);
+ }
+
+ @Test
+ public void testImplicitExitToAnotherSubroutine2() {
+ Label L1 = new Label();
+ Label L2 = new Label();
+ Label L3 = new Label();
+
+ ICONST_0(); // N0
+ ISTORE(1);
+ JSR(L1);
+ RETURN(); // N5
+
+ LABEL(L1); // N6
+ ASTORE(2);
+ JSR(L2);
+ GOTO(L3); // N10
+
+ LABEL(L2); // N13
+ ASTORE(3);
+ ILOAD(1);
+ IFNE(L3);
+ RET(3);
+
+ LABEL(L3); // N20
+ RET(2);
+
+ assertMaxs(1, 4);
+ }
+
+ /**
+ * This tests a simple subroutine where the control flow jumps back and forth between the
+ * subroutine and the caller.
+ *
+ *
This would not normally be produced by a java compiler.
+ */
+ @Test
+ public void testInterleavedCode() {
+ Label L1 = new Label();
+ Label L2 = new Label();
+ Label L3 = new Label();
+ Label L4 = new Label();
+
+ ICONST_0(); // N0
+ ISTORE(1);
+ JSR(L1);
+ GOTO(L2); // N5
+
+ // L1: subroutine 1
+ LABEL(L1); // N8
+ ASTORE(2);
+ IINC(1, 1);
+ GOTO(L3);
+
+ // L2: second part of main subroutine
+ LABEL(L2); // N15
+ IINC(1, 2);
+ GOTO(L4);
+
+ // L3: second part of subroutine 1
+ LABEL(L3); // N21
+ IINC(1, 4);
+ PUSH();
+ PUSH();
+ RET(2);
+
+ // L4: third part of main subroutine
+ LABEL(L4); // N28
+ PUSH();
+ PUSH();
+ RETURN();
+
+ assertMaxs(4, 3);
+ }
+
+ /**
+ * Tests a nested try/finally with implicit exit from one subroutine to the other subroutine, and
+ * with a surrounding try/catch thrown in the mix. Equivalent to the following java code:
+ *
+ *