From 88831fb3f83810cd234b0e871b02c4b9f539c1b8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 7 Jul 2023 18:47:55 +0100 Subject: Type check integer subtraction --- .../compiler/ast/typed/TypedNodeMatchers.java | 27 +++++++++++++++++----- .../org/shedlang/compiler/ast/untyped/Untyped.java | 12 ++++++++++ .../TypeCheckerBinaryOperationTests.java | 16 +++++++++++-- 3 files changed, 47 insertions(+), 8 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index 69acee24..22da82bf 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -16,6 +16,19 @@ public class TypedNodeMatchers { return TypedArgsNodeMatcher.empty(); } + public static Matcher isTypedBinaryOperationNode( + TypedBinaryOperator operator, + Matcher left, + Matcher right + ) { + return instanceOf( + TypedBinaryOperationNode.class, + has("operator", x -> x.operator(), equalTo(operator)), + has("left", x -> x.left(), left), + has("right", x -> x.right(), right) + ); + } + public static Matcher isTypedBoolLiteralNode(boolean value) { return instanceOf( TypedBoolLiteralNode.class, @@ -44,12 +57,7 @@ public class TypedNodeMatchers { Matcher left, Matcher right ) { - return instanceOf( - TypedBinaryOperationNode.class, - has("operator", x -> x.operator(), equalTo(TypedBinaryOperator.INT_ADD)), - has("left", x -> x.left(), left), - has("right", x -> x.right(), right) - ); + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_ADD, left, right); } public static Matcher isTypedIntLiteralNode(int value) { @@ -63,6 +71,13 @@ public class TypedNodeMatchers { ); } + public static Matcher isTypedIntSubNode( + Matcher left, + Matcher right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_SUB, left, right); + } + public static Matcher isTypedNamedArgNode( String name, Matcher expression diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java index a5a61303..b0cce55e 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -85,6 +85,18 @@ public class Untyped { return new UntypedStringLiteralNode(value, Sources.NULL); } + public static UntypedBinaryOperationNode sub( + UntypedExpressionNode left, + UntypedExpressionNode right + ) { + return new UntypedBinaryOperationNode( + UntypedBinaryOperator.SUB, + left, + right, + Sources.NULL + ); + } + public static UntypedTargetNode targetVariable(String name) { return new UntypedTargetNode.Variable(name, Sources.NULL); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java index 017c2d97..98dd8679 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java @@ -4,8 +4,7 @@ import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.types.Types; -import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedIntAddNode; -import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedIntLiteralNode; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; @@ -22,4 +21,17 @@ public class TypeCheckerBinaryOperationTests { )); assertThat(typed.value().type(), equalTo(Types.INT)); } + + @Test + public void whenBothOperandsAreIntsAndOperatorIsSubThenIsTypedAsIntSub() { + var untyped = Untyped.sub(Untyped.intLiteral(42), Untyped.intLiteral(47)); + + var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedIntSubNode( + isTypedIntLiteralNode(42), + isTypedIntLiteralNode(47) + )); + assertThat(typed.value().type(), equalTo(Types.INT)); + } } -- cgit v1.2.3