aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-07 18:55:57 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-07 18:55:57 +0100
commitb019bf9cebdea64773836f74c5d7db7623d11b18 (patch)
treef64c3e0b51bd1998174d50cb1f1c9fd275efe19e /src/test/java
parentf0dd2aad3b947c447166b86481955a99e3baf86d (diff)
Check operand types for binary operation
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java
index d752fe94..e7721d1d 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java
@@ -2,8 +2,11 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.ast.untyped.UntypedBinaryOperator;
+import org.shedlang.compiler.typechecker.errors.UnsupportedBinaryOperationError;
import org.shedlang.compiler.types.Types;
+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;
@@ -61,4 +64,32 @@ public class TypeCheckerBinaryOperationTests {
));
assertThat(typed.value().type(), equalTo(Types.INT));
}
+
+ @Test
+ public void whenLeftOperandIsIntAndRightOperandIsNotIntThenExpressionFailsToTypeCheck() {
+ var untyped = Untyped.add(Untyped.stringLiteral("42"), Untyped.intLiteral(47));
+
+ var error = assertThrows(
+ UnsupportedBinaryOperationError.class,
+ () -> TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY)
+ );
+
+ assertThat(error.operator(), equalTo(UntypedBinaryOperator.ADD));
+ assertThat(error.left(), equalTo(Types.STRING));
+ assertThat(error.right(), equalTo(Types.INT));
+ }
+
+ @Test
+ public void whenLeftOperandIsNotIntAndRightOperandIsIntThenExpressionFailsToTypeCheck() {
+ var untyped = Untyped.add(Untyped.intLiteral(42), Untyped.stringLiteral("47"));
+
+ var error = assertThrows(
+ UnsupportedBinaryOperationError.class,
+ () -> TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY)
+ );
+
+ assertThat(error.operator(), equalTo(UntypedBinaryOperator.ADD));
+ assertThat(error.left(), equalTo(Types.INT));
+ assertThat(error.right(), equalTo(Types.STRING));
+ }
}