aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 16:21:30 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 17:29:40 +0000
commitbedd122699360efcaf07310e713e0eec1e7457ec (patch)
tree379f8782b33b0659ee68490e9e8029f9dcf21a9f /src/test/java
parent7785c220bcef000aedfbe2b9c95a32272786f370 (diff)
Serialize Patio instructions to Protobuf
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java506
1 files changed, 505 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java b/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
index 03ded426..6e889390 100644
--- a/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
@@ -2,7 +2,6 @@ package org.shedlang.compiler.patio.protobuf;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.patio.PatioFunctionDeclaration;
-import org.shedlang.compiler.patio.PatioTesting;
import org.shedlang.compiler.patio.PatioVisibility;
import org.shedlang.compiler.patio.instructions.Patio;
import org.shedlang.compiler.patio.types.PatioDataLayouts;
@@ -11,6 +10,7 @@ import org.shedlang.compiler.patio.types.PatioTypes;
import org.shedlang.compiler.sources.Sources;
import java.util.List;
+import java.util.Optional;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.equalTo;
@@ -97,6 +97,510 @@ public class PatioToProtobufTests {
assertThat(deserializedElement, equalTo(element));
}
+ // == Instructions ==
+
+ @Test
+ public void canSerializeBlock() {
+ var instruction = Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(1)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(2))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeBoolToInt() {
+ var instruction = Patio.boolToInt(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallWithoutDestination() {
+ var instruction = Patio.call(
+ Optional.empty(),
+ "f",
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallWithDestination() {
+ var instruction = Patio.call(
+ Optional.of(Patio.localRef("destination")),
+ "f",
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallPointer() {
+ var instruction = Patio.callPointer(
+ Patio.localRef("destination"),
+ Patio.localRef("f"),
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeDataPtrToInt() {
+ var instruction = Patio.dataPtrToInt(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIf() {
+ var instruction = Patio.if_(
+ List.of(
+ Patio.localRef("x"),
+ Patio.localRef("y")
+ ),
+ Patio.localRef("condition"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(1)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(2))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x2"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("y2"), Patio.intConst(12))
+ ),
+ List.of(
+ Patio.localRef("x2"),
+ Patio.localRef("y2")
+ )
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntAdd() {
+ var instruction = Patio.intAdd(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntEquals() {
+ var instruction = Patio.intEquals(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntNotEqual() {
+ var instruction = Patio.intNotEqual(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntSub() {
+ var instruction = Patio.intSub(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntToBool() {
+ var instruction = Patio.intToBool(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntToDataPtr() {
+ var instruction = Patio.intToDataPtr(
+ Patio.localRef("destination"),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLocalStore() {
+ var instruction = Patio.localStore(
+ Patio.localRef("destination"),
+ Patio.localRef("x")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoop() {
+ var instruction = Patio.loop(
+ List.of(
+ Patio.localStore(Patio.localRef("x"), Patio.intConst(1))
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoopBreak() {
+ var instruction = Patio.loopBreak();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoopContinue() {
+ var instruction = Patio.loopContinue();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeMemoryLoad() {
+ var instruction = Patio.memoryLoad(
+ Patio.localRef("destination"),
+ Patio.localRef("pointer"),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
+ List.of(1)
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeMemoryStore() {
+ var instruction = Patio.memoryStore(
+ Patio.localRef("pointer"),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
+ List.of(1),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeResume() {
+ var instruction = Patio.resume(Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeReturn() {
+ var instruction = Patio.return_(Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeReturnVoid() {
+ var instruction = Patio.returnVoid();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeSwitch() {
+ var instruction = Patio.switch_(
+ List.of(
+ Patio.localRef("x"),
+ Patio.localRef("y")
+ ),
+ Patio.localRef("value"),
+ List.of(
+ Patio.switchCase(
+ 1,
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(12))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ )
+ ),
+ Patio.switchCase(
+ 2,
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x2"), Patio.intConst(21)),
+ Patio.localStore(Patio.localRef("y2"), Patio.intConst(22))
+ ),
+ List.of(
+ Patio.localRef("x2"),
+ Patio.localRef("y2")
+ )
+ )
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x3"), Patio.intConst(31)),
+ Patio.localStore(Patio.localRef("y3"), Patio.intConst(32))
+ ),
+ List.of(
+ Patio.localRef("x3"),
+ Patio.localRef("y3")
+ )
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeThrow() {
+ var instruction = Patio.throw_("Error", Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeTry() {
+ var instruction = Patio.try_(
+ List.of(Patio.localRef("x"), Patio.localRef("y")),
+ List.of(
+ Patio.catchClause(
+ "Error1",
+ Patio.localRef("a1"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xCatch1"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("yCatch1"), Patio.intConst(12))
+ ),
+ List.of(Patio.localRef("xCatch1"), Patio.localRef("yCatch1"))
+ )
+ ),
+ Patio.catchClause(
+ "Error2",
+ Patio.localRef("a2"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xCatch2"), Patio.intConst(21)),
+ Patio.localStore(Patio.localRef("yCatch2"), Patio.intConst(22))
+ ),
+ List.of(Patio.localRef("xCatch2"), Patio.localRef("yCatch2"))
+ )
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xTry"), Patio.intConst(31)),
+ Patio.localStore(Patio.localRef("yTry"), Patio.intConst(32))
+ ),
+ List.of(Patio.localRef("xTry"), Patio.localRef("yTry"))
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeUnreachable() {
+ var instruction = Patio.unreachable();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeVarLoad() {
+ var instruction = Patio.varLoad(
+ Patio.localRef("destination"),
+ Patio.localRef("v")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeVarStore() {
+ var instruction = Patio.varStore(
+ Patio.localRef("destination"),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
// == Operands ==
@Test