summaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org/zwobble')
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerContextArb.java15
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java49
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java3
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java8
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));