diff --git a/src/main/java/com/ezylang/evalex/parser/ShuntingYardConverter.java b/src/main/java/com/ezylang/evalex/parser/ShuntingYardConverter.java index d7240fa..e4e5358 100644 --- a/src/main/java/com/ezylang/evalex/parser/ShuntingYardConverter.java +++ b/src/main/java/com/ezylang/evalex/parser/ShuntingYardConverter.java @@ -112,6 +112,10 @@ public class ShuntingYardConverter { throw new ParseException(this.originalExpression, "Empty expression"); } + if (operandStack.size() > 1) { + throw new ParseException(this.originalExpression, "Too many operands"); + } + return operandStack.pop(); } diff --git a/src/test/java/com/ezylang/evalex/parser/ShuntingYardExceptionsTest.java b/src/test/java/com/ezylang/evalex/parser/ShuntingYardExceptionsTest.java index 510207f..fe413ee 100644 --- a/src/test/java/com/ezylang/evalex/parser/ShuntingYardExceptionsTest.java +++ b/src/test/java/com/ezylang/evalex/parser/ShuntingYardExceptionsTest.java @@ -142,4 +142,76 @@ class ShuntingYardExceptionsTest extends BaseParserTest { .isInstanceOf(ParseException.class) .hasMessage("Too many parameters for function"); } + + @Test + void testTooManyOperands() { + Expression expression = new Expression("1 2"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsString() { + Expression expression = new Expression("Hello World"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithNumbers() { + Expression expression = new Expression("Hello 1"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithNumbersAndOperators() { + Expression expression = new Expression("Hello 1 + 1"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithNumbersAndOperatorsAndBraces() { + Expression expression = new Expression("Hello 1 + (1 + 1)"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithFunctions() { + Expression expression = new Expression("Hello ROUND(1,2)"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithFunctionsAndBraces() { + Expression expression = new Expression("Hello ROUND(1,2) + (1 + 1)"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } + + @Test + void testTooManyOperandsStringWithSpecialCharacters() { + Expression expression = new Expression("Hello, World"); + + assertThatThrownBy(expression::evaluate) + .isInstanceOf(ParseException.class) + .hasMessage("Too many operands"); + } }