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<EvaluationConditionalFormatRule> rules;
- @BeforeEach
- void openWB() {
- wb = XSSFTestDataSamples.openSampleWorkbook("ConditionalFormattingSamples.xlsx");
- formulaEval = new XSSFFormulaEvaluator(wb);
- cfe = new ConditionalFormattingEvaluator(wb, formulaEval);
- }
-
- @AfterEach
- void closeWB() {
- formulaEval = null;
- cfe = null;
- ref = null;
- rules = null;
- IOUtils.closeQuietly(wb);
- }
-
@Test
- void testFormattingEvaluation() {
- sheet = wb.getSheet("Products1");
-
- 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);
+ 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);
+
+ 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 testFormattingOnUndefinedCell() {
- wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_with_formula_on_second_sheet.xlsx");
- formulaEval = new XSSFFormulaEvaluator(wb);
- 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);
+ 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);
+
+ 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 testRepeatedEval() {
- wb = XSSFTestDataSamples.openSampleWorkbook("test_conditional_formatting.xlsx");
- formulaEval = new XSSFFormulaEvaluator(wb);
- cfe = new ConditionalFormattingEvaluator(wb, formulaEval);
-
- sheet = wb.getSheetAt(0);
- assertEquals(0, getRulesFor(2, 1).size(), "no rules should apply");
+ void testRepeatedEval() throws IOException {
+ try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("test_conditional_formatting.xlsx")) {
+ XSSFFormulaEvaluator formulaEval = new XSSFFormulaEvaluator(wb);
+ ConditionalFormattingEvaluator cfe = new ConditionalFormattingEvaluator(wb, formulaEval);
- assertEquals(0, getRulesFor(2, 1).size(), "no rules should apply");
+ 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 testCellValueIsWrongType() {
- wb = XSSFTestDataSamples.openSampleWorkbook("conditional_formatting_cell_is.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(1);
+ Sheet sheet = wb.getSheetAt(1);
- assertEquals(1, getRulesFor(3, 1).size(), "wrong # of matching rules");
+ assertEquals(1, getRulesFor(3, 1, 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");
+ 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 sheet = wb.getSheetAt(0);
+
+ 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");
+ }
}
- private List<EvaluationConditionalFormatRule> getRulesFor(int row, int col) {
+ private List<EvaluationConditionalFormatRule> getRulesFor(int row, int col, Sheet sheet, ConditionalFormattingEvaluator cfe) {
ref = new CellReference(sheet.getSheetName(), row, col, false, false);
return rules = cfe.getConditionalFormattingForCell(ref);
}