From 53a46c6ab3e18487172cdcdc54226423755f9b0e Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 20 Oct 2014 23:22:02 +0000 Subject: [PATCH] Add disabled unit tests for bug #46670 - failing on both HSSF and XSSF, but for different reasons git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1633257 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/usermodel/TestBugs.java | 50 +++++++++++ .../ss/usermodel/BaseTestBugzillaIssues.java | 83 ++++++++++++++++++ test-data/spreadsheet/46670_http.xls | Bin 0 -> 26112 bytes test-data/spreadsheet/46670_local.xls | Bin 0 -> 25600 bytes test-data/spreadsheet/46670_ref_airline.xls | Bin 0 -> 16384 bytes 5 files changed, 133 insertions(+) create mode 100644 test-data/spreadsheet/46670_http.xls create mode 100644 test-data/spreadsheet/46670_local.xls create mode 100644 test-data/spreadsheet/46670_ref_airline.xls diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 706ff5e50d..575e3b4850 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -2624,4 +2624,54 @@ public final class TestBugs extends BaseTestBugzillaIssues { assertEquals("International Communication Services SA", s.getRow(2).getCell(0).getStringCellValue()); assertEquals("Saudi Arabia-Riyadh", s.getRow(210).getCell(0).getStringCellValue()); } + + /** + * Read, write, read for formulas point to cells in other files. + * See {@link #bug46670()} for the main test, this just + * covers reading an existing file and checking it. + * TODO Fix this so that it works - formulas are ending up as + * #REF when being changed + */ +// @Test + public void bug46670_existing() { + HSSFWorkbook wb; + Sheet s; + Cell c; + + // Expected values + String refLocal = "'[refs/airport.xls]Sheet1'!$A$2"; + String refHttp = "'[9http://www.principlesofeconometrics.com/excel/airline.xls]Sheet1'!$A$2"; + + // Check we can read them correctly + wb = openSample("46670_local.xls"); + s = wb.getSheetAt(0); + assertEquals(refLocal, s.getRow(0).getCell(0).getCellFormula()); + + wb = openSample("46670_http.xls"); + s = wb.getSheetAt(0); + assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula()); + + // Now try to set them to the same values, and ensure that + // they end up as they did before, even with a save and re-load + wb = openSample("46670_local.xls"); + s = wb.getSheetAt(0); + c = s.getRow(0).getCell(0); + c.setCellFormula(refLocal); + assertEquals(refLocal, c.getCellFormula()); + + wb = HSSFTestDataSamples.writeOutAndReadBack(wb); + s = wb.getSheetAt(0); + assertEquals(refLocal, s.getRow(0).getCell(0).getCellFormula()); + + + wb = openSample("46670_http.xls"); + s = wb.getSheetAt(0); + c = s.getRow(0).getCell(0); + c.setCellFormula(refHttp); + assertEquals(refHttp, c.getCellFormula()); + + wb = HSSFTestDataSamples.writeOutAndReadBack(wb); + s = wb.getSheetAt(0); + assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula()); + } } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java index 378b24526f..fb9dd8ea90 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java @@ -21,6 +21,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.HashMap; +import java.util.Map; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.ss.ITestDataProvider; import org.apache.poi.ss.SpreadsheetVersion; @@ -673,4 +677,83 @@ public abstract class BaseTestBugzillaIssues { wb.getCreationHelper().createFormulaEvaluator().evaluateFormulaCell(c); return s.getRow(c.getRowIndex()).getCell(c.getColumnIndex()); } + + /** + * Should be able to write then read formulas with references + * to cells in other files, eg '[refs/airport.xls]Sheet1'!$A$2 + * or 'http://192.168.1.2/[blank.xls]Sheet1'!$A$1 . + * Additionally, if a reference to that file is provided, it should + * be possible to evaluate them too + * TODO Fix this to evaluate for XSSF + * TODO Fix this to work at all for HSSF + */ +// @Test + public void bug46670() throws Exception { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet s = wb.createSheet(); + Row r1 = s.createRow(0); + + + // References to try + String ext = "xls"; + if (! (wb instanceof HSSFWorkbook)) ext += "x"; + String refLocal = "'[test."+ext+"]Sheet1'!$A$2"; + String refHttp = "'[http://example.com/test."+ext+"]Sheet1'!$A$2"; + String otherCellText = "In Another Workbook"; + + + // Create the references + Cell c1 = r1.createCell(0, Cell.CELL_TYPE_FORMULA); + c1.setCellFormula(refLocal); + + Cell c2 = r1.createCell(1, Cell.CELL_TYPE_FORMULA); + c2.setCellFormula(refHttp); + + + // Check they were set correctly + assertEquals(refLocal, c1.getCellFormula()); + assertEquals(refHttp, c2.getCellFormula()); + + + // Reload, and ensure they were serialised and read correctly + wb = _testDataProvider.writeOutAndReadBack(wb); + s = wb.getSheetAt(0); + r1 = s.getRow(0); + + c1 = r1.getCell(0); + c2 = r1.getCell(1); + assertEquals(refLocal, c1.getCellFormula()); + assertEquals(refHttp, c2.getCellFormula()); + + + // Try to evalutate, without giving a way to get at the other file + try { + evaluateCell(wb, c1); + fail("Shouldn't be able to evaluate without the other file"); + } catch (Exception e) {} + try { + evaluateCell(wb, c2); + fail("Shouldn't be able to evaluate without the other file"); + } catch (Exception e) {} + + + // Set up references to the other file + Workbook wb2 = _testDataProvider.createWorkbook(); + wb2.createSheet().createRow(1).createCell(0).setCellValue(otherCellText); + + Map evaluators = new HashMap(); + evaluators.put(refLocal, wb2.getCreationHelper().createFormulaEvaluator()); + evaluators.put(refHttp, wb2.getCreationHelper().createFormulaEvaluator()); + + FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); + evaluator.setupReferencedWorkbooks(evaluators); + + + // Try to evaluate, with the other file + evaluator.evaluateFormulaCell(c1); + evaluator.evaluateFormulaCell(c2); + + assertEquals(otherCellText, c1.getStringCellValue()); + assertEquals(otherCellText, c2.getStringCellValue()); + } } diff --git a/test-data/spreadsheet/46670_http.xls b/test-data/spreadsheet/46670_http.xls new file mode 100644 index 0000000000000000000000000000000000000000..789284d6175621fbeb47eb026de522cd5724364c GIT binary patch literal 26112 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/46670_local.xls b/test-data/spreadsheet/46670_local.xls new file mode 100644 index 0000000000000000000000000000000000000000..0d73e63c65b94ad3fcc1cd27875b0a8d9238f038 GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/46670_ref_airline.xls b/test-data/spreadsheet/46670_ref_airline.xls new file mode 100644 index 0000000000000000000000000000000000000000..b0db5c935c512f8448092e51cfd23dd459b3b189 GIT binary patch literal 16384 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 ULp6Kg>&Y|rKhPgvIEV571*(MxR{#J2 literal 0 HcmV?d00001