diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-08 12:22:36 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-08 12:22:36 +0100 |
| commit | 9a14e772cd0a9574b892cf872c32db1d333b0815 (patch) | |
| tree | e469e620340ec6ae60b38dd5504aa331de823b61 /src/test/java | |
| parent | a0d962a3609abee2148abcffe54fae9b09663830 (diff) | |
Compile string addition into string-add instruction
Diffstat (limited to 'src/test/java')
5 files changed, 55 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java index 09af73cc..f7dfb097 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -126,6 +126,18 @@ public class Typed { return new TypedReturnNode(expression, Sources.NULL); } + public static TypedBinaryOperationNode stringAdd( + TypedExpressionNode left, + TypedExpressionNode right + ) { + return new TypedBinaryOperationNode( + TypedBinaryOperator.STRING_ADD, + left, + right, + Sources.NULL + ); + } + public static TypedTargetNode targetVariable(String name) { return new TypedTargetNode.Variable(name, Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java index c6046847..3ce690b2 100644 --- a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java @@ -206,6 +206,15 @@ public class InstructionSerializerTests { assertThat(string, equalTo("(return)")); } + @Test + public void canSerializeStringAdd() { + var instruction = Instructions.stringAdd(); + + var string = serialize(instruction); + + assertThat(string, equalTo("(string-add)")); + } + private String serialize(Instruction instruction) { var builder = new StringBuilder(); InstructionSerializer.serialize(instruction, builder); diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java new file mode 100644 index 00000000..29bf576d --- /dev/null +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java @@ -0,0 +1,26 @@ +package org.shedlang.compiler.stackir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.typed.Typed; + +import static org.shedlang.compiler.stackir.instructions.InstructionMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; + +public class StackCompilerStringAddTests { + @Test + public void stringAddIsCompiledToStringAddInstruction() { + var node = Typed.stringAdd( + Typed.stringLiteral("a"), + Typed.stringLiteral("b") + ); + + var instructions = StackCompiler.compileExpression(node); + + assertThat(instructions, isSequence( + isPushStringInstruction("a"), + isPushStringInstruction("b"), + isStringAddInstruction() + )); + } +} diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java index a47e7c75..8b2661f7 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java @@ -103,4 +103,8 @@ public class InstructionMatchers { ReturnInstruction.class ); } + + public static Matcher<Instruction> isStringAddInstruction() { + return instanceOf(StringAddInstruction.class); + } } diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java index 6f769591..df8b193b 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java @@ -77,4 +77,8 @@ public class Instructions { public static Instruction return_() { return new ReturnInstruction(Sources.NULL); } + + public static Instruction stringAdd() { + return new StringAddInstruction(Sources.NULL); + } } |
