klute 2003/08/30 02:11:59 Modified: src/testcases/org/apache/poi/hpsf/basic POIFile.java TestBasic.java TestUnicode.java Added: src/testcases/org/apache/poi/hpsf/basic TestWrite.java Log: Test cases for HPSF writing capability added. Revision Changes Path 1.4 +32 -1 jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/POIFile.java Index: POIFile.java =================================================================== RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/POIFile.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- POIFile.java 26 Jul 2003 06:57:33 -0000 1.3 +++ POIFile.java 30 Aug 2003 09:11:59 -0000 1.4 @@ -72,31 +72,62 @@ private POIFSDocumentPath path; private byte[] bytes; + + /** + * <p>Sets the POI file's name.</p> + * + * @param name The POI file's name. + */ public void setName(final String name) { this.name = name; } + /** + * <p>Returns the POI file's name.</p> + * + * @return The POI file's name. + */ public String getName() { return name; } + /** + * <p>Sets the POI file's path.</p> + * + * @param path The POI file's path. + */ public void setPath(final POIFSDocumentPath path) { this.path = path; } + /** + * <p>Returns the POI file's path.</p> + * + * @return The POI file's path. + */ public POIFSDocumentPath getPath() { return path; } + /** + * <p>Sets the POI file's content bytes.</p> + * + * @param bytes The POI file's content bytes. + */ public void setBytes(final byte[] bytes) { this.bytes = bytes; } + /** + * <p>Returns the POI file's content bytes.</p> + * + * @return The POI file's content bytes. + */ public byte[] getBytes() { return bytes; 1.7 +17 -10 jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java Index: TestBasic.java =================================================================== RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/TestBasic.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- TestBasic.java 23 Aug 2003 15:31:10 -0000 1.6 +++ TestBasic.java 30 Aug 2003 09:11:59 -0000 1.7 @@ -55,16 +55,11 @@ package org.apache.poi.hpsf.basic; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.StringWriter; import junit.framework.Assert; import junit.framework.TestCase; @@ -77,8 +72,6 @@ import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hpsf.UnexpectedPropertySetTypeException; -import org.apache.poi.poifs.filesystem.DocumentEntry; -import org.apache.poi.poifs.filesystem.POIFSFileSystem; @@ -122,6 +115,11 @@ + /** + * <p>Test case constructor.</p> + * + * @param name The test case's name. + */ public TestBasic(final String name) { super(name); @@ -131,6 +129,9 @@ /** * <p>Read a the test file from the "data" directory.</p> + * + * @exception FileNotFoundException if the file to be read does not exist. + * @exception IOException if any other I/O exception occurs. */ public void setUp() throws FileNotFoundException, IOException { @@ -146,6 +147,8 @@ /** * <p>Checks the names of the files in the POI filesystem. They * are expected to be in a certain order.</p> + * + * @exception IOException if an I/O exception occurs */ public void testReadFiles() throws IOException { @@ -164,6 +167,8 @@ * property sets. In the latter cases a [EMAIL PROTECTED] * NoPropertySetStreamException} will be thrown when trying to * create a [EMAIL PROTECTED] PropertySet}.</p> + * + * @exception IOException if an I/O exception occurs */ public void testCreatePropertySets() throws IOException { @@ -206,6 +211,9 @@ * <p>Tests the [EMAIL PROTECTED] PropertySet} methods. The test file has two * property sets: the first one is a [EMAIL PROTECTED] SummaryInformation}, * the second one is a [EMAIL PROTECTED] DocumentSummaryInformation}.</p> + * + * @exception IOException if an I/O exception occurs + * @exception HPSFException if any HPSF exception occurs */ public void testPropertySetMethods() throws IOException, HPSFException { @@ -251,7 +259,6 @@ for (int i = 0; i < fileList.length; i++) { File f = fileList[i]; - System.out.println("Reading file " + f); /* Read the POI filesystem's property set streams: */ final POIFile[] psf1 = Util.readPropertySets(f); @@ -266,7 +273,7 @@ catch (Throwable t) { final String s = Util.toString(t); - System.err.println(s); + fail(s); } } 1.4 +9 -1 jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java Index: TestUnicode.java =================================================================== RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/TestUnicode.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TestUnicode.java 26 Jul 2003 06:57:33 -0000 1.3 +++ TestUnicode.java 30 Aug 2003 09:11:59 -0000 1.4 @@ -104,6 +104,9 @@ /** * <p>Read a the test file from the "data" directory.</p> + * + * @exception FileNotFoundException if the file to be read does not exist. + * @exception IOException if any other I/O exception occurs */ protected void setUp() throws FileNotFoundException, IOException { @@ -118,6 +121,9 @@ * <p>Tests the [EMAIL PROTECTED] PropertySet} methods. The test file has two * property set: the first one is a [EMAIL PROTECTED] SummaryInformation}, * the second one is a [EMAIL PROTECTED] DocumentSummaryInformation}.</p> + * + * @exception IOException if an I/O exception occurs + * @exception HPSFException if an HPSF exception occurs */ public void testPropertySetMethods() throws IOException, HPSFException { @@ -144,6 +150,8 @@ /** * <p>Runs the test cases stand-alone.</p> + * + * @param args Command-line arguments. */ public static void main(final String[] args) { 1.1 jakarta-poi/src/testcases/org/apache/poi/hpsf/basic/TestWrite.java Index: TestWrite.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache POI" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache POI", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.poi.hpsf.basic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.Iterator; import junit.framework.TestCase; import org.apache.poi.hpsf.HPSFRuntimeException; import org.apache.poi.hpsf.MutableProperty; import org.apache.poi.hpsf.MutablePropertySet; import org.apache.poi.hpsf.MutableSection; import org.apache.poi.hpsf.Property; import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.Section; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hpsf.UnsupportedVariantTypeException; import org.apache.poi.hpsf.Variant; import org.apache.poi.hpsf.VariantSupport; import org.apache.poi.hpsf.wellknown.SectionIDMap; import org.apache.poi.poifs.eventfilesystem.POIFSReader; import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent; import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.LittleEndian; /** * <p>Tests HPSF's writing functionality.</p> * * @author Rainer Klute ([EMAIL PROTECTED]) * @since 2003-02-07 * @version $Id: TestWrite.java,v 1.1 2003/08/30 09:11:59 klute Exp $ */ public class TestWrite extends TestCase { static final String POI_FS = "TestHPSFWritingFunctionality.doc"; static final int BYTE_ORDER = 0xfffe; static final int FORMAT = 0x0000; static final int OS_VERSION = 0x00020A04; static final int[] SECTION_COUNT = {1, 2}; static final boolean[] IS_SUMMARY_INFORMATION = {true, false}; static final boolean[] IS_DOCUMENT_SUMMARY_INFORMATION = {false, true}; POIFile[] poiFiles; /** * <p>Constructor</p> * * @param name the test case's name */ public TestWrite(final String name) { super(name); } /** * @see TestCase#setUp() */ public void setUp() { VariantSupport.setLogUnsupportedTypes(false); } /** * <p>Writes an empty property set to a POIFS and reads it back * in.</p> * * @exception IOException if an I/O exception occurs * @exception UnsupportedVariantTypeException if HPSF does not yet support * a variant type to be written */ public void testWriteEmptyPropertySet() throws IOException, UnsupportedVariantTypeException { final File dataDir = new File(System.getProperty("HPSF.testdata.path")); final File filename = new File(dataDir, POI_FS); filename.deleteOnExit(); /* Create a mutable property set and write it to a POIFS: */ final OutputStream out = new FileOutputStream(filename); final POIFSFileSystem poiFs = new POIFSFileSystem(); final MutablePropertySet ps = new MutablePropertySet(); final MutableSection s = (MutableSection) ps.getSections().get(0); s.setFormatID(SectionIDMap.SUMMARY_INFORMATION_ID); final ByteArrayOutputStream psStream = new ByteArrayOutputStream(); ps.write(psStream); psStream.close(); final byte[] streamData = psStream.toByteArray(); poiFs.createDocument(new ByteArrayInputStream(streamData), SummaryInformation.DEFAULT_STREAM_NAME); poiFs.writeFilesystem(out); out.close(); /* Read the POIFS: */ final POIFSReader r = new POIFSReader(); r.registerListener(new MyPOIFSReaderListener(), SummaryInformation.DEFAULT_STREAM_NAME); r.read(new FileInputStream(filename)); } static class MyPOIFSReaderListener implements POIFSReaderListener { public void processPOIFSReaderEvent(final POIFSReaderEvent event) { try { PropertySetFactory.create(event.getStream()); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } } /** * <p>Writes and reads back various variant types and checks whether the * stuff that has been read back equals the stuff that was written.</p> */ public void testVariantTypes() { Throwable t = null; try { check(Variant.VT_EMPTY, null); check(Variant.VT_BOOL, new Boolean(true)); check(Variant.VT_BOOL, new Boolean(false)); check(Variant.VT_CF, new byte[]{0}); check(Variant.VT_CF, new byte[]{0, 1}); check(Variant.VT_CF, new byte[]{0, 1, 2}); check(Variant.VT_CF, new byte[]{0, 1, 2, 3}); check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4}); check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4, 5}); check(Variant.VT_CF, new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); check(Variant.VT_I2, new Integer(27)); check(Variant.VT_I4, new Long(28)); check(Variant.VT_FILETIME, new Date()); check(Variant.VT_LPSTR, ""); check(Variant.VT_LPSTR, "ä"); check(Variant.VT_LPSTR, "äö"); check(Variant.VT_LPSTR, "äöü"); check(Variant.VT_LPSTR, "äöüÄ"); check(Variant.VT_LPSTR, "äöüÄÖ"); check(Variant.VT_LPSTR, "äöüÄÖÜ"); check(Variant.VT_LPSTR, "äöüÄÖÜß"); check(Variant.VT_LPWSTR, ""); check(Variant.VT_LPWSTR, "ä"); check(Variant.VT_LPWSTR, "äö"); check(Variant.VT_LPWSTR, "äöü"); check(Variant.VT_LPWSTR, "äöüÄ"); check(Variant.VT_LPWSTR, "äöüÄÖ"); check(Variant.VT_LPWSTR, "äöüÄÖÜ"); check(Variant.VT_LPWSTR, "äöüÄÖÜß"); } catch (Exception ex) { t = ex; } catch (Error ex) { t = ex; } if (t != null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); pw.close(); try { sw.close(); } catch (IOException ex2) { t.printStackTrace(); } fail(sw.toString()); } } /** * <p>Writes a property and reads it back in.</p> * * @param variantType The property's variant type. * @param value The property's value. * @throws UnsupportedVariantTypeException if the variant is not supported. * @throws IOException if an I/O exception occurs. */ private void check(final long variantType, final Object value) throws UnsupportedVariantTypeException, IOException { final ByteArrayOutputStream out = new ByteArrayOutputStream(); VariantSupport.write(out, variantType, value); out.close(); final byte[] b = out.toByteArray(); final Object objRead = VariantSupport.read(b, 0, b.length + LittleEndian.INT_SIZE, variantType); if (objRead instanceof byte[]) { final int diff = diff(org.apache.poi.hpsf.Util.pad4 ((byte[]) value), (byte[]) objRead); if (diff >= 0) fail("Byte arrays are different. First different byte is at " + "index " + diff + "."); } else assertEquals(value, objRead); } /** * <p>Compares two byte arrays.</p> * * @param a The first byte array * @param b The second byte array * @return The index of the first byte that is different. If the byte arrays * are equal, -1 is returned. */ private int diff(final byte[] a, final byte[] b) { final int min = Math.min(a.length, b.length); for (int i = 0; i < min; i++) if (a[i] != b[i]) return i; if (a.length != b.length) return min; return -1; } /** * <p>This test method does a write and read back test with all POI * filesystems in the "data" directory by performing the following * actions for each file:</p> * * <ul> * * <li><p>Read its property set streams.</p></li> * * <li><p>Create a new POI filesystem containing the origin file's * property set streams.</p></li> * * <li><p>Read the property set streams from the POI filesystem just * created.</p></li> * * <li><p>Compare each property set stream with the corresponding one from * the origin file and check whether they are equal.</p></li> * * </ul> */ public void testRecreate() { final File dataDir = new File(System.getProperty("HPSF.testdata.path")); final File[] fileList = dataDir.listFiles(new FileFilter() { public boolean accept(final File f) { return f.isFile(); } }); for (int i = 0; i < fileList.length; i++) testRecreate(fileList[i]); } /** * <p>Performs the check described in [EMAIL PROTECTED] #testRecreate()} for a single * POI filesystem.</p> * * @param f the POI filesystem to check */ private void testRecreate(final File f) { try { /* Read the POI filesystem's property set streams: */ final POIFile[] psf1 = Util.readPropertySets(f); /* Create a new POI filesystem containing the origin file's * property set streams: */ final File copy = File.createTempFile(f.getName(), ""); copy.deleteOnExit(); final OutputStream out = new FileOutputStream(copy); final POIFSFileSystem poiFs = new POIFSFileSystem(); for (int i = 0; i < psf1.length; i++) { final InputStream in = new ByteArrayInputStream(psf1[i].getBytes()); final PropertySet psIn = PropertySetFactory.create(in); final MutablePropertySet psOut = copy(psIn); final ByteArrayOutputStream psStream = new ByteArrayOutputStream(); psOut.write(psStream); psStream.close(); final byte[] streamData = psStream.toByteArray(); poiFs.createDocument(new ByteArrayInputStream(streamData), psf1[i].getName()); poiFs.writeFilesystem(out); } out.close(); /* Read the property set streams from the POI filesystem just * created. */ final POIFile[] psf2 = Util.readPropertySets(copy); for (int i = 0; i < psf2.length; i++) { final byte[] bytes1 = psf1[i].getBytes(); final byte[] bytes2 = psf2[i].getBytes(); final InputStream in1 = new ByteArrayInputStream(bytes1); final InputStream in2 = new ByteArrayInputStream(bytes2); final PropertySet ps1 = PropertySetFactory.create(in1); final PropertySet ps2 = PropertySetFactory.create(in2); /* Compare the property set stream with the corresponding one * from the origin file and check whether they are equal. */ assertEquals(ps1, ps2); } } catch (Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Throwable t = ex; while (t != null) { t.printStackTrace(pw); if (t instanceof HPSFRuntimeException) t = ((HPSFRuntimeException) t).getReason(); else t = null; if (t != null) pw.println("Caused by:"); } pw.close(); try { sw.close(); } catch (IOException ex2) { ex.printStackTrace(); } String msg = sw.toString(); fail(msg); } } /** * <p>Creates a copy of a [EMAIL PROTECTED] PropertySet}.</p> * * @param ps the property set to copy * @return the copy */ private MutablePropertySet copy(final PropertySet ps) { MutablePropertySet copy = new MutablePropertySet(); copy.setByteOrder(ps.getByteOrder()); copy.setClassID(ps.getClassID()); copy.setFormat(ps.getFormat()); copy.setOSVersion(ps.getOSVersion()); copy.clearSections(); /* Copy the sections. */ for (final Iterator i1 = ps.getSections().iterator(); i1.hasNext();) { final Section s1 = (Section) i1.next(); final MutableSection s2 = new MutableSection(); s2.setFormatID(s1.getFormatID()); /* Copy the properties. */ final Property[] pa = s1.getProperties(); for (int i2 = 0; i2 < pa.length; i2++) { final Property p1 = pa[i2]; final MutableProperty p2 = new MutableProperty(); p2.setID(p1.getID()); p2.setType(p1.getType()); p2.setValue(p1.getValue()); s2.setProperty(p2); } copy.addSection(s2); } return copy; } /** * <p>Runs the test cases stand-alone.</p> */ 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(TestWrite.class); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]