From 9f9ff14e56f98ac48d37c993b34793e7d0dd7cf0 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 28 Aug 2025 13:00:54 +0100 Subject: [PATCH] add test --- .../apache/poi/xslf/XSLFReadException.java | 3 +- .../apache/poi/xssf/XSSFReadException.java | 3 +- .../apache/poi/xwpf/XWPFReadException.java | 3 +- .../org/apache/poi/xssf/TestXSSFParser.java | 47 ++++++++++++++++++ .../apache/poi/hslf/HSLFReadException.java | 3 +- .../apache/poi/hwpf/HWPFReadException.java | 3 +- .../apache/poi/hssf/HSSFReadException.java | 3 +- .../HeaderFooterComplexFormats.xlsx | Bin 9543 -> 7513 bytes 8 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 poi-ooxml/src/test/java/org/apache/poi/xssf/TestXSSFParser.java diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/XSLFReadException.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/XSLFReadException.java index bdb8c800d1..e26900cde8 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xslf/XSLFReadException.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/XSLFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.xslf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading a pptx file. + * An exception that indicates a problem reading a pptx file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/XSSFReadException.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/XSSFReadException.java index 545dd0ffbf..f2dbac32c9 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/XSSFReadException.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/XSSFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.xssf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading an xlsx file. + * An exception that indicates a problem reading an xlsx file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/XWPFReadException.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/XWPFReadException.java index 1b0e6a5bae..3379b16999 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/XWPFReadException.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/XWPFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.xwpf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading a docx file. + * An exception that indicates a problem reading a docx file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/TestXSSFParser.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/TestXSSFParser.java new file mode 100644 index 0000000000..3d60986240 --- /dev/null +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/TestXSSFParser.java @@ -0,0 +1,47 @@ +/* ==================================================================== + 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; + +import java.io.File; + +import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class TestXSSFParser { + @Test + void testXlsx() throws Exception { + final File file = HSSFTestDataSamples.getSampleFile("HeaderFooterComplexFormats.xlsx"); + try (XSSFWorkbook wb = XSSFParser.parse(file)) { + assertNotNull(wb); + assertEquals(3, wb.getNumberOfSheets()); + } + } + + @Test + void testFailOnXls() throws Exception { + final File file = HSSFTestDataSamples.getSampleFile("44010-SingleChart.xls"); + XSSFReadException xre = assertThrows(XSSFReadException.class, () -> XSSFParser.parse(file)); + assertInstanceOf(OLE2NotOfficeXmlFileException.class, xre.getCause()); + } +} diff --git a/poi-scratchpad/src/main/java/org/apache/poi/hslf/HSLFReadException.java b/poi-scratchpad/src/main/java/org/apache/poi/hslf/HSLFReadException.java index 75312472ac..4411401873 100644 --- a/poi-scratchpad/src/main/java/org/apache/poi/hslf/HSLFReadException.java +++ b/poi-scratchpad/src/main/java/org/apache/poi/hslf/HSLFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.hslf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading a ppt file. + * An exception that indicates a problem reading a ppt file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/HWPFReadException.java b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/HWPFReadException.java index ec3ce80bc4..f740d45b63 100644 --- a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/HWPFReadException.java +++ b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/HWPFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.hwpf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading a doc file. + * An exception that indicates a problem reading a doc file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/poi/src/main/java/org/apache/poi/hssf/HSSFReadException.java b/poi/src/main/java/org/apache/poi/hssf/HSSFReadException.java index 1bc2ae207a..4f77a6a720 100644 --- a/poi/src/main/java/org/apache/poi/hssf/HSSFReadException.java +++ b/poi/src/main/java/org/apache/poi/hssf/HSSFReadException.java @@ -19,7 +19,8 @@ package org.apache.poi.hssf; import org.apache.poi.POIException; /** - * An exception that indicates a problem reading an xls file. + * An exception that indicates a problem reading an xls file. Usually, a more + * specific exception will be wrapped as the cause. *

This exception is only used by some new methods. * Historically, POI has used {@link RuntimeException} for most of its * exceptions, but this is not a good practice. This class is a checked diff --git a/test-data/spreadsheet/HeaderFooterComplexFormats.xlsx b/test-data/spreadsheet/HeaderFooterComplexFormats.xlsx index 337f425440abb3d0b41951a9abb82a5246b7d541..6dfc2040f574f77b3b831773b9f8bce6478a23c7 100644 GIT binary patch literal 7513 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 literal 9543 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 Tk!=1^E8zoNk%E9T{J8pmWnwT8