aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 16:17:46 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 16:17:46 +0000
commitc240d003f4256713dad982f91beaf47b862ce5ad (patch)
tree88f0aca6295f8d533011c4ffc28604998c8253d6 /src/test/java
parent38f3a0a74a6f6b8dd4a3341d76a4e3db7872e084 (diff)
Type check body of try node
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java4
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedTryNodeMatcher.java40
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java43
3 files changed, 87 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 fafb4da6..ec392e5c 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -315,6 +315,10 @@ public class TypedNodeMatchers {
);
}
+ public static TypedTryNodeMatcher isTypedTryNode() {
+ return TypedTryNodeMatcher.empty();
+ }
+
public static Matcher<TypedExpressionNode> isTypedTupleNode(
Matcher<Iterable<? extends TypedExpressionNode>> elements
) {
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedTryNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedTryNodeMatcher.java
new file mode 100644
index 00000000..b6a124b9
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedTryNodeMatcher.java
@@ -0,0 +1,40 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.pcollections.PVector;
+import org.shedlang.compiler.testing.MatcherBuilder;
+import org.shedlang.compiler.util.P;
+import org.zwobble.precisely.Matcher;
+
+import static org.zwobble.precisely.Matchers.has;
+
+public class TypedTryNodeMatcher extends MatcherBuilder<
+ TypedExpressionNode,
+ TypedTryNode,
+ TypedTryNodeMatcher
+> {
+ public static TypedTryNodeMatcher empty() {
+ return new TypedTryNodeMatcher(P.vector());
+ }
+
+ public TypedTryNodeMatcher(PVector<Matcher<? super TypedTryNode>> submatchers) {
+ super(submatchers);
+ }
+
+ @Override
+ protected Class<TypedTryNode> expectedType() {
+ return TypedTryNode.class;
+ }
+
+ @Override
+ protected TypedTryNodeMatcher create(
+ PVector<Matcher<? super TypedTryNode>> submatchers
+ ) {
+ return new TypedTryNodeMatcher(submatchers);
+ }
+
+ public TypedTryNodeMatcher withBody(
+ Matcher<TypedBlockNode> body
+ ) {
+ return with(has("body", x -> x.body(), body));
+ }
+}
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
new file mode 100644
index 00000000..32808834
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
@@ -0,0 +1,43 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.ast.untyped.UntypedTryNode;
+import org.shedlang.compiler.types.Effects;
+import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.util.Map;
+
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*;
+import static org.shedlang.compiler.typechecker.TypeCheckerTesting.typeCheckExpression;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class TypeCheckerTryTests {
+ private static final NamespaceName NAMESPACE_NAME = NamespaceName.of("Example");
+
+ @Test
+ public void bodyIsTypeChecked() {
+ var untyped = UntypedTryNode.builder()
+ .addBodyStatement(Untyped.expressionStatement(Untyped.intLiteral(42)))
+ .withHandledEffect(Untyped.typeLevelReference("Empty"))
+ .build();
+ var effect = Effects.userDefined(NAMESPACE_NAME, "Empty");
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("Empty", Types.effectType(effect))
+ ));
+
+ var result = typeCheckExpression(untyped, context);
+
+ assertThat(
+ result.value(),
+ isTypedTryNode()
+ .withBody(isTypedBlockNode(isSequence(
+ isTypedExpressionStatementNode(isTypedIntLiteralNode(42))
+ )))
+ );
+ }
+}