diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-21 16:21:30 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-21 17:29:40 +0000 |
| commit | bedd122699360efcaf07310e713e0eec1e7457ec (patch) | |
| tree | 379f8782b33b0659ee68490e9e8029f9dcf21a9f /src/test/java | |
| parent | 7785c220bcef000aedfbe2b9c95a32272786f370 (diff) | |
Serialize Patio instructions to Protobuf
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java | 506 |
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 |
