From 48a0d074425e5105e92fd3f518c9d80ae8f6dd9a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Mar 2026 11:01:28 +0000 Subject: Add deserialization for sources --- .../sources/protobuf/SourceToProtobufTests.java | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/sources/protobuf/SourceToProtobufTests.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/sources/protobuf/SourceToProtobufTests.java b/src/test/java/org/shedlang/compiler/sources/protobuf/SourceToProtobufTests.java new file mode 100644 index 00000000..e8f68e46 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/sources/protobuf/SourceToProtobufTests.java @@ -0,0 +1,80 @@ +package org.shedlang.compiler.sources.protobuf; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.sources.FileFragmentSource; +import org.shedlang.compiler.sources.Sources; +import org.zwobble.sourcetext.SourcePosition; +import org.zwobble.sourcetext.SourceRange; +import org.zwobble.sourcetext.SourceText; + +import java.util.Optional; + +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class SourceToProtobufTests { + @Test + public void canSerializeNullSource() { + var source = Sources.NULL; + + var deserializedSource = SourceToProtobuf.deserializeSource( + SourceToProtobuf.serializeSource(source, Optional.empty()), + Optional.empty() + ); + + assertThat(deserializedSource, equalTo(source)); + } + + @Test + public void canSerializeRuntimeSource() { + var source = Sources.RUNTIME; + + var deserializedSource = SourceToProtobuf.deserializeSource( + SourceToProtobuf.serializeSource(source, Optional.empty()), + Optional.empty() + ); + + assertThat(deserializedSource, equalTo(source)); + } + + @Test + public void whenFileFragmentSourceHasNoParentThenSourceTextIsPreserved() { + var sourceText = SourceText.fromString("a/b", ""); + var source = new FileFragmentSource(new SourceRange( + sourceText, + new SourcePosition(sourceText, 2), + new SourcePosition(sourceText, 5) + )); + + var deserializedSource = SourceToProtobuf.deserializeSource( + SourceToProtobuf.serializeSource(source, Optional.empty()), + Optional.empty() + ); + + assertThat(deserializedSource.describe(), equalTo(source.describe())); + } + + @Test + public void whenFileFragmentSourceNoExplicitSourceTextThenSourceTextFromParentIsReused() { + var sourceText = SourceText.fromString("a/b", ""); + var sourceRange = new SourceRange( + sourceText, + new SourcePosition(sourceText, 2), + new SourcePosition(sourceText, 5) + ); + var source = new FileFragmentSource(sourceRange); + var parentSource = new FileFragmentSource(new SourceRange( + sourceText, + new SourcePosition(sourceText, 0), + new SourcePosition(sourceText, 10) + )); + + var deserializedSource = (FileFragmentSource) SourceToProtobuf.deserializeSource( + SourceToProtobuf.serializeSource(source, parentSource), + parentSource + ); + + assertThat(deserializedSource.describe(), equalTo(source.describe())); + assertThat(deserializedSource.sourceRange().sourceText() == sourceText, equalTo(true)); + } +} -- cgit v1.2.3