From 436f43fa2667c77ef8a7d05bb5b8001c17c7822b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 17 Jan 2025 23:32:18 +0000 Subject: Add support for native functions --- .../shedlang/compiler/backends/ExampleConfig.java | 3 ++ .../shedlang/compiler/backends/ExampleTests.java | 5 +-- .../ShidCodeGenNativeFunctionDeclarationTests.java | 16 ++++++++- .../compiler/shid/ShidSerializerTests.java | 6 ++++ .../ShidToPatioDeclareNativeFunctionTests.java | 40 ++++++++++++++++++++++ 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/shidtopatio/ShidToPatioDeclareNativeFunctionTests.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/ExampleConfig.java b/src/test/java/org/shedlang/compiler/backends/ExampleConfig.java index e8e63f40..ef46fb60 100644 --- a/src/test/java/org/shedlang/compiler/backends/ExampleConfig.java +++ b/src/test/java/org/shedlang/compiler/backends/ExampleConfig.java @@ -5,10 +5,12 @@ import org.zwobble.json5.values.Json5String; import java.nio.file.Path; import java.util.Optional; +import java.util.OptionalLong; public record ExampleConfig( Path projectPath, String bin, + OptionalLong expectedExitCode, Optional expectedOutput, Optional expectedError ) { @@ -19,6 +21,7 @@ public record ExampleConfig( return new ExampleConfig( root.resolve(object.getString("project").value()), object.getString("bin").value(), + object.getLongOrNone("expectedExitCode"), object.getStringOrNone("expectedOutput").map(Json5String::value), object.getStringOrNone("expectedError").map(Json5String::value) ); diff --git a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java index d8607d47..03ff3065 100644 --- a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java +++ b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java @@ -63,8 +63,9 @@ public abstract class ExampleTests { .resolve(ProfileConfig.DEFAULT.name()) .resolve(example.bin()) .toString(); - var result = runExampleBinary(binPath).throwOnError(); - assertThat(result.stdout(), equalTo(example.expectedOutput().orElseThrow())); + var result = runExampleBinary(binPath); + assertThat(result.exitCode(), equalTo((int)example.expectedExitCode().orElse(0))); + assertThat(result.stdout(), equalTo(example.expectedOutput().orElse(""))); } if (isWipTest) { diff --git a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenNativeFunctionDeclarationTests.java b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenNativeFunctionDeclarationTests.java index b47a9464..03948076 100644 --- a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenNativeFunctionDeclarationTests.java +++ b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenNativeFunctionDeclarationTests.java @@ -7,7 +7,9 @@ import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.NamespaceName; import java.util.List; +import java.util.Optional; +import static org.shedlang.compiler.shid.instructions.ShidMatchers.isShidDefineFunctionParam; import static org.shedlang.compiler.shid.instructions.ShidMatchers.isShidLocalStore; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; @@ -17,6 +19,10 @@ public class ShidCodeGenNativeFunctionDeclarationTests { public void nativeFunctionIsCompiledToDeclareNativeFunctionInstruction() { var node = TypedNativeFunctionDeclarationNode.builder() .withName("f") + .addPositionalParam("p1", Optional.empty()) + .addPositionalParam("p2", Optional.empty()) + .addNamedParam("n1", Optional.empty()) + .addNamedParam("n2", Optional.empty()) .build(); var context = ShidCodeGen.Context.EMPTY .enterBlock( @@ -32,7 +38,15 @@ public class ShidCodeGenNativeFunctionDeclarationTests { instanceOf( ShidDeclareNativeFunction.class, has("namespaceName", x -> x.namespaceName(), equalTo(NamespaceName.of("Example", "Project"))), - has("name", x -> x.name(), equalTo("f")) + has("name", x -> x.name(), equalTo("f")), + has("positionalParams", x -> x.positionalParams(), isSequence( + isShidDefineFunctionParam("p1"), + isShidDefineFunctionParam("p2") + )), + has("namedParams", x -> x.namedParams(), isSequence( + isShidDefineFunctionParam("n1"), + isShidDefineFunctionParam("n2") + )) ), isShidLocalStore("f__0") )); diff --git a/src/test/java/org/shedlang/compiler/shid/ShidSerializerTests.java b/src/test/java/org/shedlang/compiler/shid/ShidSerializerTests.java index ec448200..115cd597 100644 --- a/src/test/java/org/shedlang/compiler/shid/ShidSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/shid/ShidSerializerTests.java @@ -47,6 +47,10 @@ public class ShidSerializerTests { var instruction = ShidDeclareNativeFunction.builder() .withNamespaceName(NamespaceName.of("Example", "Project")) .withName("f") + .addPositionalParam("p1") + .addPositionalParam("p2") + .addNamedParam("n1") + .addNamedParam("n2") .build(); var string = serialize(instruction); @@ -56,6 +60,8 @@ public class ShidSerializerTests { declare-native-function namespace-name="Example/Project" name="f" + positional-params=("p1" "p2") + named-params=("n1" "n2") )""")); } diff --git a/src/test/java/org/shedlang/compiler/shidtopatio/ShidToPatioDeclareNativeFunctionTests.java b/src/test/java/org/shedlang/compiler/shidtopatio/ShidToPatioDeclareNativeFunctionTests.java new file mode 100644 index 00000000..c4f7cc47 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/shidtopatio/ShidToPatioDeclareNativeFunctionTests.java @@ -0,0 +1,40 @@ +package org.shedlang.compiler.shidtopatio; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.shid.instructions.ShidDeclareNativeFunction; +import org.shedlang.compiler.shid.instructions.ShidParam; +import org.shedlang.compiler.sources.Sources; +import org.shedlang.compiler.testing.snapshots.SnapshotResolver; +import org.shedlang.compiler.testing.snapshots.Snapshotter; +import org.shedlang.compiler.types.NamespaceName; + +import java.io.IOException; +import java.util.List; + +import static org.shedlang.compiler.shidtopatio.ShidToPatioTesting.serialize; + +@ExtendWith({SnapshotResolver.class}) +public class ShidToPatioDeclareNativeFunctionTests { + @Test + public void canDeclareNativeFunction(Snapshotter snapshotter) throws IOException { + var instruction = new ShidDeclareNativeFunction( + NamespaceName.of("Example", "Project"), + "f", + List.of( + new ShidParam("p1", Sources.NULL), + new ShidParam("p2", Sources.NULL) + ), + List.of( + new ShidParam("n1", Sources.NULL), + new ShidParam("n2", Sources.NULL) + ), + Sources.NULL + ); + var context = ShidToPatioContext.EMPTY; + + var result = ShidToPatio.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(serialize(result)); + } +} -- cgit v1.2.3