diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-02-02 18:48:30 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-02-02 18:48:30 +0000 |
| commit | 037fd3fee47b0fd94e8f7a3cff25ab7578a6e5da (patch) | |
| tree | 22db67ddf944e565d778b32c291125f8b53ea72d /src/test/java | |
| parent | 1d41ef64406e575caf012f8a50febc15805bafca (diff) | |
Type check relational operations for integers
Diffstat (limited to 'src/test/java')
3 files changed, 128 insertions, 1 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 902ba59d..6f8ffdb1 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -205,6 +205,34 @@ public class TypedNodeMatchers { return isTypedBinaryOperationNode(TypedBinaryOperator.INT_EQUALS, left, right); } + public static Matcher<TypedExpressionNode> isTypedIntGreaterThanNode( + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_GREATER_THAN, left, right); + } + + public static Matcher<TypedExpressionNode> isTypedIntGreaterThanOrEqualNode( + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_GREATER_THAN_OR_EQUAL, left, right); + } + + public static Matcher<TypedExpressionNode> isTypedIntLessThanNode( + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_LESS_THAN, left, right); + } + + public static Matcher<TypedExpressionNode> isTypedIntLessThanOrEqualNode( + Matcher<TypedExpressionNode> left, + Matcher<TypedExpressionNode> right + ) { + return isTypedBinaryOperationNode(TypedBinaryOperator.INT_LESS_THAN_OR_EQUAL, left, 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 58b061cb..0ecf4719 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -116,6 +116,30 @@ public class Untyped { return new UntypedFunctionReturnNode(expression, Sources.NULL); } + public static UntypedExpressionNode greaterThan( + UntypedExpressionNode left, + UntypedExpressionNode right + ) { + return new UntypedBinaryOperationNode( + UntypedBinaryOperator.GREATER_THAN, + left, + right, + Sources.NULL + ); + } + + public static UntypedExpressionNode greaterThanOrEqual( + UntypedExpressionNode left, + UntypedExpressionNode right + ) { + return new UntypedBinaryOperationNode( + UntypedBinaryOperator.GREATER_THAN_OR_EQUAL, + left, + right, + Sources.NULL + ); + } + public static UntypedIfNode if_( List<UntypedConditionalBranchNode> conditionalBranches, UntypedBlockNode elseBody @@ -135,6 +159,30 @@ public class Untyped { return new UntypedIntLiteralNode(value, Sources.NULL); } + public static UntypedExpressionNode lessThan( + UntypedExpressionNode left, + UntypedExpressionNode right + ) { + return new UntypedBinaryOperationNode( + UntypedBinaryOperator.LESS_THAN, + left, + right, + Sources.NULL + ); + } + + public static UntypedExpressionNode lessThanOrEqual( + UntypedExpressionNode left, + UntypedExpressionNode right + ) { + return new UntypedBinaryOperationNode( + UntypedBinaryOperator.LESS_THAN_OR_EQUAL, + left, + right, + Sources.NULL + ); + } + public static UntypedExpressionNode memberAccess( UntypedExpressionNode receiver, String memberName diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java index b5546188..cdf5bca1 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBinaryOperationTests.java @@ -40,6 +40,58 @@ public class TypeCheckerBinaryOperationTests { } @Test + public void whenBothOperandsAreIntsAndOperatorIsLessThenIsTypedAsIntLessThan() { + var untyped = Untyped.greaterThan(Untyped.intLiteral(42), Untyped.intLiteral(47)); + + var typed = typeCheckExpression(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedIntGreaterThanNode( + isTypedIntLiteralNode(42), + isTypedIntLiteralNode(47) + )); + assertThat(typed.value().type(), equalTo(Types.BOOL)); + } + + @Test + public void whenBothOperandsAreIntsAndOperatorIsGreaterThenOrEqualIsTypedAsIntGreaterThanOrEqual() { + var untyped = Untyped.greaterThanOrEqual(Untyped.intLiteral(42), Untyped.intLiteral(47)); + + var typed = typeCheckExpression(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedIntGreaterThanOrEqualNode( + isTypedIntLiteralNode(42), + isTypedIntLiteralNode(47) + )); + assertThat(typed.value().type(), equalTo(Types.BOOL)); + } + + @Test + public void whenBothOperandsAreIntsAndOperatorIsGreaterThenIsTypedAsIntGreaterThan() { + var untyped = Untyped.lessThan(Untyped.intLiteral(42), Untyped.intLiteral(47)); + + var typed = typeCheckExpression(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedIntLessThanNode( + isTypedIntLiteralNode(42), + isTypedIntLiteralNode(47) + )); + assertThat(typed.value().type(), equalTo(Types.BOOL)); + } + + @Test + public void whenBothOperandsAreIntsAndOperatorIsLessThenOrEqualIsTypedAsIntLessThanOrEqual() { + var untyped = Untyped.lessThanOrEqual(Untyped.intLiteral(42), Untyped.intLiteral(47)); + + var typed = typeCheckExpression(untyped, TypeCheckerContext.EMPTY); + + assertThat(typed.value(), isTypedIntLessThanOrEqualNode( + isTypedIntLiteralNode(42), + isTypedIntLiteralNode(47) + )); + assertThat(typed.value().type(), equalTo(Types.BOOL)); + } + + @Test public void whenBothOperandsAreIntsAndOperatorIsNotEqualThenIsTypedAsIntNotEqual() { var untyped = Untyped.notEqual(Untyped.intLiteral(42), Untyped.intLiteral(47)); @@ -52,7 +104,6 @@ public class TypeCheckerBinaryOperationTests { assertThat(typed.value().type(), equalTo(Types.BOOL)); } - @Test public void whenBothOperandsAreIntsAndOperatorIsSubThenIsTypedAsIntSub() { var untyped = Untyped.sub(Untyped.intLiteral(42), Untyped.intLiteral(47)); |
