package org.shedlang.compiler.shid; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.TypedNativeFunctionDeclarationNode; import org.shedlang.compiler.shid.instructions.ShidDeclareNativeFunction; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.FunctionType; import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; import java.util.List; 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.*; public class ShidCodeGenNativeFunctionDeclarationTests { @Test public void nativeFunctionIsCompiledToDeclareNativeFunctionInstruction() { var node = TypedNativeFunctionDeclarationNode.builder() .withName("f") .withSignature( FunctionType.builder() .addPositionalParam(Types.INT) .addPositionalParam(Types.INT) .addNamedParam("n1", Types.INT) .addNamedParam("n2", Types.INT) .build() ) .build(); var context = ShidCodeGen.Context.EMPTY .enterBlock( NamespaceName.of("Example", "Project"), List.of(), Sources.NULL ) .addShedVal("f"); var result = ShidCodeGen.compileNamespaceStatement(node, context); assertThat(result.instructions(), isSequence( instanceOf( ShidDeclareNativeFunction.class, has("namespaceName", x -> x.namespaceName(), equalTo(NamespaceName.of("Example", "Project"))), has("name", x -> x.name(), equalTo("f")), has("positionalParams", x -> x.positionalParams(), isSequence( isShidDefineFunctionParam("arg0"), isShidDefineFunctionParam("arg1") )), has("namedParams", x -> x.namedParams(), isSequence( isShidDefineFunctionParam("n1"), isShidDefineFunctionParam("n2") )) ), isShidLocalStore("f__0") )); } }