From 252caef6588393d4b0903a6e81261479bd554136 Mon Sep 17 00:00:00 2001 From: uklimaschewski Date: Sun, 30 Jun 2024 13:18:13 +0200 Subject: [PATCH] corrects incorrect handling of infix operators after array index --- .../com/ezylang/evalex/parser/Tokenizer.java | 1 + .../evalex/parser/TokenizerArrayTest.java | 84 +++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/src/main/java/com/ezylang/evalex/parser/Tokenizer.java b/src/main/java/com/ezylang/evalex/parser/Tokenizer.java index aa7c2c60..c79d040b 100644 --- a/src/main/java/com/ezylang/evalex/parser/Tokenizer.java +++ b/src/main/java/com/ezylang/evalex/parser/Tokenizer.java @@ -349,6 +349,7 @@ private boolean infixOperatorAllowed() { case STRING_LITERAL: case POSTFIX_OPERATOR: case NUMBER_LITERAL: + case ARRAY_CLOSE: return true; default: return false; diff --git a/src/test/java/com/ezylang/evalex/parser/TokenizerArrayTest.java b/src/test/java/com/ezylang/evalex/parser/TokenizerArrayTest.java index c9178720..3b1d66ff 100644 --- a/src/test/java/com/ezylang/evalex/parser/TokenizerArrayTest.java +++ b/src/test/java/com/ezylang/evalex/parser/TokenizerArrayTest.java @@ -51,6 +51,90 @@ void testArrayNested() throws ParseException { new Token(14, "]", TokenType.ARRAY_CLOSE)); } + @Test + void testArrayEquals() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] = 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, "=", TokenType.INFIX_OPERATOR), + new Token(8, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayGreaterThan() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] > 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, ">", TokenType.INFIX_OPERATOR), + new Token(8, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayLessThan() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] < 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, "<", TokenType.INFIX_OPERATOR), + new Token(8, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayNotEquals() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] != 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, "!=", TokenType.INFIX_OPERATOR), + new Token(9, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayEqualsEquals() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] == 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, "==", TokenType.INFIX_OPERATOR), + new Token(9, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayGreaterEqualsThan() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] >= 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, ">=", TokenType.INFIX_OPERATOR), + new Token(9, "2", TokenType.NUMBER_LITERAL)); + } + + @Test + void testArrayLessEqualsThan() throws ParseException { + assertAllTokensParsedCorrectly( + "a[1] <= 2", + new Token(1, "a", TokenType.VARIABLE_OR_CONSTANT), + new Token(2, "[", TokenType.ARRAY_OPEN), + new Token(3, "1", TokenType.NUMBER_LITERAL), + new Token(4, "]", TokenType.ARRAY_CLOSE), + new Token(6, "<=", TokenType.INFIX_OPERATOR), + new Token(9, "2", TokenType.NUMBER_LITERAL)); + } + @Test void testMissingClosingArray() { assertThatThrownBy(() -> new Tokenizer("a[2+4", configuration).parse())