diff --git a/poi/src/test/java/org/apache/poi/ss/formula/atp/TestAnalysisToolPak.java b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestAnalysisToolPak.java new file mode 100644 index 0000000000..fc6fa5b5f6 --- /dev/null +++ b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestAnalysisToolPak.java @@ -0,0 +1,58 @@ +package org.apache.poi.ss.formula.atp; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.FreeRefFunction; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class TestAnalysisToolPak { + private static class NullFunction implements FreeRefFunction { + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + return ErrorEval.DIV_ZERO; + } + } + + @Test + void testOverrideKnownButUnimplemented() { + // JIS is a known function in Excel, but it is not implemented in POI + AnalysisToolPak.registerFunction("JIS", new NullFunction()); + try (HSSFWorkbook workbook = new HSSFWorkbook()) { + HSSFSheet sheet = workbook.createSheet("Sheet1"); + HSSFCell cell = sheet.createRow(0).createCell(0); + cell.setCellFormula("JIS(\"test\")"); + workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); + assertEquals(ErrorEval.DIV_ZERO.getErrorCode(), cell.getErrorCellValue()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + void testOverrideUnknown() { + assertThrows(IllegalArgumentException.class, () -> { + AnalysisToolPak.registerFunction("UNKNOWN", new NullFunction()); + }); + } + + @Test + void testOverrideUnknownButForceAllowed() { + AnalysisToolPak.registerFunction("FAKE", new NullFunction(), true); + try (HSSFWorkbook workbook = new HSSFWorkbook()) { + HSSFSheet sheet = workbook.createSheet("Sheet1"); + HSSFCell cell = sheet.createRow(0).createCell(0); + cell.setCellFormula("FAKE(\"test\")"); + workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); + assertEquals(ErrorEval.DIV_ZERO.getErrorCode(), cell.getErrorCellValue()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +}