aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-04 15:12:52 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-04 15:12:52 +0000
commit9993f60f036824c6c5c437591148b4cd8ef2dc50 (patch)
treecd47fc426ea6e5b27b2bde81d3be018b3c1d640f /src/test/java
parent92e60c08a8b3166fe0d3137a7b3ae20e6132b74f (diff)
Create effect type when type checking effect definition node
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedEffectDefinitionNodeMatcher.java42
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java5
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNodeMatcher.java1
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerEffectDefinitionTests.java65
4 files changed, 113 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedEffectDefinitionNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedEffectDefinitionNodeMatcher.java
new file mode 100644
index 00000000..4d008e6d
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedEffectDefinitionNodeMatcher.java
@@ -0,0 +1,42 @@
+package org.shedlang.compiler.ast.typed;
+
+import org.pcollections.PVector;
+import org.shedlang.compiler.testing.MatcherBuilder;
+import org.shedlang.compiler.types.UserDefinedEffect;
+import org.shedlang.compiler.util.P;
+import org.zwobble.precisely.Matcher;
+
+import static org.zwobble.precisely.Matchers.equalTo;
+import static org.zwobble.precisely.Matchers.has;
+
+public class TypedEffectDefinitionNodeMatcher extends MatcherBuilder<
+ TypedNamespaceStatementNode,
+ TypedEffectDefinitionNode,
+ TypedEffectDefinitionNodeMatcher
+> {
+ public static TypedEffectDefinitionNodeMatcher empty() {
+ return new TypedEffectDefinitionNodeMatcher(P.vector());
+ }
+
+ public TypedEffectDefinitionNodeMatcher(
+ PVector<Matcher<? super TypedEffectDefinitionNode>> submatchers
+ ) {
+ super(submatchers);
+ }
+
+ @Override
+ protected Class<TypedEffectDefinitionNode> expectedType() {
+ return TypedEffectDefinitionNode.class;
+ }
+
+ @Override
+ protected TypedEffectDefinitionNodeMatcher create(
+ PVector<Matcher<? super TypedEffectDefinitionNode>> submatchers
+ ) {
+ return new TypedEffectDefinitionNodeMatcher(submatchers);
+ }
+
+ public TypedEffectDefinitionNodeMatcher withEffect(UserDefinedEffect effect) {
+ return with(has("effect", x -> x.effect(), equalTo(effect)));
+ }
+}
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 a5a7456b..fafb4da6 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -82,6 +82,11 @@ public class TypedNodeMatchers {
);
}
+ public static TypedEffectDefinitionNodeMatcher isTypedEffectDefinitionNode() {
+ return TypedEffectDefinitionNodeMatcher.empty();
+ }
+
+
public static Matcher<TypedExpressionNode> isTypedExpressionNode(
Type type
) {
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNodeMatcher.java
index b80aff1d..46f0438f 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNodeMatcher.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedStructDefinitionNodeMatcher.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.ast.typed;
import org.pcollections.PVector;
import org.shedlang.compiler.testing.MatcherBuilder;
import org.shedlang.compiler.types.StructType;
+import org.shedlang.compiler.types.UserDefinedEffect;
import org.shedlang.compiler.util.P;
import org.zwobble.precisely.Matcher;
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerEffectDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerEffectDefinitionTests.java
new file mode 100644
index 00000000..60e9dfc2
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerEffectDefinitionTests.java
@@ -0,0 +1,65 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.untyped.UntypedEffectDefinitionNode;
+import org.shedlang.compiler.typechecker.errors.CannotDefineEffectOutsideOfNamespaceError;
+import org.shedlang.compiler.types.Effects;
+import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.Types;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedEffectDefinitionNode;
+import static org.shedlang.compiler.typechecker.TypeCheckerTesting.typeCheckNamespaceStatement;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+import static org.zwobble.precisely.Matchers.isOptionalOf;
+
+public class TypeCheckerEffectDefinitionTests {
+ private static final NamespaceName NAMESPACE_NAME = NamespaceName.of("Example");
+
+ @Test
+ public void whenOutsideOfNamespaceThenErrorIsThrown() {
+ var untyped = UntypedEffectDefinitionNode.builder()
+ .build();
+ var context = TypeCheckerContext.EMPTY;
+
+ assertThrows(
+ CannotDefineEffectOutsideOfNamespaceError.class,
+ () -> TypeChecker.typeCheckStepsNamespaceStatement(untyped).typeCheckAllPhases(context)
+ );
+ }
+
+ @Test
+ public void typeIsAddedToEnvironment() {
+ var untyped = UntypedEffectDefinitionNode.builder()
+ .withName("ExampleEffect")
+ .build();
+ var context = TypeCheckerContext.EMPTY;
+
+ var typed = typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed.context().compileTimeLookup("ExampleEffect"),
+ isOptionalOf(equalTo(Variable.defined(
+ Types.effectType(Effects.userDefined(NAMESPACE_NAME, "ExampleEffect")),
+ VariableType.CONSTANT
+ )))
+ );
+ }
+
+ @Test
+ public void typedNodeHasEffect() {
+ var untyped = UntypedEffectDefinitionNode.builder()
+ .withName("ExampleEffect")
+ .build();
+ var context = TypeCheckerContext.EMPTY;
+
+ var typed = typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed.value(),
+ isTypedEffectDefinitionNode()
+ .withEffect(Effects.userDefined(NAMESPACE_NAME, "ExampleEffect"))
+ );
+ }
+}