You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/03/07 12:06:30 UTC

svn commit: r1898677 - in /poi/trunk: poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java

Author: fanningpj
Date: Mon Mar  7 12:06:30 2022
New Revision: 1898677

URL: http://svn.apache.org/viewvc?rev=1898677&view=rev
Log:
[bug-65939] add partial fix for clearing formula with circular ref

Added:
    poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java   (with props)
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java
      - copied, changed from r1898667, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestPlainCellCache.java
Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java

Added: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java?rev=1898677&view=auto
==============================================================================
--- poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java (added)
+++ poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java Mon Mar  7 12:06:30 2022
@@ -0,0 +1,28 @@
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.ss.usermodel.CellType;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TestFormulaEval {
+    @Test
+    void testCircularRef() throws IOException {
+        try (XSSFWorkbook wb = new XSSFWorkbook()) {
+            XSSFSheet sheet = wb.createSheet();
+            XSSFRow row = sheet.createRow(0);
+            XSSFCell cell = row.createCell(0);
+            cell.setCellFormula("A1");
+            XSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
+            // the following assert should probably be NUMERIC not ERROR (from testing in Excel itself)
+            assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell));
+
+            cell.setCellFormula(null);
+            formulaEvaluator.notifyUpdateCell(cell);
+            //the following assert should probably be BLANK not ERROR
+            assertEquals(CellType.ERROR, cell.getCellType());
+        }
+    }
+}

Propchange: poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java?rev=1898677&r1=1898676&r2=1898677&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java Mon Mar  7 12:06:30 2022
@@ -114,7 +114,9 @@ abstract class CellCacheEntry implements
         for (int i = 0; i < formulaCells.length; i++) {
             FormulaCellCacheEntry fc = formulaCells[i];
             fc.clearFormulaEntry();
-            fc.recurseClearCachedFormulaResults();
+            if (fc != this) {
+                fc.recurseClearCachedFormulaResults();
+            }
         }
     }
 

Copied: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java (from r1898667, poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestPlainCellCache.java)
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestPlainCellCache.java&r1=1898667&r2=1898677&rev=1898677&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestPlainCellCache.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java Mon Mar  7 12:06:30 2022
@@ -19,46 +19,35 @@
 
 package org.apache.poi.ss.formula;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-import org.apache.poi.ss.formula.PlainCellCache.Loc;
-import org.apache.poi.ss.formula.eval.NumberEval;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.CellType;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
-class TestPlainCellCache {
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TestFormulaEval {
 
+    @Disabled("https://bz.apache.org/bugzilla/show_bug.cgi?id=65939")
     @Test
-    void testLoc(){
-        PlainCellCache cache = new PlainCellCache();
-        for (int bookIndex = 0; bookIndex < 0x1000; bookIndex += 0x100) {
-            for (int sheetIndex = 0; sheetIndex < 0x1000; sheetIndex += 0x100) {
-                for (int rowIndex = 0; rowIndex < 0x100000; rowIndex += 0x1000) {
-                    for (int columnIndex = 0; columnIndex < 0x4000; columnIndex += 0x100) {
-                        Loc loc = new Loc(bookIndex, sheetIndex, rowIndex, columnIndex);
-                        assertEquals(bookIndex, loc.getBookIndex());
-                        assertEquals(sheetIndex, loc.getSheetIndex());
-                        assertEquals(rowIndex, loc.getRowIndex());
-                        assertEquals(columnIndex, loc.getColumnIndex());
-
-                        Loc sameLoc = new Loc(bookIndex, sheetIndex, rowIndex, columnIndex);
-                        assertEquals(loc.hashCode(), sameLoc.hashCode());
-                        assertEquals(loc, sameLoc);
-
-                        assertNull(cache.get(loc));
-                        PlainValueCellCacheEntry entry = new PlainValueCellCacheEntry(new NumberEval(0));
-                        cache.put(loc, entry);
-                        assertSame(entry, cache.get(loc));
-                        cache.remove(loc);
-                        assertNull(cache.get(loc));
-
-                        cache.put(loc, entry);
-                    }
-                    cache.clear();
-                }
-            }
+    void testCircularRef() throws IOException {
+        try (HSSFWorkbook wb = new HSSFWorkbook()) {
+            HSSFSheet sheet = wb.createSheet();
+            HSSFRow row = sheet.createRow(0);
+            HSSFCell cell = row.createCell(0);
+            cell.setCellFormula("A1");
+            HSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
+            // the following assert should probably be NUMERIC not ERROR (from testing in Excel itself)
+            assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell));
 
+            cell.setCellFormula(null); //this line fails
+            formulaEvaluator.notifyUpdateCell(cell);
         }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org