package org.shedlang.compiler.parser; import org.junit.jupiter.api.Test; import org.shedlang.compiler.types.Visibility; import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.*; import static org.shedlang.compiler.parser.ParserTesting.parseString; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.isOptionalEmpty; import static org.zwobble.precisely.Matchers.isSequence; public class ParserNativeFunctionDeclarationTests { @Test public void canParseMinimalFunction() { var source = """ native fun f() -> Unit;"""; var node = parseString(source, Parser::parseNamespaceStatement); assertThat( node, isUntypedNativeFunctionDeclarationNode() .withName("f") .withSignature( isUntypedFunctionTypeNode() .withParams(isUntypedFunctionTypeParamsNode( isSequence(), isSequence() )) .withEffect(isOptionalEmpty()) .withReturnType(isUntypedTypeLevelReferenceNode("Unit")) ) ); } @Test public void defaultVisibilityIsPrivate() { var source = """ native fun f() -> Unit;"""; var node = parseString(source, Parser::parseNamespaceStatement); assertThat( node, isUntypedNativeFunctionDeclarationNode() .withVisibility(Visibility.PRIVATE) ); } @Test public void whenFunIsPrefixedWithPubThenVisibilityIsPublic() { var source = """ pub native fun f() -> Unit;"""; var node = parseString(source, Parser::parseNamespaceStatement); assertThat( node, isUntypedNativeFunctionDeclarationNode() .withVisibility(Visibility.PUBLIC) ); } }