diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-09 11:50:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-09 11:50:57 +0100 |
| commit | 1259efb6a83148827445849232dc34e9342c1f96 (patch) | |
| tree | dd5e819bed64f72d304291a843de3adf0dd8f1fc /src/test/java | |
| parent | cf52b6e8a2ebf85b4be8b9065a755f3481eb43db (diff) | |
Check function returns correct type
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java index 25b9c158..7bb490a8 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java @@ -222,6 +222,38 @@ public class TypeCheckerFunctionDefinitionTests { } @Test + public void givenReturnTypeIsUnitWhenBodyHasNoReturnThenFunctionTypeChecks() { + var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnType(Untyped.typeLevelReference("Unit")) + .build(); + var context = TypeCheckerContext.EMPTY + .enterNamespaceWithDefinedVariables(P.map( + Map.entry("Unit", Types.metaType(Types.UNIT)) + )); + + TypeChecker.typeCheckNamespaceStatement(untyped, context); + } + + @Test + public void givenReturnTypeIsNotUnitWhenBodyHasNoReturnThenFunctionFailsTypeCheck() { + var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnType(Untyped.typeLevelReference("String")) + .build(); + var context = TypeCheckerContext.EMPTY + .enterNamespaceWithDefinedVariables(P.map( + Map.entry("String", Types.metaType(Types.STRING)) + )); + + var error = assertThrows( + UnexpectedTypeError.class, + () -> TypeChecker.typeCheckNamespaceStatement(untyped, context) + ); + + assertThat(error.expected(), equalTo(TypeSets.type(Types.STRING))); + assertThat(error.actual(), equalTo(Types.UNIT)); + } + + @Test public void freeVariablesIncludeVariablesReferencedInFunctionButDefinedOutsideOfFunction() { var untyped = UntypedFunctionDefinitionNode.builder() .withReturnType(Untyped.typeLevelReference("Unit")) |
