diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-04 15:12:52 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-04 15:12:52 +0000 |
| commit | 9993f60f036824c6c5c437591148b4cd8ef2dc50 (patch) | |
| tree | cd47fc426ea6e5b27b2bde81d3be018b3c1d640f /src/test/java | |
| parent | 92e60c08a8b3166fe0d3137a7b3ae20e6132b74f (diff) | |
Create effect type when type checking effect definition node
Diffstat (limited to 'src/test/java')
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")) + ); + } +} |
