aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-07 18:47:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-07 18:47:55 +0100
commit88831fb3f83810cd234b0e871b02c4b9f539c1b8 (patch)
treea16d3a71e00ec9eda1ce235e5756fe3b093a87d8 /src/test/java
parent98e60278cd3e2dfffc4f5202de45518714d9402c (diff)
Type check integer subtraction
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java27
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java12
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java16
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));
+ }
}