aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-24 21:17:39 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-24 21:17:39 +0100
commitb18304ac527691bb778ca467cfef17805a4d85a7 (patch)
tree5869f822e8e2280bd67a5e59f98cf4acb2c204fd /src/test/java
parent0dccc0cdf7813c3c5571a79186a73bfd239a66d6 (diff)
Type check return type of function type
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java9
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java39
2 files changed, 48 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 c5a27329..112b2f02 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -125,6 +125,15 @@ public class TypedNodeMatchers {
);
}
+ public static Matcher<TypedTypeLevelExpressionNode<?>> isTypedFunctionTypeNode(
+ Matcher<FunctionType> value
+ ) {
+ return instanceOf(
+ TypedFunctionTypeNode.class,
+ has("value", x -> x.value(), value)
+ );
+ }
+
public static Matcher<TypedExpressionNode> isTypedIfNode(
Matcher<Iterable<? extends TypedConditionalBranchNode>> conditionalBranches,
Matcher<TypedBlockNode> elseBody
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java
new file mode 100644
index 00000000..608e3caf
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java
@@ -0,0 +1,39 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.ast.untyped.UntypedFunctionTypeNode;
+import org.shedlang.compiler.typechecker.typesets.TypeSets;
+import org.shedlang.compiler.types.FunctionType;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.util.Map;
+
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedFunctionTypeNode;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class TypeCheckerFunctionTypeTests {
+ @Test
+ public void returnTypeIsTypeChecked() {
+ var untyped = UntypedFunctionTypeNode.builder()
+ .withReturnType(Untyped.typeLevelReference("String"))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("String", Types.metaType(Types.STRING))
+ ));
+
+ var typed = TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionTypeNode(equalTo(
+ FunctionType.builder()
+ .withReturnType(Types.STRING)
+ .build()
+ ))
+ );
+ }
+}