diff options
Diffstat (limited to 'src/test/java')
4 files changed, 67 insertions, 8 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerContextArb.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerContextArb.java index b917ba4..4959aa0 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerContextArb.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerContextArb.java @@ -1,10 +1,21 @@ package org.zwobble.hobgoblin.compiler.typechecker; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; + public class TypeCheckerContextArb { private TypeCheckerContextArb() { } - public static TypeCheckerContext context() { - return TypeCheckerContext.initial(); + public static TypeCheckerGlobalContext globalContext() { + return TypeCheckerGlobalContext.initial(); + } + + public static TypeCheckerNamespaceContext namespaceContext() { + return namespaceContext(NamespaceName.of("example")); + } + + public static TypeCheckerNamespaceContext namespaceContext(NamespaceName namespaceName) { + return TypeCheckerGlobalContext.initial() + .enterNamespace(namespaceName); } } diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java new file mode 100644 index 0000000..737c7db --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -0,0 +1,49 @@ +package org.zwobble.hobgoblin.compiler.typechecker; + +import org.junit.jupiter.api.Test; +import org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceNode; +import org.zwobble.hobgoblin.compiler.ast.typed.TypedStructDefinitionNode; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNamespaceNode; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStructDefinitionNode; +import org.zwobble.hobgoblin.compiler.sources.NullSource; +import org.zwobble.hobgoblin.compiler.types.NamespaceName; +import org.zwobble.hobgoblin.compiler.types.StructType; + +import java.util.List; + +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.*; + +public class TypeCheckerNamespaceTests { + @Test + public void namespaceStatementsAreTypeChecked() { + var untyped = new UntypedNamespaceNode( + NamespaceName.of("a", "b"), + List.of( + new UntypedStructDefinitionNode( + "X", + List.of(), + NullSource.INSTANCE + ) + ), + NullSource.INSTANCE + ); + var context = TypeCheckerContextArb.globalContext(); + + var typed = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat(typed, instanceOf( + TypedNamespaceNode.class, + has("body", TypedNamespaceNode::body, isSequence( + instanceOf( + TypedStructDefinitionNode.class, + has( + "type", + TypedStructDefinitionNode::type, + equalTo(new StructType(NamespaceName.of("a", "b"), "X")) + ) + ) + )) + )); + } +} diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java index 86f78ae..b6fddba 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java @@ -20,8 +20,7 @@ public class TypeCheckerStructDefinitionTests { List.of(), NullSource.INSTANCE ); - var context = TypeCheckerContextArb.context(); - context.enterNamespace(NamespaceName.of("a", "b")); + var context = TypeCheckerContextArb.namespaceContext(NamespaceName.of("a", "b")); var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java index 82704fc..76572a4 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java @@ -15,7 +15,7 @@ public class TypeCheckerTypeLevelReferenceTests { @Test public void whenNameIsUnrecognisedThenErrorIsThrown() { var untyped = UntypedArb.typeLevelReference("X"); - var context = TypeCheckerContextArb.context(); + var context = TypeCheckerContextArb.namespaceContext(); var error = assertThrows( UndeclaredVariableError.class, @@ -28,7 +28,7 @@ public class TypeCheckerTypeLevelReferenceTests { @Test public void whenNameIsUndefinedThenErrorIsThrown() { var untyped = UntypedArb.typeLevelReference("X"); - var context = TypeCheckerContextArb.context(); + var context = TypeCheckerContextArb.namespaceContext(); context.declare("X"); var error = assertThrows( @@ -42,7 +42,7 @@ public class TypeCheckerTypeLevelReferenceTests { @Test public void whenVariableIsNotTypeLevelValueThenErrorIsThrown() { var untyped = UntypedArb.typeLevelReference("X"); - var context = TypeCheckerContextArb.context(); + var context = TypeCheckerContextArb.namespaceContext(); context.declare("X"); var scalarType = new ScalarType("Int"); context.define("X", scalarType); @@ -59,7 +59,7 @@ public class TypeCheckerTypeLevelReferenceTests { @Test public void whenNameIsMetaTypeThenValueIsType() { var untyped = UntypedArb.typeLevelReference("X"); - var context = TypeCheckerContextArb.context(); + var context = TypeCheckerContextArb.namespaceContext(); context.declare("X"); var scalarType = new ScalarType("Int"); context.define("X", new TypeLevelValueType(scalarType)); |
