From ff919eb0e4b25a7ba9a97ad6c8fdc64a381a96b0 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 16 May 2020 13:05:58 +0000 Subject: [PATCH] Bug 64393: Adjust relational operators to handle MissingArgEval correctly git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1877815 13f79535-47bb-0310-9956-ffa450edef68 --- .../formula/eval/RelationalOperationEval.java | 8 +-- .../ss/formula/eval/TestMissingArgEval.java | 62 +++++++++++++++++++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java b/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java index f83a54de47..2a9f2e34a7 100644 --- a/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java +++ b/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java @@ -86,11 +86,11 @@ public abstract class RelationalOperationEval extends Fixed2ArgFunction implemen } private static int doCompare(ValueEval va, ValueEval vb) { - // special cases when one operand is blank - if (va == BlankEval.instance) { + // special cases when one operand is blank or missing + if (va == BlankEval.instance || va instanceof MissingArgEval) { return compareBlank(vb); } - if (vb == BlankEval.instance) { + if (vb == BlankEval.instance || vb instanceof MissingArgEval) { return -compareBlank(va); } @@ -131,7 +131,7 @@ public abstract class RelationalOperationEval extends Fixed2ArgFunction implemen } private static int compareBlank(ValueEval v) { - if (v == BlankEval.instance) { + if (v == BlankEval.instance || v instanceof MissingArgEval) { return 0; } if (v instanceof BoolEval) { diff --git a/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java b/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java index e99c8e1cce..122882d609 100644 --- a/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java +++ b/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java @@ -18,6 +18,8 @@ package org.apache.poi.ss.formula.eval; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -54,6 +56,66 @@ public final class TestMissingArgEval { } } + @Test + public void testCompareMissingArgs() throws IOException { + try (HSSFWorkbook wb = new HSSFWorkbook()) { + HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); + HSSFSheet sheet = wb.createSheet("Sheet1"); + HSSFCell cell = sheet.createRow(0).createCell(0); + + cell.setCellFormula("iferror(0/0,)<0"); + fe.clearAllCachedResultValues(); + CellValue cv = fe.evaluate(cell); + assertFalse(cv.getBooleanValue()); + + cell.setCellFormula("iferror(0/0,)<=0"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertTrue(cv.getBooleanValue()); + + cell.setCellFormula("iferror(0/0,)=0"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertTrue(cv.getBooleanValue()); + + cell.setCellFormula("iferror(0/0,)>=0"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertTrue(cv.getBooleanValue()); + + cell.setCellFormula("iferror(0/0,)>0"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertFalse(cv.getBooleanValue()); + + // invert above for code coverage + cell.setCellFormula("0=iferror(0/0,)"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertTrue(cv.getBooleanValue()); + + cell.setCellFormula("0>iferror(0/0,)"); + fe.clearAllCachedResultValues(); + cv = fe.evaluate(cell); + assertFalse(cv.getBooleanValue()); + } + } + @Test public void testCountFuncs() throws IOException { try (HSSFWorkbook wb = new HSSFWorkbook()) { -- 2.39.5