diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-26 21:03:25 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-26 21:03:25 +0000 |
| commit | cf04670f145879bc3877326698a4d3d0b9f2a988 (patch) | |
| tree | 50b8c499e79e6814361f127572244aa0927b67d7 /src/test/java | |
| parent | d51fb33b030447682d47087be59cd8925516ec24 (diff) | |
Serialize Patio compilation unit elements to flatbuffers
Diffstat (limited to 'src/test/java')
3 files changed, 144 insertions, 106 deletions
diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java index 2c6c3a4d..cfb28691 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java @@ -1,6 +1,10 @@ package org.shedlang.compiler.patio.serialization; import org.junit.jupiter.api.Test; +import org.shedlang.compiler.patio.PatioCompilationUnitElement; +import org.shedlang.compiler.patio.PatioFunctionDeclaration; +import org.shedlang.compiler.patio.PatioFunctionDefinition; +import org.shedlang.compiler.patio.PatioVisibility; import org.shedlang.compiler.patio.instructions.Patio; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.operands.PatioOperand; @@ -17,6 +21,111 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; public abstract class PatioSerializationTests { + // == Compilation unit elements == + + protected abstract PatioCompilationUnitElement deserializeCompilationUnitElement(byte[] buffer, Source parentSource); + protected abstract byte[] serializeCompilationUnitElement(PatioCompilationUnitElement value, Source parentSource); + + @Test + public void canSerializeDataElementImmutableDefinition() { + var element = Patio.dataElementImmutableDefinition( + "x", + PatioVisibility.PRIVATE, + PatioDataValues.array( + PatioDataLayouts.BYTE, + List.of(PatioDataValues.byte_(0x01), PatioDataValues.byte_(0x02)) + ) + ); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + + @Test + public void canSerializeDataElementMutableDeclaration() { + var element = Patio.dataElementMutableDeclaration( + "x", + PatioDataLayouts.INT + ); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + + @Test + public void canSerializeDataElementMutableDefinition() { + var element = Patio.dataElementMutableDefinition( + "x", + PatioVisibility.PRIVATE, + PatioDataValues.int_(42) + ); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + + @Test + public void canSerializeExceptionTypeDefinition() { + var element = Patio.exceptionTypeDefinition("Error", PatioTypes.INT); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + + @Test + public void canSerializeFunctionDeclaration() { + var element = PatioFunctionDeclaration.builder() + .withName("f") + .addParam(Patio.param("param1", PatioTypes.INT)) + .addParam(Patio.param("param2", PatioTypes.DATA_PTR)) + .withReturnType(PatioTypes.VOID) + .build(); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + + @Test + public void canSerializeFunctionDefinition() { + var element = PatioFunctionDefinition.builder() + .withName("f") + .withVisibility(PatioVisibility.PRIVATE) + .addLocal(Patio.param("param1", PatioTypes.INT)) + .addLocal(Patio.param("param2", PatioTypes.DATA_PTR)) + .addLocal(Patio.val("local1", PatioTypes.FUNCTION_PTR)) + .addLocal(Patio.val("local2", PatioTypes.INT)) + .withReturnType(PatioTypes.VOID) + .addBodyInstruction(Patio.localStore(Patio.localRef("local2"), Patio.intConst(2))) + .build(); + + var deserializedElement = deserializeCompilationUnitElement( + serializeCompilationUnitElement(element, Sources.NULL), + Sources.NULL + ); + + assertThat(deserializedElement, equalTo(element)); + } + // == Instructions == protected abstract PatioInstruction deserializeInstruction(byte[] buffer, Source parentSource); diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java index a430ee8b..00be1e28 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.patio.serialization; import com.google.flatbuffers.FlatBufferBuilder; +import org.shedlang.compiler.patio.PatioCompilationUnitElement; import org.shedlang.compiler.patio.flatbuffers.*; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.operands.PatioOperand; @@ -15,6 +16,20 @@ import java.nio.ByteBuffer; public class PatioToFlatbuffersTests extends PatioSerializationTests { @Override + protected byte[] serializeCompilationUnitElement(PatioCompilationUnitElement value, Source parentSource) { + var builder = new FlatBufferBuilder(); + var valueFbs = PatioToFlatbuffers.serializeCompilationUnitElement(builder, value, parentSource); + builder.finish(valueFbs); + return builder.sizedByteArray(); + } + + @Override + protected PatioCompilationUnitElement deserializeCompilationUnitElement(byte[] buffer, Source parentSource) { + var valueFbs = PatioCompilationUnitElementFbs.getRootAsPatioCompilationUnitElementFbs(ByteBuffer.wrap(buffer)); + return PatioToFlatbuffers.deserializeCompilationUnitElement(valueFbs, parentSource); + } + + @Override protected byte[] serializeInstruction(PatioInstruction value, Source parentSource) { var builder = new FlatBufferBuilder(); var valueFbs = PatioToFlatbuffers.serializeInstruction(builder, value, parentSource); diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java index cfee8d5f..168f5372 100644 --- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java +++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java @@ -2,18 +2,19 @@ package org.shedlang.compiler.patio.serialization; import com.google.protobuf.InvalidProtocolBufferException; import org.junit.jupiter.api.Test; -import org.shedlang.compiler.patio.PatioFunctionDeclaration; +import org.shedlang.compiler.patio.PatioCompilationUnitElement; import org.shedlang.compiler.patio.PatioFunctionDefinition; -import org.shedlang.compiler.patio.PatioVisibility; import org.shedlang.compiler.patio.instructions.Patio; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.protobuf.PatioProtobuf; -import org.shedlang.compiler.patio.types.*; +import org.shedlang.compiler.patio.types.PatioDataLayout; +import org.shedlang.compiler.patio.types.PatioDataValue; +import org.shedlang.compiler.patio.types.PatioType; +import org.shedlang.compiler.patio.types.PatioTypes; import org.shedlang.compiler.patio.values.PatioDataPtrValue; import org.shedlang.compiler.patio.values.PatioIntValue; import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.sources.Sources; import java.util.List; @@ -22,6 +23,21 @@ import static org.zwobble.precisely.Matchers.equalTo; public class PatioToProtobufTests extends PatioSerializationTests { @Override + protected byte[] serializeCompilationUnitElement(PatioCompilationUnitElement value, Source parentSource) { + return PatioToProtobuf.serializeCompilationUnitElement(value, parentSource).toByteArray(); + } + + @Override + protected PatioCompilationUnitElement deserializeCompilationUnitElement(byte[] buffer, Source parentSource) { + try { + var valueProtobuf = PatioProtobuf.PatioCompilationUnitElement.parseFrom(buffer); + return PatioToProtobuf.deserializeCompilationUnitElement(valueProtobuf, parentSource); + } catch (InvalidProtocolBufferException exception) { + throw new RuntimeException(exception); + } + } + + @Override protected byte[] serializeInstruction(PatioInstruction value, Source parentSource) { return PatioToProtobuf.serializeInstruction(value, parentSource).toByteArray(); } @@ -142,106 +158,4 @@ public class PatioToProtobufTests extends PatioSerializationTests { assertThat(deserializedCompilationUnit, equalTo(compilationUnit)); } - - // == Compilation unit elements == - - @Test - public void canSerializeDataElementImmutableDefinition() { - var element = Patio.dataElementImmutableDefinition( - "x", - PatioVisibility.PRIVATE, - PatioDataValues.array( - PatioDataLayouts.BYTE, - List.of(PatioDataValues.byte_(0x01), PatioDataValues.byte_(0x02)) - ) - ); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } - - @Test - public void canSerializeDataElementMutableDeclaration() { - var element = Patio.dataElementMutableDeclaration( - "x", - PatioDataLayouts.INT - ); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } - - @Test - public void canSerializeDataElementMutableDefinition() { - var element = Patio.dataElementMutableDefinition( - "x", - PatioVisibility.PRIVATE, - PatioDataValues.int_(42) - ); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } - - @Test - public void canSerializeExceptionTypeDefinition() { - var element = Patio.exceptionTypeDefinition("Error", PatioTypes.INT); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } - - @Test - public void canSerializeFunctionDeclaration() { - var element = PatioFunctionDeclaration.builder() - .withName("f") - .addParam(Patio.param("param1", PatioTypes.INT)) - .addParam(Patio.param("param2", PatioTypes.DATA_PTR)) - .withReturnType(PatioTypes.VOID) - .build(); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } - - @Test - public void canSerializeFunctionDefinition() { - var element = PatioFunctionDefinition.builder() - .withName("f") - .withVisibility(PatioVisibility.PRIVATE) - .addLocal(Patio.param("param1", PatioTypes.INT)) - .addLocal(Patio.param("param2", PatioTypes.DATA_PTR)) - .addLocal(Patio.val("local1", PatioTypes.FUNCTION_PTR)) - .addLocal(Patio.val("local2", PatioTypes.INT)) - .withReturnType(PatioTypes.VOID) - .addBodyInstruction(Patio.localStore(Patio.localRef("local2"), Patio.intConst(2))) - .build(); - - var deserializedElement = PatioToProtobuf.deserializeCompilationUnitElement( - PatioToProtobuf.serializeCompilationUnitElement(element, Sources.NULL), - Sources.NULL - ); - - assertThat(deserializedElement, equalTo(element)); - } } |
