aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:37:11 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:37:11 +0100
commitd195d95f685b6f161915b564b948a95888f40871 (patch)
tree0ce35e22797331f61f83b51140f1c82e1cb68a85 /src/test/java
parent07860b8ad33a87c6a95c53b63f2b15ae86574ed3 (diff)
Type check namespaces
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java6
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java52
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")
+ ))
+ );
+ }
+}