From 3370842a9a939476f4759361a0f88541ebdb78ed Mon Sep 17 00:00:00 2001 From: uklimaschewski Date: Mon, 15 Jan 2024 09:48:43 +0100 Subject: [PATCH] #421 fixes inconsistent equals behaviour --- .../booleans/InfixEqualsOperator.java | 6 +++--- .../booleans/InfixNotEqualsOperator.java | 6 +++--- .../booleans/InfixEqualsOperatorTest.java | 20 +++++++++++++++++++ .../booleans/InfixNotEqualsOperatorTest.java | 20 +++++++++++++++++++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperator.java b/src/main/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperator.java index 40df1651..751a889c 100644 --- a/src/main/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperator.java +++ b/src/main/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperator.java @@ -30,12 +30,12 @@ public class InfixEqualsOperator extends AbstractOperator { @Override public EvaluationValue evaluate( Expression expression, Token operatorToken, EvaluationValue... operands) { + if (operands[0].getDataType() != operands[1].getDataType()) { + return EvaluationValue.booleanValue(false); + } if (operands[0].isNullValue() && operands[1].isNullValue()) { return EvaluationValue.booleanValue(true); } - if (operands[0].isNullValue() || operands[1].isNullValue()) { - return EvaluationValue.booleanValue(false); - } return expression.convertValue(operands[0].compareTo(operands[1]) == 0); } } diff --git a/src/main/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperator.java b/src/main/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperator.java index e4144366..cb351a4d 100644 --- a/src/main/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperator.java +++ b/src/main/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperator.java @@ -30,12 +30,12 @@ public class InfixNotEqualsOperator extends AbstractOperator { @Override public EvaluationValue evaluate( Expression expression, Token operatorToken, EvaluationValue... operands) { + if (operands[0].getDataType() != operands[1].getDataType()) { + return EvaluationValue.booleanValue(true); + } if (operands[0].isNullValue() && operands[1].isNullValue()) { return EvaluationValue.booleanValue(false); } - if (operands[0].isNullValue() || operands[1].isNullValue()) { - return EvaluationValue.booleanValue(true); - } return expression.convertValue(operands[0].compareTo(operands[1]) != 0); } } diff --git a/src/test/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperatorTest.java b/src/test/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperatorTest.java index 5539e74d..21ce7635 100644 --- a/src/test/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperatorTest.java +++ b/src/test/java/com/ezylang/evalex/operators/booleans/InfixEqualsOperatorTest.java @@ -54,6 +54,26 @@ void testInfixEqualsLiterals(String expression, String expectedResult) assertExpressionHasExpectedResult(expression, expectedResult); } + @ParameterizedTest + @CsvSource( + delimiter = ':', + value = { + "1==\"1\" : false", + "\"1\"==1 : false", + "true==\"1\" : false", + "\"1\"==true : false", + "false==\"1\" : false", + "\"1\"==false : false", + "DT_DATE_NEW(2022,10,30)==1 : false", + "1==DT_DATE_NEW(2022,10,30) : false", + "DT_DURATION_PARSE(\"PT24H\")==1 : false", + "1==DT_DURATION_PARSE(\"PT24H\") : false", + }) + void testInfixEqualsTypesDiffer(String expression, String expectedResult) + throws EvaluationException, ParseException { + assertExpressionHasExpectedResult(expression, expectedResult); + } + @Test void testInfixEqualsVariables() throws EvaluationException, ParseException { Expression expression = new Expression("a=b"); diff --git a/src/test/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperatorTest.java b/src/test/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperatorTest.java index 62654124..0e2020b4 100644 --- a/src/test/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperatorTest.java +++ b/src/test/java/com/ezylang/evalex/operators/booleans/InfixNotEqualsOperatorTest.java @@ -54,6 +54,26 @@ void testInfixNotEqualsLiterals(String expression, String expectedResult) assertExpressionHasExpectedResult(expression, expectedResult); } + @ParameterizedTest + @CsvSource( + delimiter = ':', + value = { + "1!=\"1\" : true", + "\"1\"!=1 : true", + "true!=\"1\" : true", + "\"1\"!=true : true", + "false!=\"1\" : true", + "\"1\"!=false : true", + "DT_DATE_NEW(2022,10,30)!=1 : true", + "1!=DT_DATE_NEW(2022,10,30) : true", + "DT_DURATION_PARSE(\"PT24H\")!=1 : true", + "1!=DT_DURATION_PARSE(\"PT24H\") : true", + }) + void testInfixNotEqualsTypesDiffer(String expression, String expectedResult) + throws EvaluationException, ParseException { + assertExpressionHasExpectedResult(expression, expectedResult); + } + @Test void testInfixNotEqualsVariables() throws EvaluationException, ParseException { Expression expression = new Expression("a!=b");