aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-08 12:22:36 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-08 12:22:36 +0100
commit9a14e772cd0a9574b892cf872c32db1d333b0815 (patch)
treee469e620340ec6ae60b38dd5504aa331de823b61 /src/test/java
parenta0d962a3609abee2148abcffe54fae9b09663830 (diff)
Compile string addition into string-add instruction
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/Typed.java12
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java9
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/StackCompilerStringAddTests.java26
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java4
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java4
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);
+ }
}