diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:47:55 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:47:55 +0100 |
| commit | 88831fb3f83810cd234b0e871b02c4b9f539c1b8 (patch) | |
| tree | a16d3a71e00ec9eda1ce235e5756fe3b093a87d8 /src/test/java | |
| parent | 98e60278cd3e2dfffc4f5202de45518714d9402c (diff) | |
Type check integer subtraction
Diffstat (limited to 'src/test/java')
3 files changed, 47 insertions, 8 deletions
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<TypedExpressionNode> isTypedBinaryOperationNode( + TypedBinaryOperator operator, + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> 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<TypedExpressionNode> isTypedBoolLiteralNode(boolean value) { return instanceOf( TypedBoolLiteralNode.class, @@ -44,12 +57,7 @@ public class TypedNodeMatchers { Matcher<TypedExpressionNode> left, Matcher<TypedExpressionNode> 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<TypedExpressionNode> isTypedIntLiteralNode(int value) { @@ -63,6 +71,13 @@ public class TypedNodeMatchers { ); } + public static Matcher<TypedExpressionNode> isTypedIntSubNode( + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_SUB, left, right); + } + public static Matcher<TypedNamedArgNode> isTypedNamedArgNode( String name, Matcher<TypedExpressionNode> 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)); + } } |
