From 959587f1e4e4fef019d01256c2ee32362ca5ea3a Mon Sep 17 00:00:00 2001 From: Rainer Klute Date: Sat, 26 Jul 2003 21:25:14 +0000 Subject: [PATCH] Test case for bug 21775 git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353252 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hpsf/basic/TestEmptyProperties.java | 189 ++++++++++++++++++ .../org/apache/poi/hpsf/data/TestCorel.shw | Bin 0 -> 76800 bytes 2 files changed, 189 insertions(+) create mode 100644 src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java create mode 100755 src/testcases/org/apache/poi/hpsf/data/TestCorel.shw diff --git a/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java b/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java new file mode 100644 index 0000000000..fbe9fbf7f9 --- /dev/null +++ b/src/testcases/org/apache/poi/hpsf/basic/TestEmptyProperties.java @@ -0,0 +1,189 @@ +package org.apache.poi.hpsf.basic; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.poi.hpsf.HPSFException; +import org.apache.poi.hpsf.MarkUnsupportedException; +import org.apache.poi.hpsf.NoPropertySetStreamException; +import org.apache.poi.hpsf.PropertySet; +import org.apache.poi.hpsf.PropertySetFactory; +import org.apache.poi.hpsf.SummaryInformation; +import org.apache.poi.hpsf.UnexpectedPropertySetTypeException; + +/** + *

Test case for OLE2 files with empty properties. An empty property's type + * is {@link Variant.VT_EMPTY}.

+ * + * @author Rainer Klute <klute@rainer-klute.de> + * @since 2003-07-25 + * @version $Id$ + */ +public class TestEmptyProperties extends TestCase +{ + + /** + *

This test file's summary information stream contains some empty + * properties.

+ */ + static final String POI_FS = "TestCorel.shw"; + + static final String[] POI_FILES = new String[] + { + "PerfectOffice_MAIN", + "\005SummaryInformation", + "Main" + }; + + POIFile[] poiFiles; + + + + /** + *

Constructor

+ * + * @param name The name of the test case + */ + public TestEmptyProperties(final String name) + { + super(name); + } + + + + /** + *

Read a the test file from the "data" directory.

+ * + * @exception FileNotFoundException if the file containing the test data + * does not exist + * @exception IOException if an I/O exception occurs + */ + public void setUp() throws FileNotFoundException, IOException + { + final File dataDir = + new File(System.getProperty("HPSF.testdata.path")); + final File data = new File(dataDir, POI_FS); + + poiFiles = Util.readPOIFiles(data); + } + + + + /** + *

Checks the names of the files in the POI filesystem. They + * are expected to be in a certain order.

+ * + * @exception IOException if an I/O exception occurs + */ + public void testReadFiles() throws IOException + { + String[] expected = POI_FILES; + for (int i = 0; i < expected.length; i++) + Assert.assertEquals(poiFiles[i].getName(), expected[i]); + } + + + + /** + *

Tests whether property sets can be created from the POI + * files in the POI file system. This test case expects the first + * file to be a {@link SummaryInformation}, the second file to be + * a {@link DocumentSummaryInformation} and the rest to be no + * property sets. In the latter cases a {@link + * NoPropertySetStreamException} will be thrown when trying to + * create a {@link PropertySet}.

+ * + * @exception IOException if an I/O exception occurs + */ + public void testCreatePropertySets() throws IOException + { + Class[] expected = new Class[] + { + NoPropertySetStreamException.class, + SummaryInformation.class, + NoPropertySetStreamException.class + }; + for (int i = 0; i < expected.length; i++) + { + InputStream in = new ByteArrayInputStream(poiFiles[i].getBytes()); + Object o; + try + { + o = PropertySetFactory.create(in); + } + catch (NoPropertySetStreamException ex) + { + o = ex; + } + catch (UnexpectedPropertySetTypeException ex) + { + o = ex; + } + catch (MarkUnsupportedException ex) + { + o = ex; + } + in.close(); + Assert.assertEquals(o.getClass(), expected[i]); + } + } + + + + /** + *

Tests the {@link PropertySet} methods. The test file has two + * property sets: the first one is a {@link SummaryInformation}, + * the second one is a {@link DocumentSummaryInformation}.

+ * + * @exception IOException if an I/O exception occurs + * @exception HPSFException if an HPSF operation fails + */ + public void testPropertySetMethods() throws IOException, HPSFException + { + byte[] b = poiFiles[1].getBytes(); + PropertySet ps = + PropertySetFactory.create(new ByteArrayInputStream(b)); + SummaryInformation s = (SummaryInformation) ps; + assertNull(s.getTitle()); + assertNull(s.getSubject()); + assertNotNull(s.getAuthor()); + assertNull(s.getKeywords()); + assertNull(s.getComments()); + assertNotNull(s.getTemplate()); + assertNotNull(s.getLastAuthor()); + assertNotNull(s.getRevNumber()); + assertNull(s.getEditTime()); + assertNull(s.getLastPrinted()); + assertNull(s.getCreateDateTime()); + assertNull(s.getLastSaveDateTime()); + assertEquals(s.getPageCount(), 0); + assertEquals(s.getWordCount(), 0); + assertEquals(s.getCharCount(), 0); + assertNull(s.getThumbnail()); + assertNull(s.getApplicationName()); + } + + + + /** + *

Runs the test cases stand-alone.

+ * + * @param args the command-line arguments (unused) + * + * @exception Throwable if any exception or error occurs + */ + public static void main(final String[] args) throws Throwable + { + System.setProperty("HPSF.testdata.path", + "./src/testcases/org/apache/poi/hpsf/data"); + junit.textui.TestRunner.run(TestBasic.class); + } + +} diff --git a/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw b/src/testcases/org/apache/poi/hpsf/data/TestCorel.shw new file mode 100755 index 0000000000000000000000000000000000000000..e0af1945e89de1496ce534f58017395113c8b819 GIT binary patch literal 76800 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