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