aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-30 17:41:04 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-30 17:41:04 +0100
commita1806b32dc21709d81e2378923910b100145cf90 (patch)
tree4dbcfd48351cecd64d29712219ff516c204b9266 /src/test/java
parentce8dfcfecd0937fbf2f4d5b941517f3750f29af2 (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.java10
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java26
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