From 1390becc9814e78f94fa01299b1b04acadfbfe46 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 1 Nov 2026 21:16:49 +0000 Subject: Check handling of non-type-level values --- .../TypeCheckerEvalExpressionTests.java | 28 ++++++++++++++++++---- .../typechecker/TypeCheckerMetaTypeTests.java | 2 +- .../TypeCheckerTypeLevelReferenceTests.java | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) (limited to 'src/test') diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java index 1c4d276..2d63eae 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEvalExpressionTests.java @@ -2,18 +2,18 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.junit.jupiter.api.Test; import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReferenceNode; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.sources.NullSource; -import org.zwobble.hobgoblin.compiler.types.DatabaseSchema; -import org.zwobble.hobgoblin.compiler.types.NamespaceName; -import org.zwobble.hobgoblin.compiler.types.Table; -import org.zwobble.hobgoblin.compiler.types.Types; +import org.zwobble.hobgoblin.compiler.typechecker.errors.UnexpectedTypeError; +import org.zwobble.hobgoblin.compiler.types.*; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; public class TypeCheckerEvalExpressionTests { @Test - public void canEvaluateReference() { + public void whenVariableIsTypeLevelValueThenCanEvaluateReference() { var untyped = UntypedReferenceNode.arbitrary() .withName("authors") .build(); @@ -28,4 +28,22 @@ public class TypeCheckerEvalExpressionTests { assertThat(typed, equalTo(table)); } + + @Test + public void whenVariableIsNotTypeLevelValueThenCannotEvaluateReference() { + var untyped = UntypedReferenceNode.arbitrary() + .withName("count") + .build(); + var globalContext = TypeCheckerContextArb.globalContext(); + var namespaceName = NamespaceName.of("App"); + var namespaceContext = globalContext.enterNamespace(namespaceName); + namespaceContext.declare("count", NativeTypes.INT_32, NullSource.INSTANCE); + + var error = assertThrows( + UnexpectedTypeError.class, + () -> TypeChecker.evalExpression(untyped, namespaceContext) + ); + + assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue())); + } } diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java index 074d1df..713cd13 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerMetaTypeTests.java @@ -27,7 +27,7 @@ public class TypeCheckerMetaTypeTests { () -> TypeChecker.typeCheckMetaType(untyped, context) ); - assertThat(error.expected(), equalTo(new TypeSet.MetaType())); + assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue())); assertThat(error.actual(), equalTo(nativeType)); } 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 084be46..98f4f22 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java @@ -40,7 +40,7 @@ public class TypeCheckerTypeLevelReferenceTests { () -> TypeChecker.typeCheckTypeLevelExpression(untyped, context) ); - assertThat(error.expected(), equalTo(new TypeSet.MetaType())); + assertThat(error.expected(), equalTo(new TypeSet.TypeLevelValue())); assertThat(error.actual(), equalTo(nativeType)); } -- cgit v1.2.3