Author: centic
Date: Sat May 16 13:05:58 2020
New Revision: 1877815

URL: http://svn.apache.org/viewvc?rev=1877815&view=rev
Log:
Bug 64393: Adjust relational operators to handle MissingArgEval correctly

Modified:
    
poi/trunk/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
    
poi/trunk/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java

Modified: 
poi/trunk/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java?rev=1877815&r1=1877814&r2=1877815&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java 
Sat May 16 13:05:58 2020
@@ -86,11 +86,11 @@ public abstract class RelationalOperatio
        }
 
        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 RelationalOperatio
        }
 
        private static int compareBlank(ValueEval v) {
-               if (v == BlankEval.instance) {
+               if (v == BlankEval.instance || v instanceof MissingArgEval) {
                        return 0;
                }
                if (v instanceof BoolEval) {

Modified: 
poi/trunk/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java?rev=1877815&r1=1877814&r2=1877815&view=diff
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java 
(original)
+++ 
poi/trunk/src/testcases/org/apache/poi/ss/formula/eval/TestMissingArgEval.java 
Sat May 16 13:05:58 2020
@@ -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);
+            assertFalse(cv.getBooleanValue());
+
+            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);
+            assertTrue(cv.getBooleanValue());
+
+            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()) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to