aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-08 11:38:53 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-08 11:38:53 +0100
commitb0a288f03774d3df6f4502af7748a52012e05029 (patch)
tree50aa09baec9467dfbe82cfda9e38aa001d9b31d1 /src/test/java
parent74163c2028e8d09b66cc1bb8d8002aba1a14ffed (diff)
Generate Patio code for stack IR switch instruction
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenSwitchTests.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenSwitchTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenSwitchTests.java
new file mode 100644
index 00000000..d42771c6
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenSwitchTests.java
@@ -0,0 +1,58 @@
+package org.shedlang.compiler.patio;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.stackir.instructions.Instructions;
+import org.shedlang.compiler.testing.snapshots.SnapshotResolver;
+import org.shedlang.compiler.testing.snapshots.Snapshotter;
+import org.shedlang.compiler.typechecker.TypeInfos;
+import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.StructTypeInfo;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.shedlang.compiler.patio.PatioTesting.serialize;
+
+@ExtendWith({SnapshotResolver.class})
+public class PatioCodeGenSwitchTests {
+ @Test
+ public void canGenerateCodeForSwitchWithSingleResult(Snapshotter snapshotter) throws IOException {
+ var namespaceName = NamespaceName.of("Example", "Project");
+ var structType1 = Types.struct(namespaceName, "A");
+ var structType2 = Types.struct(namespaceName, "B");
+ var instruction = Instructions.switch_(
+ List.of(
+ Instructions.switchCase(
+ structType1,
+ List.of(
+ Instructions.pushInt(1),
+ Instructions.pushInt(2),
+ Instructions.intAdd()
+ )
+ ),
+ Instructions.switchCase(
+ structType2,
+ List.of(
+ Instructions.pushInt(101),
+ Instructions.pushInt(102),
+ Instructions.intAdd()
+ )
+ )
+ )
+ );
+ var typeInfos = TypeInfos.EMPTY
+ .addStructTypeInfo(structType1, StructTypeInfo.fromFields(P.orderedMap()))
+ .addStructTypeInfo(structType2, StructTypeInfo.fromFields(P.orderedMap()));
+ var context = PatioCodeGenContext.forTypeInfos(typeInfos)
+ .temporaryPush(new PatioLocalRef("other"))
+ .temporaryPush(new PatioLocalRef("condition"));
+
+ var result = PatioCodeGen.generateInstruction(instruction, context);
+
+ snapshotter.assertSnapshot(serialize(result));
+ }
+}