diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:55:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-07 18:55:57 +0100 |
| commit | b019bf9cebdea64773836f74c5d7db7623d11b18 (patch) | |
| tree | f64c3e0b51bd1998174d50cb1f1c9fd275efe19e /src/test/java | |
| parent | f0dd2aad3b947c447166b86481955a99e3baf86d (diff) | |
Check operand types for binary operation
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java | 31 |
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)); + } } |
