diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-30 17:41:04 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-30 17:41:04 +0100 |
| commit | a1806b32dc21709d81e2378923910b100145cf90 (patch) | |
| tree | 4dbcfd48351cecd64d29712219ff516c204b9266 /src/test/java | |
| parent | ce8dfcfecd0937fbf2f4d5b941517f3750f29af2 (diff) | |
Construct typed node for sum type definitions
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java | 10 | ||||
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java | 26 |
2 files changed, 36 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 7bd1402d..1f64f631 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.ast.typed; +import org.shedlang.compiler.types.SumType; import org.shedlang.compiler.types.TupleType; import org.shedlang.compiler.types.Type; import org.shedlang.compiler.types.TypeLevelValue; @@ -251,6 +252,15 @@ public class TypedNodeMatchers { return TypedStructFieldDefinitionNodeMatcher.empty(); } + public static Matcher<TypedNamespaceStatementNode> isTypedSumTypeDefinitionNode( + SumType type + ) { + return instanceOf( + TypedSumTypeDefinitionNode.class, + has("type", x -> x.type(), equalTo(type)) + ); + } + public static Matcher<TypedTargetNode> isTypedTargetIgnore() { return instanceOf(TypedTargetNode.Ignore.class); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java index 167a2477..0a551c95 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.TypedNamespaceStatementNode; +import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedNamespaceStatementNode; import org.shedlang.compiler.ast.untyped.UntypedSumTypeDefinitionNode; import org.shedlang.compiler.typechecker.errors.CannotDefineSumTypeOutsideOfNamespace; @@ -9,7 +10,10 @@ 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.junit.jupiter.api.Assertions.assertThrows; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedSumTypeDefinitionNode; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; import static org.zwobble.precisely.Matchers.isOptionalOf; @@ -48,6 +52,28 @@ public class TypeCheckerSumTypeDefinitionTests { ); } + @Test + public void canTypeCheckSumTypeWithVariantsInSameNamespace() { + var untyped = UntypedSumTypeDefinitionNode.builder() + .withName("ExampleSumType") + .addVariant(Untyped.typeLevelReference("A")) + .addVariant(Untyped.typeLevelReference("A")) + .build(); + var variantType1 = Types.struct(NAMESPACE_NAME, "A"); + var variantType2 = Types.struct(NAMESPACE_NAME, "B"); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map( + Map.entry("A", Types.metaType(variantType1)), + Map.entry("B", Types.metaType(variantType2)) + )); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat(typed.value(), isTypedSumTypeDefinitionNode( + Types.sum(NAMESPACE_NAME, "ExampleSumType") + )); + } + private static TypeCheckerResult<? extends TypedNamespaceStatementNode> typeCheckNamespaceStatement( UntypedNamespaceStatementNode untyped, TypeCheckerContext context |
