From 7b82840b3dc0d29a24f96f008a97d9db4cd55d40 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 22 Jun 2024 22:27:15 +0200 Subject: [PATCH] add ByteCodeTestUtil --- src/test/java/BytecodeTestUtil.java | 28 +++++++++++++++++++++++++++ src/test/java/CodegeneratorTests.java | 16 +++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/test/java/BytecodeTestUtil.java diff --git a/src/test/java/BytecodeTestUtil.java b/src/test/java/BytecodeTestUtil.java new file mode 100644 index 0000000..6bb3063 --- /dev/null +++ b/src/test/java/BytecodeTestUtil.java @@ -0,0 +1,28 @@ +import de.maishai.Compiler; + +import java.lang.reflect.Method; +import java.util.List; + +public class BytecodeTestUtil { + + private Class clazz; + + public BytecodeTestUtil(String sourceFilePath, String className) throws Exception { + byte[] resultBytecode = Compiler.generateByteCodeArrayFromFile(List.of(sourceFilePath)).get(0); + + ClassLoader classLoader = new ClassLoader() { + @Override + protected Class findClass(String name) { + return defineClass(name, resultBytecode, 0, resultBytecode.length); + } + }; + clazz = classLoader.loadClass(className); + } + + public Object invokeMethod(String methodName, Class[] parameterTypes, Object... args) throws Exception { + Object instance = clazz.getDeclaredConstructor().newInstance(); + + Method method = clazz.getMethod(methodName, parameterTypes); + return method.invoke(instance, args); + } +} \ No newline at end of file diff --git a/src/test/java/CodegeneratorTests.java b/src/test/java/CodegeneratorTests.java index cc580ad..26ab978 100644 --- a/src/test/java/CodegeneratorTests.java +++ b/src/test/java/CodegeneratorTests.java @@ -1,9 +1,6 @@ -import de.maishai.Compiler; -import de.maishai.ast.records.Program; import org.junit.jupiter.api.Test; -import java.util.List; - +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; public class CodegeneratorTests { @@ -13,4 +10,15 @@ public class CodegeneratorTests { // byte[] resultBytecode = Compiler.generateByteCodeArrayFromTypedAst(); // assertEquals(AbstractSyntax_PublicClass.get(), resultBytecode); // } + + @Test + public void testMethodCall() { + assertDoesNotThrow(() -> { + BytecodeTestUtil testUtility = new BytecodeTestUtil("src/test/testFiles/JavaTestfilesFeatures/MethodCall.java", "MethodCall"); + + assertEquals(3, testUtility.invokeMethod("method", null)); + assertEquals(1, testUtility.invokeMethod("method1", new Class[]{int.class}, 1)); + assertEquals(3, testUtility.invokeMethod("method2", new Class[]{int.class, int.class}, 1, 2)); + }); + } }