diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 15:37:11 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 15:37:11 +0100 |
| commit | d195d95f685b6f161915b564b948a95888f40871 (patch) | |
| tree | 0ce35e22797331f61f83b51140f1c82e1cb68a85 /src/test/java | |
| parent | 07860b8ad33a87c6a95c53b63f2b15ae86574ed3 (diff) | |
Type check namespaces
Diffstat (limited to 'src/test/java')
3 files changed, 62 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index 474646d4..ebf1ef42 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -61,6 +61,12 @@ public class TypedNodeMatchers { ); } + public static Matcher<TypedNamespaceNode> isTypedNamespaceNode( + Matcher<Iterable<TypedNamespaceStatementNode>> body + ) { + return has("body", x -> x.body(), body); + } + public static Matcher<TypedParamNode> isTypedParamNode( String name, Matcher<TypedTypeLevelExpressionNode<?>> type diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java index ae15b5cc..0107348d 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -49,6 +49,10 @@ public class Untyped { return new UntypedNamedArgNode(name, expression, Sources.NULL); } + public static UntypedNamespaceNode namespace(List<UntypedNamespaceStatementNode> body) { + return new UntypedNamespaceNode(body, Sources.NULL); + } + public static UntypedReferenceNode reference(String name) { return new UntypedReferenceNode(name, Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java new file mode 100644 index 00000000..a0f69b89 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -0,0 +1,52 @@ +package org.shedlang.compiler.typechecker; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.untyped.Untyped; +import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode; +import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.util.P; + +import java.util.List; +import java.util.Map; + +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedFunctionDefinitionNode; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedNamespaceNode; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; + +public class TypeCheckerNamespaceTests { + @Test + public void canTypeCheckEmptyNamespace() { + var untyped = Untyped.namespace(List.of()); + var context = TypeCheckerContext.EMPTY + .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); + + var typed = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + typed, + isTypedNamespaceNode(isSequence()) + ); + } + + @Test + public void canTypeCheckMinimalFunctionDefinition() { + var untyped = Untyped.namespace(List.of( + UntypedFunctionDefinitionNode.builder() + .withName("f") + .withReturnType(Untyped.typeLevelReference("Unit")) + .build() + )); + var context = TypeCheckerContext.EMPTY + .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); + + var typed = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + typed, + isTypedNamespaceNode(isSequence( + isTypedFunctionDefinitionNode().withName("f") + )) + ); + } +} |
