diff --git a/file-leak-detector.exclude b/file-leak-detector.exclude index dc7b6a51b1..e41786dc5b 100644 --- a/file-leak-detector.exclude +++ b/file-leak-detector.exclude @@ -67,6 +67,7 @@ java.text.BreakIterator.getBundle sun.java2d.SunGraphicsEnvironment. org.kohsuke.file_leak_detector.AgentMain.runHttpServer org.apache.log4j.FileAppender.setFile +org.apache.logging.log4j.core.config.ConfigurationSource.getConfigurationSource sun.launcher.LauncherHelper.validateMainClass sun.util.locale.provider.RuleBasedBreakIterator$1.run java.util.ServiceLoader$LazyIterator.hasNextService diff --git a/poi-ooxml/src/test/java/org/apache/poi/extractor/ooxml/TestExtractorFactory.java b/poi-ooxml/src/test/java/org/apache/poi/extractor/ooxml/TestExtractorFactory.java index b94a3454de..55e56107d6 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/extractor/ooxml/TestExtractorFactory.java +++ b/poi-ooxml/src/test/java/org/apache/poi/extractor/ooxml/TestExtractorFactory.java @@ -35,20 +35,16 @@ import org.apache.poi.POIDataSamples; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.extractor.POIOLE2TextExtractor; import org.apache.poi.extractor.POITextExtractor; -import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.extractor.EventBasedExcelExtractor; import org.apache.poi.hssf.extractor.ExcelExtractor; import org.apache.poi.ooxml.extractor.POIXMLExtractorFactory; import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException; -import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.poifs.filesystem.FileMagic; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor; import org.apache.poi.xssf.extractor.XSSFExcelExtractor; -import org.apache.xmlbeans.XmlException; -import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -118,7 +114,7 @@ class TestExtractorFactory { Arguments.of("PowerPoint - pptx", pptx, "XSLFExtractor", 120), Arguments.of("Visio - vsdx", vsdx, "XDGFVisioExtractor", 20) ); - }; + } public static Stream testScratchData() { return Stream.of( @@ -132,12 +128,12 @@ class TestExtractorFactory { Arguments.of("Publisher", pub, "PublisherTextExtractor", 50), Arguments.of("Outlook msg", msg, "OutlookTextExtractor", 50) ); - }; + } public static Stream testFileData() { return Stream.concat(testOOXMLData(), testScratchData()); // TODO Support OOXML-Strict / xlsxStrict, see bug #57699 - }; + } @ParameterizedTest diff --git a/poi-ooxml/src/test/java/org/apache/poi/ss/tests/usermodel/TestConditionalFormattingEval.java b/poi-ooxml/src/test/java/org/apache/poi/ss/tests/usermodel/TestConditionalFormattingEval.java index 4e6257c650..f6903206da 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/ss/tests/usermodel/TestConditionalFormattingEval.java +++ b/poi-ooxml/src/test/java/org/apache/poi/ss/tests/usermodel/TestConditionalFormattingEval.java @@ -18,190 +18,174 @@ package org.apache.poi.ss.tests.usermodel; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -import java.util.Date; -import java.util.List; - import org.apache.poi.ss.formula.ConditionalFormattingEvaluator; import org.apache.poi.ss.formula.EvaluationConditionalFormatRule; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Color; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellReference; -import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -class TestConditionalFormattingEval { +import java.io.IOException; +import java.util.Date; +import java.util.List; - private XSSFWorkbook wb; - private Sheet sheet; - private XSSFFormulaEvaluator formulaEval; - private ConditionalFormattingEvaluator cfe; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +class TestConditionalFormattingEval { private CellReference ref; private List rules; - @BeforeEach - void openWB() { - wb = XSSFTestDataSamples.openSampleWorkbook("ConditionalFormattingSamples.xlsx"); - formulaEval = new XSSFFormulaEvaluator(wb); - cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - } + @Test + void testFormattingEvaluation() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ConditionalFormattingSamples.xlsx")) { + Sheet sheet = wb.getSheet("Products1"); + XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb); + ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - @AfterEach - void closeWB() { - formulaEval = null; - cfe = null; - ref = null; - rules = null; - IOUtils.closeQuietly(wb); + getRulesFor(12, 1, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); + assertFalse(rules.get(0).getRule().getFontFormatting().isItalic(), "should not be italic " + ref); + + getRulesFor(16, 3, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals(0.7999816888943144d, getTint(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), 0.000000000000001, "wrong bg color for " + ref); + + getRulesFor(12, 3, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + + sheet = wb.getSheet("Products2"); + + getRulesFor(15, 1, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); + + getRulesFor(20, 3, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + + // now change a cell value that's an input for the rules + Cell cell = sheet.getRow(1).getCell(6); + cell.setCellValue("Dairy"); + formulaEval.notifyUpdateCell(cell); + cell = sheet.getRow(4).getCell(6); + cell.setCellValue(500); + formulaEval.notifyUpdateCell(cell); + // need to throw away all evaluations, since we don't know how value changes may have affected format formulas + cfe.clearAllCachedValues(); + + // test that the conditional validation evaluations changed + getRulesFor(15, 1, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + + getRulesFor(20, 3, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals(0.7999816888943144d, getTint(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), 0.000000000000001, "wrong bg color for " + ref); + + getRulesFor(20, 1, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); + + sheet = wb.getSheet("Book tour"); + + getRulesFor(8, 2, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + + sheet = wb.getSheet("Compare to totals"); + getRulesFor(3, 2, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals("FFFF0000", getColor(rules.get(0).getRule().getFontFormatting().getFontColor()), "wrong fg color for " + ref); + getRulesFor(3, 3, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + getRulesFor(15, 4, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + getRulesFor(16, 1, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + assertEquals("FFFF0000", getColor(rules.get(0).getRule().getFontFormatting().getFontColor()), "wrong fg color for " + ref); + + sheet = wb.getSheet("Products3"); + sheet.getRow(8).getCell(0).setCellValue(new Date()); + getRulesFor(8, 0, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + getRulesFor(8, 3, sheet, cfe); + assertEquals(1, rules.size(), "wrong # of rules for " + ref); + + sheet = wb.getSheet("Customers2"); + getRulesFor(3, 0, sheet, cfe); + assertEquals(0, rules.size(), "wrong # of rules for " + ref); + } } @Test - void testFormattingEvaluation() { - sheet = wb.getSheet("Products1"); + void testFormattingOnUndefinedCell() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_with_formula_on_second_sheet.xlsx")) { + XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb); + ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - getRulesFor(12, 1); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); - assertFalse(rules.get(0).getRule().getFontFormatting().isItalic(), "should not be italic " + ref); - - getRulesFor(16, 3); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals(0.7999816888943144d, getTint(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), 0.000000000000001, "wrong bg color for " + ref); - - getRulesFor(12, 3); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); - - sheet = wb.getSheet("Products2"); - - getRulesFor(15,1); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); - - getRulesFor(20,3); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); - - // now change a cell value that's an input for the rules - Cell cell = sheet.getRow(1).getCell(6); - cell.setCellValue("Dairy"); - formulaEval.notifyUpdateCell(cell); - cell = sheet.getRow(4).getCell(6); - cell.setCellValue(500); - formulaEval.notifyUpdateCell(cell); - // need to throw away all evaluations, since we don't know how value changes may have affected format formulas - cfe.clearAllCachedValues(); - - // test that the conditional validation evaluations changed - getRulesFor(15,1); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); - - getRulesFor(20,3); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals(0.7999816888943144d, getTint(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), 0.000000000000001, "wrong bg color for " + ref); - - getRulesFor(20,1); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals("FFFFEB9C", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); - - sheet = wb.getSheet("Book tour"); - - getRulesFor(8,2); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - - sheet = wb.getSheet("Compare to totals"); - getRulesFor(3, 2); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals("FFFF0000", getColor(rules.get(0).getRule().getFontFormatting().getFontColor()), "wrong fg color for " + ref); - getRulesFor(3, 3); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); - getRulesFor(15, 4); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); - getRulesFor(16, 1); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - assertEquals("FFFF0000", getColor(rules.get(0).getRule().getFontFormatting().getFontColor()), "wrong fg color for " + ref); - - sheet = wb.getSheet("Products3"); - sheet.getRow(8).getCell(0).setCellValue(new Date()); - getRulesFor(8, 0); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - getRulesFor(8, 3); - assertEquals(1, rules.size(), "wrong # of rules for " + ref); - - sheet = wb.getSheet("Customers2"); - getRulesFor(3, 0); - assertEquals(0, rules.size(), "wrong # of rules for " + ref); + Sheet sheet = wb.getSheet("Sales Plan"); + getRulesFor(9, 2, sheet, cfe); + assertNotEquals(0, rules.size(), "No rules for " + ref); + assertEquals("FFFFFF00", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); + } } @Test - void testFormattingOnUndefinedCell() { - wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_with_formula_on_second_sheet.xlsx"); - formulaEval = new XSSFFormulaEvaluator(wb); - cfe = new ConditionalFormattingEvaluator(wb, formulaEval); + void testRepeatedEval() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("test_conditional_formatting.xlsx")) { + XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb); + ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - sheet = wb.getSheet("Sales Plan"); - getRulesFor(9,2); - assertNotEquals(0, rules.size(), "No rules for " + ref); - assertEquals("FFFFFF00", getColor(rules.get(0).getRule().getPatternFormatting().getFillBackgroundColorColor()), "wrong bg color for " + ref); + Sheet sheet = wb.getSheetAt(0); + assertEquals(0, getRulesFor(2, 1, sheet, cfe).size(), "no rules should apply"); + + assertEquals(0, getRulesFor(2, 1, sheet, cfe).size(), "no rules should apply"); + } } @Test - void testRepeatedEval() { - wb = XSSFTestDataSamples.openSampleWorkbook("test_conditional_formatting.xlsx"); - formulaEval = new XSSFFormulaEvaluator(wb); - cfe = new ConditionalFormattingEvaluator(wb, formulaEval); + void testCellValueIsWrongType() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_cell_is.xlsx")) { + XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb); + ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - sheet = wb.getSheetAt(0); - assertEquals(0, getRulesFor(2, 1).size(), "no rules should apply"); - - assertEquals(0, getRulesFor(2, 1).size(), "no rules should apply"); + Sheet sheet = wb.getSheetAt(1); + assertEquals(1, getRulesFor(3, 1, sheet, cfe).size(), "wrong # of matching rules"); + } } @Test - void testCellValueIsWrongType() { - wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_cell_is.xlsx"); - formulaEval = new XSSFFormulaEvaluator(wb); - cfe = new ConditionalFormattingEvaluator(wb, formulaEval); + void testRangeCondition() throws IOException { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_multiple_ranges.xlsx")) { + XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb); + ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - sheet = wb.getSheetAt(1); + Sheet sheet = wb.getSheetAt(0); - assertEquals(1, getRulesFor(3, 1).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(0, 0, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(1, 0, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(2, 0, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(1, getRulesFor(3, 0, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(0, 1, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(1, 1, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(1, getRulesFor(2, 1, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(1, getRulesFor(3, 1, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(1, getRulesFor(0, 3, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(1, 3, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(1, getRulesFor(2, 3, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(0, 6, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(3, 6, sheet, cfe).size(), "wrong # of matching rules"); + assertEquals(0, getRulesFor(2, 6, sheet, cfe).size(), "wrong # of matching rules"); + } } - @Test - void testRangeCondition() { - wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_multiple_ranges.xlsx"); - formulaEval = new XSSFFormulaEvaluator(wb); - cfe = new ConditionalFormattingEvaluator(wb, formulaEval); - - sheet = wb.getSheetAt(0); - - assertEquals(0, getRulesFor(0, 0).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(1, 0).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(2, 0).size(), "wrong # of matching rules"); - assertEquals(1, getRulesFor(3, 0).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(0, 1).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(1, 1).size(), "wrong # of matching rules"); - assertEquals(1, getRulesFor(2, 1).size(), "wrong # of matching rules"); - assertEquals(1, getRulesFor(3, 1).size(), "wrong # of matching rules"); - assertEquals(1, getRulesFor(0, 3).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(1, 3).size(), "wrong # of matching rules"); - assertEquals(1, getRulesFor(2, 3).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(0, 6).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(3, 6).size(), "wrong # of matching rules"); - assertEquals(0, getRulesFor(2, 6).size(), "wrong # of matching rules"); - } - - private List getRulesFor(int row, int col) { + private List getRulesFor(int row, int col, Sheet sheet, ConditionalFormattingEvaluator cfe) { ref = new CellReference(sheet.getSheetName(), row, col, false, false); return rules = cfe.getConditionalFormattingForCell(ref); }