From 675758cc85fa420bbed09b2c865f0e2aea84deeb Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Wed, 17 Jun 2015 14:53:38 +0000 Subject: [PATCH] Move more tests into base class and add a TestSXSSFBugs class to verify some things that are supported against SXSSFWorkbook as well git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1686035 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/TestSXSSFBugs.java | 82 +++++++ .../poi/xssf/usermodel/TestXSSFBugs.java | 129 +---------- .../apache/poi/hssf/usermodel/TestBugs.java | 94 ++++++-- .../ss/usermodel/BaseTestBugzillaIssues.java | 207 +++++++++++++++++- 4 files changed, 367 insertions(+), 145 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestSXSSFBugs.java diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestSXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestSXSSFBugs.java new file mode 100644 index 0000000000..7a2879558c --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestSXSSFBugs.java @@ -0,0 +1,82 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.xssf.usermodel; + +import static org.junit.Assert.assertEquals; + +import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; +import org.apache.poi.ss.usermodel.PrintSetup; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.SXSSFITestDataProvider; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.junit.Ignore; +import org.junit.Test; + +public final class TestSXSSFBugs extends BaseTestBugzillaIssues { + public TestSXSSFBugs() { + super(SXSSFITestDataProvider.instance); + } + + // override some tests which do not work for SXSSF + @Override @Ignore("cloneSheet() not implemented") @Test public void bug18800() { /* cloneSheet() not implemented */ } + @Override @Ignore("cloneSheet() not implemented") @Test public void bug22720() { /* cloneSheet() not implemented */ } + @Override @Ignore("Evaluation is not supported") @Test public void bug43093() { /* Evaluation is not supported */ } + @Override @Ignore("Evaluation is not supported") @Test public void bug51024() { /* Evaluation is not supported */ } + @Override @Ignore("Evaluation is not supported") @Test public void bug46729_testMaxFunctionArguments() { /* Evaluation is not supported */ } + @Override @Ignore("Evaluation is not supported") @Test public void stackoverflow26437323() { /* Evaluation is not supported */ } + @Override @Ignore("Evaluation is not supported") @Test public void bug47815() { /* Evaluation is not supported */ } + + /** + * Setting repeating rows and columns shouldn't break + * any print settings that were there before + */ + @SuppressWarnings("deprecation") + @Test + public void bug49253() throws Exception { + Workbook wb1 = new SXSSFWorkbook(); + Workbook wb2 = new SXSSFWorkbook(); + + // No print settings before repeating + Sheet s1 = wb1.createSheet(); + + wb1.setRepeatingRowsAndColumns(0, 2, 3, 1, 2); + + PrintSetup ps1 = s1.getPrintSetup(); + assertEquals(false, ps1.getValidSettings()); + assertEquals(false, ps1.getLandscape()); + + + // Had valid print settings before repeating + Sheet s2 = wb2.createSheet(); + PrintSetup ps2 = s2.getPrintSetup(); + + ps2.setLandscape(false); + assertEquals(true, ps2.getValidSettings()); + assertEquals(false, ps2.getLandscape()); + + wb2.setRepeatingRowsAndColumns(0, 2, 3, 1, 2); + + ps2 = s2.getPrintSetup(); + assertEquals(true, ps2.getValidSettings()); + assertEquals(false, ps2.getLandscape()); + + wb1.close(); + wb2.close(); + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 60f6188a01..3dd7b0f265 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -74,6 +74,7 @@ import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -349,42 +350,6 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex()); } - /** - * With HSSF, if you create a font, don't change it, and - * create a 2nd, you really do get two fonts that you - * can alter as and when you want. - * With XSSF, that wasn't the case, but this verfies - * that it now is again - */ - @Test - public void bug48718() throws Exception { - // Verify the HSSF behaviour - // Then ensure the same for XSSF - Workbook[] wbs = new Workbook[] { - new HSSFWorkbook(), - new XSSFWorkbook() - }; - int[] initialFonts = new int[] { 4, 1 }; - for(int i=0; i objects = wb.getAllEmbeddedObjects(); assertEquals(1, objects.size()); - HSSFObjectData obj = (HSSFObjectData)objects.get(0); + HSSFObjectData obj = objects.get(0); assertNotNull(obj); // Peek inside the underlying record @@ -975,9 +977,10 @@ public final class TestBugs extends BaseTestBugzillaIssues { /** * Test that fonts get added properly + * @throws IOException */ @Test - public void bug45338() { + public void bug45338() throws IOException { HSSFWorkbook wb = new HSSFWorkbook(); assertEquals(4, wb.getNumberOfFonts()); @@ -1056,6 +1059,8 @@ public final class TestBugs extends BaseTestBugzillaIssues { "Thingy", false, true, (short)2, (byte)2 ) ); + + wb.close(); } /** @@ -1200,9 +1205,10 @@ public final class TestBugs extends BaseTestBugzillaIssues { /** * People are all getting confused about the last * row and cell number + * @throws IOException */ @Test - public void bug30635() { + public void bug30635() throws IOException { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet s = wb.createSheet(); @@ -1245,6 +1251,8 @@ public final class TestBugs extends BaseTestBugzillaIssues { assertEquals(0, r.getFirstCellNum()); assertEquals(5, r.getLastCellNum()); // last cell # + 1 assertEquals(3, r.getPhysicalNumberOfCells()); + + wb.close(); } /** @@ -1571,7 +1579,7 @@ public final class TestBugs extends BaseTestBugzillaIssues { try { OPOIFSFileSystem fs = new OPOIFSFileSystem( HSSFITestDataProvider.instance.openWorkbookStream("46904.xls")); - new HSSFWorkbook(fs.getRoot(), false); + new HSSFWorkbook(fs.getRoot(), false).close(); fail(); } catch(OldExcelFormatException e) { assertTrue(e.getMessage().startsWith( @@ -1581,8 +1589,12 @@ public final class TestBugs extends BaseTestBugzillaIssues { try { NPOIFSFileSystem fs = new NPOIFSFileSystem( HSSFITestDataProvider.instance.openWorkbookStream("46904.xls")); - new HSSFWorkbook(fs.getRoot(), false); - fail(); + try { + new HSSFWorkbook(fs.getRoot(), false).close(); + fail(); + } finally { + fs.close(); + } } catch(OldExcelFormatException e) { assertTrue(e.getMessage().startsWith( "The supplied spreadsheet seems to be Excel" @@ -2020,9 +2032,10 @@ public final class TestBugs extends BaseTestBugzillaIssues { /** * Last row number when shifting rows + * @throws IOException */ @Test - public void bug50416LastRowNumber() { + public void bug50416LastRowNumber() throws IOException { // Create the workbook with 1 sheet which contains 3 rows HSSFWorkbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("Bug50416"); @@ -2071,6 +2084,8 @@ public final class TestBugs extends BaseTestBugzillaIssues { assertEquals("Cell A,2", sheet.getRow(0).getCell(0).getStringCellValue()); assertEquals("Cell A,1", sheet.getRow(1).getCell(0).getStringCellValue()); assertEquals("Cell A,3", sheet.getRow(2).getCell(0).getStringCellValue()); + + workbook.close(); } /** @@ -2376,6 +2391,7 @@ public final class TestBugs extends BaseTestBugzillaIssues { InternalSheet ish = HSSFTestHelper.getSheetForTest(sh); PageSettingsBlock psb = (PageSettingsBlock) ish.getRecords().get(13); psb.visitContainedRecords(new RecordAggregate.RecordVisitor() { + @Override public void visitRecord(Record r) { list.add(r.getSid()); } @@ -2385,7 +2401,7 @@ public final class TestBugs extends BaseTestBugzillaIssues { } @Test - public void bug52272(){ + public void bug52272() throws IOException{ HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sh = wb.createSheet(); HSSFPatriarch p = sh.createDrawingPatriarch(); @@ -2395,14 +2411,17 @@ public final class TestBugs extends BaseTestBugzillaIssues { HSSFSheet sh2 = wb.cloneSheet(0); assertNotNull(sh2.getDrawingPatriarch()); + + wb.close(); } @Test - public void bug53432(){ + public void bug53432() throws IOException{ Workbook wb = new HSSFWorkbook(); //or new HSSFWorkbook(); wb.addPicture(new byte[]{123,22}, Workbook.PICTURE_TYPE_JPEG); assertEquals(wb.getAllPictures().size(), 1); + wb.close(); wb = new HSSFWorkbook(); wb = writeOutAndReadBack((HSSFWorkbook) wb); assertEquals(wb.getAllPictures().size(), 0); @@ -2411,6 +2430,8 @@ public final class TestBugs extends BaseTestBugzillaIssues { wb = writeOutAndReadBack((HSSFWorkbook) wb); assertEquals(wb.getAllPictures().size(), 1); + + wb.close(); } @Test @@ -2560,12 +2581,12 @@ public final class TestBugs extends BaseTestBugzillaIssues { Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb); assertEquals(4, wbBack.getNumberOfSheets()); -// OutputStream fOut = new FileOutputStream("/tmp/56325a.xls"); -// try { -// wb.write(fOut); -// } finally { -// fOut.close(); -// } + OutputStream fOut = new FileOutputStream("C:\\temp\\56325a.xls"); + try { + wb.write(fOut); + } finally { + fOut.close(); + } } /** @@ -2758,4 +2779,39 @@ public final class TestBugs extends BaseTestBugzillaIssues { wb.close(); } + + @Test + public void test48043() throws IOException { + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("56325a.xls"); + + wb.removeSheetAt(2); + wb.removeSheetAt(1); + + //Sheet s = wb.createSheet("sheetname"); + Sheet s = wb.getSheetAt(0); + Row row = s.createRow(0); + Cell cell = row.createCell(0); + + cell.setCellFormula( + "IF(AND(ISBLANK(A10)," + + "ISBLANK(B10)),\"\"," + + "CONCATENATE(A10,\"-\",B10))"); + + FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator(); + + eval.evaluateAll(); + + /*OutputStream out = new FileOutputStream("C:\\temp\\48043.xls"); + try { + wb.write(out); + } finally { + out.close(); + }*/ + + Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb); + assertNotNull(wbBack); + wbBack.close(); + + wb.close(); + } } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java index 8b6732ca45..0051e82dd4 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java @@ -123,7 +123,7 @@ public abstract class BaseTestBugzillaIssues { * Merged regions were being removed from the parent in cloned sheets */ @Test - public final void bug22720() { + public void bug22720() { Workbook workBook = _testDataProvider.createWorkbook(); workBook.createSheet("TEST"); Sheet template = workBook.getSheetAt(0); @@ -247,7 +247,7 @@ public abstract class BaseTestBugzillaIssues { } @Test - public final void bug18800() { + public void bug18800() { Workbook book = _testDataProvider.createWorkbook(); book.createSheet("TEST"); Sheet sheet = book.cloneSheet(0); @@ -276,7 +276,7 @@ public abstract class BaseTestBugzillaIssues { } @Test - public final void bug43093() { + public void bug43093() { Workbook xlw = _testDataProvider.createWorkbook(); addNewSheetWithCellsA1toD4(xlw, 1); @@ -296,7 +296,7 @@ public abstract class BaseTestBugzillaIssues { } @Test - public final void bug46729_testMaxFunctionArguments(){ + public void bug46729_testMaxFunctionArguments(){ String[] func = {"COUNT", "AVERAGE", "MAX", "MIN", "OR", "SUBTOTAL", "SKEW"}; SpreadsheetVersion ssVersion = _testDataProvider.getSpreadsheetVersion(); @@ -534,7 +534,7 @@ public abstract class BaseTestBugzillaIssues { assertAlmostEquals(1950, s.getColumnWidth(10), fontAccuracy); assertAlmostEquals(2225, s.getColumnWidth(11), fontAccuracy); } - + /** * =ISNUMBER(SEARCH("AM",A1)) evaluation */ @@ -806,4 +806,201 @@ public abstract class BaseTestBugzillaIssues { wb.close(); } + + /** + * With HSSF, if you create a font, don't change it, and + * create a 2nd, you really do get two fonts that you + * can alter as and when you want. + * With XSSF, that wasn't the case, but this verfies + * that it now is again + */ + @Test + public void bug48718() throws Exception { + Workbook wb = _testDataProvider.createWorkbook(); + int startingFonts = wb instanceof HSSFWorkbook ? 4 : 1; + + assertEquals(startingFonts, wb.getNumberOfFonts()); + + // Get a font, and slightly change it + Font a = wb.createFont(); + assertEquals(startingFonts+1, wb.getNumberOfFonts()); + a.setFontHeightInPoints((short)23); + assertEquals(startingFonts+1, wb.getNumberOfFonts()); + + // Get two more, unchanged + /*Font b =*/ wb.createFont(); + assertEquals(startingFonts+2, wb.getNumberOfFonts()); + /*Font c =*/ wb.createFont(); + assertEquals(startingFonts+3, wb.getNumberOfFonts()); + } + + @Test + public void bug57430() throws Exception { + Workbook wb = _testDataProvider.createWorkbook(); + try { + wb.createSheet("Sheet1"); + + Name name1 = wb.createName(); + name1.setNameName("FMLA"); + name1.setRefersToFormula("Sheet1!$B$3"); + } finally { + wb.close(); + } + } + + @Test + public void bug56981() throws IOException { + Workbook wb = _testDataProvider.createWorkbook(); + CellStyle vertTop = wb.createCellStyle(); + vertTop.setVerticalAlignment(CellStyle.VERTICAL_TOP); + CellStyle vertBottom = wb.createCellStyle(); + vertBottom.setVerticalAlignment(CellStyle.VERTICAL_BOTTOM); + Sheet sheet = wb.createSheet("Sheet 1"); + Row row = sheet.createRow(0); + Cell top = row.createCell(0); + Cell bottom = row.createCell(1); + top.setCellValue("Top"); + top.setCellStyle(vertTop); // comment this out to get all bottom-aligned + // cells + bottom.setCellValue("Bottom"); + bottom.setCellStyle(vertBottom); + row.setHeightInPoints(85.75f); // make it obvious + + /*FileOutputStream out = new FileOutputStream("c:\\temp\\56981.xlsx"); + try { + wb.write(out); + } finally { + out.close(); + }*/ + + wb.close(); + } + + @Test + public void test57973() throws IOException { + Workbook wb = _testDataProvider.createWorkbook(); + + CreationHelper factory = wb.getCreationHelper(); + + Sheet sheet = wb.createSheet(); + Drawing drawing = sheet.createDrawingPatriarch(); + ClientAnchor anchor = factory.createClientAnchor(); + + Cell cell0 = sheet.createRow(0).createCell(0); + cell0.setCellValue("Cell0"); + + Comment comment0 = drawing.createCellComment(anchor); + RichTextString str0 = factory.createRichTextString("Hello, World1!"); + comment0.setString(str0); + comment0.setAuthor("Apache POI"); + cell0.setCellComment(comment0); + + anchor = factory.createClientAnchor(); + anchor.setCol1(1); + anchor.setCol2(1); + anchor.setRow1(1); + anchor.setRow2(1); + Cell cell1 = sheet.createRow(3).createCell(5); + cell1.setCellValue("F4"); + Comment comment1 = drawing.createCellComment(anchor); + RichTextString str1 = factory.createRichTextString("Hello, World2!"); + comment1.setString(str1); + comment1.setAuthor("Apache POI"); + cell1.setCellComment(comment1); + + Cell cell2 = sheet.createRow(2).createCell(2); + cell2.setCellValue("C3"); + + anchor = factory.createClientAnchor(); + anchor.setCol1(2); + anchor.setCol2(2); + anchor.setRow1(2); + anchor.setRow2(2); + + Comment comment2 = drawing.createCellComment(anchor); + RichTextString str2 = factory.createRichTextString("XSSF can set cell comments"); + //apply custom font to the text in the comment + Font font = wb.createFont(); + font.setFontName("Arial"); + font.setFontHeightInPoints((short)14); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + font.setColor(IndexedColors.RED.getIndex()); + str2.applyFont(font); + + comment2.setString(str2); + comment2.setAuthor("Apache POI"); + comment2.setColumn(2); + comment2.setRow(2); + + /*OutputStream out = new FileOutputStream("C:\\temp\\57973.xlsx"); + try { + wb.write(out); + } finally { + out.close(); + }*/ + + wb.close(); + } + + /** + * Ensures that XSSF and HSSF agree with each other, + * and with the docs on when fetching the wrong + * kind of value from a Formula cell + */ + @Test + public void bug47815() { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet s = wb.createSheet(); + Row r = s.createRow(0); + + // Setup + Cell cn = r.createCell(0, Cell.CELL_TYPE_NUMERIC); + cn.setCellValue(1.2); + Cell cs = r.createCell(1, Cell.CELL_TYPE_STRING); + cs.setCellValue("Testing"); + + Cell cfn = r.createCell(2, Cell.CELL_TYPE_FORMULA); + cfn.setCellFormula("A1"); + Cell cfs = r.createCell(3, Cell.CELL_TYPE_FORMULA); + cfs.setCellFormula("B1"); + + FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); + assertEquals(Cell.CELL_TYPE_NUMERIC, fe.evaluate(cfn).getCellType()); + assertEquals(Cell.CELL_TYPE_STRING, fe.evaluate(cfs).getCellType()); + fe.evaluateFormulaCell(cfn); + fe.evaluateFormulaCell(cfs); + + // Now test + assertEquals(Cell.CELL_TYPE_NUMERIC, cn.getCellType()); + assertEquals(Cell.CELL_TYPE_STRING, cs.getCellType()); + assertEquals(Cell.CELL_TYPE_FORMULA, cfn.getCellType()); + assertEquals(Cell.CELL_TYPE_NUMERIC, cfn.getCachedFormulaResultType()); + assertEquals(Cell.CELL_TYPE_FORMULA, cfs.getCellType()); + assertEquals(Cell.CELL_TYPE_STRING, cfs.getCachedFormulaResultType()); + + // Different ways of retrieving + assertEquals(1.2, cn.getNumericCellValue(), 0); + try { + cn.getRichStringCellValue(); + fail(); + } catch(IllegalStateException e) {} + + assertEquals("Testing", cs.getStringCellValue()); + try { + cs.getNumericCellValue(); + fail(); + } catch(IllegalStateException e) {} + + assertEquals(1.2, cfn.getNumericCellValue(), 0); + try { + cfn.getRichStringCellValue(); + fail(); + } catch(IllegalStateException e) {} + + assertEquals("Testing", cfs.getStringCellValue()); + try { + cfs.getNumericCellValue(); + fail(); + } catch(IllegalStateException e) {} + } } -- 2.39.5