diff options
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java new file mode 100644 index 00000000..0ed0be80 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java @@ -0,0 +1,54 @@ +package org.shedlang.compiler.backends.llvm.codegen; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; +import static org.zwobble.precisely.Matchers.isSequence; + +public class PatioToLlvmFunctionContextTests { + @Test + public void whenThereAreNoInstructionsOutsideOfBasicBlockThenToBasicBlocksReturnsBasicBlocks() { + var context = PatioToLlvmFunctionContext.of(PatioToLlvmModuleContext.EMPTY); + var addInstruction = LlvmIr.add( + LlvmIr.variableLocal("a"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("b"), + LlvmIr.variableLocal("c") + ); + context = context.addInstruction(addInstruction); + var branchInstruction = LlvmIr.brUnconditional("end"); + context = context.addTerminatorInstruction(branchInstruction); + + var basicBlocks = context.toBasicBlocks(); + + assertThat(basicBlocks.value(), isSequence( + equalTo(LlvmIr.basicBlock(List.of(addInstruction), branchInstruction)) + )); + } + + @Test + public void whenThereAreInstructionsOutsideOfBasicBlockThenToBasicBlocksThrowsException() { + var context = PatioToLlvmFunctionContext.of(PatioToLlvmModuleContext.EMPTY); + var addInstruction = LlvmIr.add( + LlvmIr.variableLocal("a"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("b"), + LlvmIr.variableLocal("c") + ); + context = context.addInstruction(addInstruction); + + var c = context; + var error = assertThrows( + IllegalStateException.class, + () -> c.toBasicBlocks() + ); + + assertThat(error.getMessage(), equalTo("basic block is missing terminator instruction")); + } +} |
