aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
new file mode 100644
index 00000000..45af4ac3
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
@@ -0,0 +1,38 @@
+package org.shedlang.compiler.backends.llvm;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall;
+import org.shedlang.compiler.stackir.instructions.Instructions;
+
+import java.util.List;
+
+import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableLocal;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.*;
+
+public class LlvmCompilerCallTests {
+ @Test
+ public void canCallFunctionWithNoArgs() {
+ var instruction = Instructions.call(0, List.of());
+ var context = LlvmCompilerContext.EMPTY
+ .push(LlvmIr.variableLocal("x"))
+ .push(LlvmIr.variableLocal("f"));
+
+ var result = LlvmCompiler.compileInstruction(instruction, context);
+
+ assertThat(result.instructions(), isSequence(
+ instanceOf(
+ LlvmCall.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("tmp__0")),
+ has("returnType", x -> x.returnType(), equalTo(LlvmCompilerTypes.VALUE_TYPE)),
+ has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("f")),
+ has("args", x -> x.args(), isSequence())
+ )
+ ));
+ assertThat(result.stack(), isSequence(
+ isLlvmVariableLocal("tmp__0"),
+ isLlvmVariableLocal("x")
+ ));
+ }
+}