From 3f9a4e24c160e69481d1b82dee9b9863f5205e4f Mon Sep 17 00:00:00 2001 From: Udo Klimaschewski Date: Mon, 15 Jan 2024 11:22:55 +0100 Subject: [PATCH] #428 - fixes inconsistent equals behavior (#431) --- .../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 40df165..751a889 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 e414436..cb351a4 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 5539e74..21ce763 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 @@ class InfixEqualsOperatorTest extends BaseEvaluationTest { 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 6265412..0e2020b 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 @@ class InfixNotEqualsOperatorTest extends BaseEvaluationTest { 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"); -- 2.51.2