glens 02/04/29 04:10:29
Modified: src/java/org/apache/poi/hssf/model Workbook.java
src/java/org/apache/poi/hssf/util HSSFColor.java
src/testcases/org/apache/poi/hssf/usermodel
TestCellStyle.java TestWorkbook.java
Added: src/testcases/org/apache/poi/hssf/usermodel
SanityChecker.java
Log:
Some testing related stuff. The first shot at a sanity tester for XLS record
structure. Needs heaps more checks but it's a start.
Revision Changes Path
1.6 +5 -0 jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java
Index: Workbook.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Workbook.java 23 Apr 2002 22:24:40 -0000 1.5
+++ Workbook.java 29 Apr 2002 11:10:29 -0000 1.6
@@ -1772,4 +1772,9 @@
}
return null;
}
+
+ public List getRecords()
+ {
+ return records;
+ }
}
1.4 +4 -4 jakarta-poi/src/java/org/apache/poi/hssf/util/HSSFColor.java
Index: HSSFColor.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/util/HSSFColor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- HSSFColor.java 7 Apr 2002 17:28:27 -0000 1.3
+++ HSSFColor.java 29 Apr 2002 11:10:29 -0000 1.4
@@ -87,7 +87,7 @@
* it takes to create it once per request but you will not hold onto it
* if you have none of those requests.
*
- * @returns a hashtable containing all colors mapped to their gnumeric-like
+ * @return a hashtable containing all colors mapped to their gnumeric-like
* triplet string
*/
@@ -148,7 +148,7 @@
}
/**
- * @returns index to the standard palet
+ * @return index to the standard palet
*/
public short getIndex()
@@ -157,7 +157,7 @@
}
/**
- * @returns short[] triplet representation like that in Excel
+ * @return triplet representation like that in Excel
*/
public short [] getTriplet()
@@ -168,7 +168,7 @@
// its a hack but its a good hack
/**
- * @returns a hex string exactly like a gnumeric triplet
+ * @return a hex string exactly like a gnumeric triplet
*/
public String getHexString()
1.6 +9 -3
jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java
Index: TestCellStyle.java
===================================================================
RCS file:
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestCellStyle.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TestCellStyle.java 15 Mar 2002 02:47:56 -0000 1.5
+++ TestCellStyle.java 29 Apr 2002 11:10:29 -0000 1.6
@@ -127,7 +127,9 @@
}
wb.write(out);
out.close();
- assertEquals("FILE LENGTH == 87040", file.length(), 87040);
+ SanityChecker sanityChecker = new SanityChecker();
+ sanityChecker.checkHSSFWorkbook(wb);
+ assertEquals("FILE LENGTH == 87040", file.length(), 87040); // remove me
assertEquals("LAST ROW == 99", 99, s.getLastRowNum());
assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum());
@@ -164,8 +166,10 @@
wb.write(out);
out.close();
+ SanityChecker sanityChecker = new SanityChecker();
+ sanityChecker.checkHSSFWorkbook(wb);
- assertEquals("FILE LENGTH ", 5632, file.length());
+ assertEquals("FILE LENGTH ", 5632, file.length()); // remove me
assertEquals("LAST ROW ", 0, s.getLastRowNum());
assertEquals("FIRST ROW ", 0, s.getFirstRowNum());
@@ -226,7 +230,9 @@
}
wb.write(out);
out.close();
- assertEquals("FILE LENGTH == 87040", file.length(), 87040);
+ SanityChecker sanityChecker = new SanityChecker();
+ sanityChecker.checkHSSFWorkbook(wb);
+ assertEquals("FILE LENGTH == 87040", file.length(), 87040); // remove me
assertEquals("LAST ROW == 99", 99, s.getLastRowNum());
assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum());
1.2 +11 -25
jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java
Index: TestWorkbook.java
===================================================================
RCS file:
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestWorkbook.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TestWorkbook.java 31 Jan 2002 02:23:52 -0000 1.1
+++ TestWorkbook.java 29 Apr 2002 11:10:29 -0000 1.2
@@ -73,6 +73,8 @@
* Class to test Workbook functionality
*
* @author Andrew C. Oliver
+ * @author Greg Merrill
+ * @author Siggi Cherem
*/
public class TestWorkbook
@@ -88,6 +90,7 @@
private static final String LAST_NAME_VALUE = "Bush";
private static final String FIRST_NAME_VALUE = "George";
private static final String SSN_VALUE = "555555555";
+ private SanityChecker sanityChecker = new SanityChecker();
/**
* Constructor TestWorkbook
@@ -108,7 +111,6 @@
* FAILURE: HSSF does not create a sheet or excepts. Filesize does not
match the known good.
* HSSFSheet last row or first row is incorrect. <P>
*
- * @author Andrew C. Oliver
*/
public void testWriteSheetSimple()
@@ -139,8 +141,9 @@
}
wb.write(out);
out.close();
+ sanityChecker.checkHSSFWorkbook(wb);
assertEquals("FILE LENGTH == 87040", 87040,
- file.length()); // changed because of new sheet behavior
+ file.length()); // remove me
assertEquals("LAST ROW == 99", 99, s.getLastRowNum());
assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum());
@@ -156,7 +159,6 @@
* FAILURE: HSSF does not create a sheet or excepts. Filesize does not
match the known good.
* HSSFSheet last row or first row is incorrect. <P>
*
- * @author Andrew C. Oliver
*/
public void testWriteModifySheetSimple()
@@ -198,11 +200,9 @@
wb.write(out);
out.close();
- // System.out.println(file.length());
- // assertEquals("FILE LENGTH == 87552",file.length(), 87552);
- // System.out.println(s.getLastRowNum());
+ sanityChecker.checkHSSFWorkbook(wb);
assertEquals("FILE LENGTH == 45568", 45568,
- file.length()); // changed due to new sheet behavior (<3)
+ file.length()); // remove
assertEquals("LAST ROW == 74", 74, s.getLastRowNum());
assertEquals("FIRST ROW == 25", 25, s.getFirstRowNum());
}
@@ -214,8 +214,6 @@
* FAILURE: HSSF does not read a sheet or excepts. HSSF cannot identify
values
* in the sheet in their known positions.<P>
*
- * @author Greg Merrill
- * @author Andrew C. Oliver
*/
public void testReadSimple()
@@ -242,8 +240,6 @@
* FAILURE: HSSF does not read a sheet or excepts. HSSF cannot identify
values
* in the sheet in their known positions.<P>
*
- * @author Greg Merrill
- * @author Andrew C. Oliver
*/
public void testReadEmployeeSimple()
@@ -283,8 +279,6 @@
* HSSF does not re-read the sheet or excepts. Upon re-reading the
sheet the value
* is incorrect or has not been replaced. <P>
*
- * @author Andrew C. Oliver
- * @author Greg Merrill
*/
public void testModifySimple()
@@ -328,8 +322,6 @@
* is incorrect or has not been replaced or the incorrect cell has
its value replaced
* or is incorrect. <P>
*
- * @author Andrew C. Oliver
- * @author Greg Merrill
*/
public void testModifySimpleWithSkip()
@@ -381,8 +373,6 @@
* HSSF does not re-read the sheet or excepts. Upon re-reading the
sheet the value
* is incorrect or has not been replaced. <P>
*
- * @author Andrew C. Oliver
- * @author Greg Merrill
*/
public void testModifySimpleWithStyling()
@@ -433,8 +423,6 @@
* HSSF does not re-read the sheet or excepts. Upon re-reading the
sheet the value
* is incorrect or has not been replaced. <P>
*
- * @author Andrew C. Oliver
- * @author Greg Merrill
*/
public void testModifyEmployee()
@@ -487,8 +475,6 @@
* SUCCESS: HSSF reads a sheet. HSSF returns that the cell is a numeric
type cell. <P>
* FAILURE: HSSF does not read a sheet or excepts. HSSF incorrectly
indentifies the cell<P>
*
- * @author Siggi Cherem
- * @author Andrew C. Oliver (acoliver at apache dot org)
*/
public void testReadSheetWithRK()
@@ -519,7 +505,6 @@
* FAILURE: HSSF does not create a sheet or excepts. Filesize does not
match the known good.
* HSSFSheet last row or first row is incorrect. <P>
*
- * @author Andrew C. Oliver
*/
public void testWriteModifySheetMerged()
@@ -555,6 +540,7 @@
( short ) 15));
wb.write(out);
out.close();
+ sanityChecker.checkHSSFWorkbook(wb);
in = new FileInputStream(file);
wb = new HSSFWorkbook(new POIFSFileSystem(in));
s = wb.getSheetAt(0);
@@ -582,7 +568,7 @@
throws Exception
{
HSSFWorkbook wb = new HSSFWorkbook();
- HSSFSheet s = wb.createSheet();
+ wb.createSheet();
Workbook workbook = wb.getWorkbook();
BackupRecord record = workbook.getBackupRecord();
@@ -629,12 +615,12 @@
{
String filename = System.getProperty("HSSF.testdata.path");
- // assume andy is running this in the debugger
+ // assume this is relative to basedir
if (filename == null)
{
System.setProperty(
"HSSF.testdata.path",
-
"/home/andy/npoi3/poi/production/testcases/net/sourceforge/poi/hssf/data");
+ "src/testcases/org/apache/poi/hssf/data");
}
System.out
.println("Testing org.apache.poi.hssf.usermodel.HSSFWorkbook");
1.1
jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/SanityChecker.java
Index: SanityChecker.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.hssf.usermodel;
import junit.framework.Assert;
import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.List;
/**
* Designed to check wither the records written actually make sense.
*/
public class SanityChecker
extends Assert
{
private class CheckRecord
{
Class record;
char occurance; // 1 = one time, M = many times
public CheckRecord(Class record, char occurance)
{
this.record = record;
this.occurance = occurance;
}
public Class getRecord()
{
return record;
}
public char getOccurance()
{
return occurance;
}
}
CheckRecord[] workbookRecords = new CheckRecord[] {
new CheckRecord(BOFRecord.class, '1'),
new CheckRecord(InterfaceHdrRecord.class, '1'),
new CheckRecord(MMSRecord.class, '1'),
new CheckRecord(InterfaceEndRecord.class, '1'),
new CheckRecord(WriteAccessRecord.class, '1'),
new CheckRecord(CodepageRecord.class, '1'),
new CheckRecord(DSFRecord.class, '1'),
new CheckRecord(TabIdRecord.class, '1'),
new CheckRecord(FnGroupCountRecord.class, '1'),
new CheckRecord(WindowProtectRecord.class, '1'),
new CheckRecord(ProtectRecord.class, '1'),
new CheckRecord(PasswordRev4Record.class, '1'),
new CheckRecord(WindowOneRecord.class, '1'),
new CheckRecord(BackupRecord.class, '1'),
new CheckRecord(HideObjRecord.class, '1'),
new CheckRecord(DateWindow1904Record.class, '1'),
new CheckRecord(PrecisionRecord.class, '1'),
new CheckRecord(RefreshAllRecord.class, '1'),
new CheckRecord(BookBoolRecord.class, '1'),
new CheckRecord(FontRecord.class, 'M'),
new CheckRecord(FormatRecord.class, 'M'),
new CheckRecord(ExtendedFormatRecord.class, 'M'),
new CheckRecord(StyleRecord.class, 'M'),
new CheckRecord(UseSelFSRecord.class, '1'),
new CheckRecord(BoundSheetRecord.class, '1'), // Is this right?
new CheckRecord(CountryRecord.class, '1'),
new CheckRecord(SSTRecord.class, '1'),
new CheckRecord(ExtSSTRecord.class, '1'),
new CheckRecord(EOFRecord.class, '1'),
};
CheckRecord[] sheetRecords = new CheckRecord[] {
new CheckRecord(BOFRecord.class, '1'),
new CheckRecord(CalcModeRecord.class, '1'),
new CheckRecord(RefModeRecord.class, '1'),
new CheckRecord(IterationRecord.class, '1'),
new CheckRecord(DeltaRecord.class, '1'),
new CheckRecord(SaveRecalcRecord.class, '1'),
new CheckRecord(PrintHeadersRecord.class, '1'),
new CheckRecord(PrintGridlinesRecord.class, '1'),
new CheckRecord(GridsetRecord.class, '1'),
new CheckRecord(GutsRecord.class, '1'),
new CheckRecord(DefaultRowHeightRecord.class, '1'),
new CheckRecord(WSBoolRecord.class, '1'),
new CheckRecord(HeaderRecord.class, '1'),
new CheckRecord(FooterRecord.class, '1'),
new CheckRecord(HCenterRecord.class, '1'),
new CheckRecord(VCenterRecord.class, '1'),
new CheckRecord(PrintSetupRecord.class, '1'),
new CheckRecord(DefaultColWidthRecord.class, '1'),
new CheckRecord(DimensionsRecord.class, '1'),
new CheckRecord(WindowTwoRecord.class, '1'),
new CheckRecord(SelectionRecord.class, '1'),
new CheckRecord(EOFRecord.class, '1')
};
public void checkWorkbookRecords(Workbook workbook)
{
List records = workbook.getRecords();
assertTrue(records.get(0) instanceof BOFRecord);
assertTrue(records.get(records.size() - 1) instanceof EOFRecord);
checkRecordOrder(records, workbookRecords);
}
public void checkSheetRecords(Sheet sheet)
{
List records = sheet.getRecords();
assertTrue(records.get(0) instanceof BOFRecord);
assertTrue(records.get(records.size() - 1) instanceof EOFRecord);
checkRecordOrder(records, sheetRecords);
}
public void checkHSSFWorkbook(HSSFWorkbook wb)
{
checkWorkbookRecords(wb.getWorkbook());
for (int i = 0; i < wb.getNumberOfSheets(); i++)
checkSheetRecords(wb.getSheetAt(i).getSheet());
}
private void checkRecordOrder(List records, CheckRecord[] check)
{
int checkIndex = 0;
for (int recordIndex = 0; recordIndex < records.size(); recordIndex++)
{
Record record = (Record) records.get(recordIndex);
if (check[checkIndex].getRecord().isInstance(record))
{
if (check[checkIndex].getOccurance() == 'M')
{
// skip over duplicate records if multiples are allowed
while (recordIndex+1 < records.size() &&
check[checkIndex].getRecord().isInstance(records.get(recordIndex+1)))
recordIndex++;
}
checkIndex++;
}
if (checkIndex >= check.length)
return;
}
fail("Could not find required record: " + check[checkIndex]);
}
}