From 6ad809b7d353b9e92625a3ca9b552d3ebe8cf04d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Dec 2023 23:49:26 +0000 Subject: Clarify test name --- .../TypeCheckerFunctionResumeTests.java | 116 --------------------- .../typechecker/TypeCheckerResumeTests.java | 116 +++++++++++++++++++++ 2 files changed, 116 insertions(+), 116 deletions(-) delete mode 100644 src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionResumeTests.java create mode 100644 src/test/java/org/shedlang/compiler/typechecker/TypeCheckerResumeTests.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionResumeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionResumeTests.java deleted file mode 100644 index 7d28109d..00000000 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionResumeTests.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.shedlang.compiler.typechecker; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.ast.untyped.Untyped; -import org.shedlang.compiler.ast.untyped.UntypedFunctionExpressionNode; -import org.shedlang.compiler.typechecker.errors.CannotResumeOutsideOfEffectHandlerMethodError; -import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError; -import org.shedlang.compiler.typechecker.typesets.TypeSets; -import org.shedlang.compiler.types.Effects; -import org.shedlang.compiler.types.FunctionType; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.Types; -import org.shedlang.compiler.util.P; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.equalTo; - -public class TypeCheckerFunctionResumeTests { - @Test - public void expressionIsTypeChecked() { - var untyped = Untyped.resume(Untyped.stringLiteral("hello")); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.STRING)); - - var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); - - assertThat(typed.value(), isTypedResumeNode(isTypedStringLiteralNode("hello"))); - } - - @Test - public void whenExpressionIsAbsentThenUnitIsReturned() { - var untyped = Untyped.resume(); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.UNIT)); - - var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); - - assertThat(typed.value(), isTypedResumeNode(isTypedUnitLiteralNode())); - } - - @Test - public void whenNotInFunctionThenResumeIsForbidden() { - var untyped = Untyped.resume(Untyped.stringLiteral("hello")); - var context = TypeCheckerContext.EMPTY - .enterNamespace(NamespaceName.of("Example"), P.map()); - - assertThrows( - CannotResumeOutsideOfEffectHandlerMethodError.class, - () -> TypeChecker.typeCheckFunctionStatement(untyped, context) - ); - } - - @Test - public void whenInFunctionThenResumeIsForbidden() { - var untyped = Untyped.resume(Untyped.stringLiteral("hello")); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.explicit(Types.STRING)); - - assertThrows( - CannotResumeOutsideOfEffectHandlerMethodError.class, - () -> TypeChecker.typeCheckFunctionStatement(untyped, context) - ); - } - - @Test - public void canResumeWIthSubtypeOfResumeType() { - var untyped = Untyped.resume(Untyped.stringLiteral("hello")); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.TOP)); - - var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); - - assertThat(typed.value(), isTypedResumeNode(isTypedStringLiteralNode("hello"))); - } - - @Test - public void cannotResumeWithNonSubtypeOfResumeType() { - var untyped = Untyped.resume(Untyped.stringLiteral("hello")); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.INT)); - - var error = assertThrows( - UnexpectedTypeError.class, - () -> TypeChecker.typeCheckFunctionStatement(untyped, context) - ); - - assertThat(error.expected(), equalTo(TypeSets.type(Types.INT))); - assertThat(error.actual(), equalTo(Types.STRING)); - } - - @Test - public void resumeTypeIsUsedAsTypeHintForExpression() { - var untyped = Untyped.resume( - UntypedFunctionExpressionNode.builder() - .addPositionalParam("x", Optional.empty()) - .withoutReturnType() - .build() - ); - var resumeType = FunctionType.builder() - .addPositionalParam(Types.STRING) - .withReturnType(Types.UNIT) - .build(); - var context = TypeCheckerContext.EMPTY - .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(resumeType)); - - var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); - - assertThat(typed.value(), isTypedResumeNode( - isTypedFunctionExpressionNode().withType(resumeType) - )); - } -} diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerResumeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerResumeTests.java new file mode 100644 index 00000000..f0f18839 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerResumeTests.java @@ -0,0 +1,116 @@ +package org.shedlang.compiler.typechecker; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.ast.untyped.Untyped; +import org.shedlang.compiler.ast.untyped.UntypedFunctionExpressionNode; +import org.shedlang.compiler.typechecker.errors.CannotResumeOutsideOfEffectHandlerMethodError; +import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError; +import org.shedlang.compiler.typechecker.typesets.TypeSets; +import org.shedlang.compiler.types.Effects; +import org.shedlang.compiler.types.FunctionType; +import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.util.P; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class TypeCheckerResumeTests { + @Test + public void expressionIsTypeChecked() { + var untyped = Untyped.resume(Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.STRING)); + + var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); + + assertThat(typed.value(), isTypedResumeNode(isTypedStringLiteralNode("hello"))); + } + + @Test + public void whenExpressionIsAbsentThenUnitIsReturned() { + var untyped = Untyped.resume(); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.UNIT)); + + var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); + + assertThat(typed.value(), isTypedResumeNode(isTypedUnitLiteralNode())); + } + + @Test + public void whenNotInFunctionThenResumeIsForbidden() { + var untyped = Untyped.resume(Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterNamespace(NamespaceName.of("Example"), P.map()); + + assertThrows( + CannotResumeOutsideOfEffectHandlerMethodError.class, + () -> TypeChecker.typeCheckFunctionStatement(untyped, context) + ); + } + + @Test + public void whenInFunctionThenResumeIsForbidden() { + var untyped = Untyped.resume(Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.explicit(Types.STRING)); + + assertThrows( + CannotResumeOutsideOfEffectHandlerMethodError.class, + () -> TypeChecker.typeCheckFunctionStatement(untyped, context) + ); + } + + @Test + public void canResumeWIthSubtypeOfResumeType() { + var untyped = Untyped.resume(Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.TOP)); + + var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); + + assertThat(typed.value(), isTypedResumeNode(isTypedStringLiteralNode("hello"))); + } + + @Test + public void cannotResumeWithNonSubtypeOfResumeType() { + var untyped = Untyped.resume(Untyped.stringLiteral("hello")); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(Types.INT)); + + var error = assertThrows( + UnexpectedTypeError.class, + () -> TypeChecker.typeCheckFunctionStatement(untyped, context) + ); + + assertThat(error.expected(), equalTo(TypeSets.type(Types.INT))); + assertThat(error.actual(), equalTo(Types.STRING)); + } + + @Test + public void resumeTypeIsUsedAsTypeHintForExpression() { + var untyped = Untyped.resume( + UntypedFunctionExpressionNode.builder() + .addPositionalParam("x", Optional.empty()) + .withoutReturnType() + .build() + ); + var resumeType = FunctionType.builder() + .addPositionalParam(Types.STRING) + .withReturnType(Types.UNIT) + .build(); + var context = TypeCheckerContext.EMPTY + .enterFunction(P.map(), Effects.NONE, ReturnTypeState.effectHandler(resumeType)); + + var typed = TypeChecker.typeCheckFunctionStatement(untyped, context); + + assertThat(typed.value(), isTypedResumeNode( + isTypedFunctionExpressionNode().withType(resumeType) + )); + } +} -- cgit v1.2.3