aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-07 18:43:53 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-07 18:43:53 +0100
commit98e60278cd3e2dfffc4f5202de45518714d9402c (patch)
tree5fd48799b6a45ee29d0dcb684432d90763cd4021 /src/test/java
parent616f475a4cf4c3296028c1fe89e17e0105898f3c (diff)
Type check integer addition
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java12
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java12
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java25
3 files changed, 49 insertions, 0 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 4143a91a..69acee24 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -40,6 +40,18 @@ public class TypedNodeMatchers {
return TypedFunctionDefinitionNodeMatcher.empty();
}
+ public static Matcher<TypedExpressionNode> isTypedIntAddNode(
+ 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)
+ );
+ }
+
public static Matcher<TypedExpressionNode> isTypedIntLiteralNode(int value) {
return isTypedIntLiteralNode(BigInteger.valueOf(value));
}
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 ed78e1d4..a5a61303 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
@@ -10,6 +10,18 @@ public class Untyped {
private Untyped() {
}
+ public static UntypedBinaryOperationNode add(
+ UntypedExpressionNode left,
+ UntypedExpressionNode right
+ ) {
+ return new UntypedBinaryOperationNode(
+ UntypedBinaryOperator.ADD,
+ left,
+ right,
+ Sources.NULL
+ );
+ }
+
public static UntypedBoolLiteralNode boolLiteral(boolean value) {
return new UntypedBoolLiteralNode(value, Sources.NULL);
}
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java
new file mode 100644
index 00000000..017c2d97
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java
@@ -0,0 +1,25 @@
+package org.shedlang.compiler.typechecker;
+
+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.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class TypeCheckerBinaryOperationTests {
+ @Test
+ public void whenBothOperandsAreIntsAndOperatorIsAddThenIsTypedAsIntAdd() {
+ var untyped = Untyped.add(Untyped.intLiteral(42), Untyped.intLiteral(47));
+
+ var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY);
+
+ assertThat(typed.value(), isTypedIntAddNode(
+ isTypedIntLiteralNode(42),
+ isTypedIntLiteralNode(47)
+ ));
+ assertThat(typed.value().type(), equalTo(Types.INT));
+ }
+}