poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ye...@apache.org
Subject svn commit: r1138465 - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/model/ testcases/org/apache/poi/hssf/model/
Date Wed, 22 Jun 2011 13:48:44 GMT
Author: yegor
Date: Wed Jun 22 13:48:43 2011
New Revision: 1138465

URL: http://svn.apache.org/viewvc?rev=1138465&view=rev
Log:
Bug 51332 - Fixed internal IDs of shapes generated by HSSFPatriarch when there are more than
1023 drawing objects

Added:
    poi/trunk/src/testcases/org/apache/poi/hssf/model/TestShapes.java
      - copied, changed from r1137535, poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java
Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/CommentShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/LineShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/PictureShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/PolygonShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/SimpleFilledShape.java
    poi/trunk/src/java/org/apache/poi/hssf/model/TextboxShape.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Wed Jun 22 13:48:43 2011
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta4" date="2011-??-??">
+           <action dev="poi-developers" type="fix">51332 - Fixed internal IDs of shapes
generated by HSSFPatriarch when there are more than 1023 drawing objects </action>
            <action dev="poi-developers" type="fix">48408 - Improved documentation for
Sheet.setColumnWidth </action>
            <action dev="poi-developers" type="add">51390 - Added handling of additional
properties to HWPF ParagraphSprmCompressor</action>
            <action dev="poi-developers" type="add">51389 - Support for sprmPJc paragraph
SPRM in HWPF</action>

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java Wed Jun 22 13:48:43 2011
@@ -150,4 +150,28 @@ public abstract class AbstractShape
         return options;   // # options added
     }
 
+    /**
+     * Generate id for the CommonObjectDataSubRecord that stands behind this shape
+     *
+     * <p>
+     *     Typically objectId starts with 1, is unique among all Obj record within the worksheet
stream
+     *     and increments by 1 for every new shape.
+     *     For most shapes there is a straight relationship between shapeId (generated by
DDF) and objectId:
+     * </p>
+     * <p>
+     *     shapeId  is unique and starts with 1024, hence objectId can be derived as <code>shapeId-1024</code>.
+     * </p>
+     * <p>
+     *     An exception from this rule is the CellComment shape whose objectId start with
1024.
+     *      See {@link CommentShape#getCmoObjectId(int)}
+     * </p>
+     *
+     *
+     *
+     * @param  shapeId   shape id as generated by drawing manager
+     * @return objectId  object id that will be assigned to the Obj record
+     */
+    int getCmoObjectId(int shapeId){
+        return shapeId - 1024;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java Wed Jun 22 13:48:43 2011
@@ -50,7 +50,7 @@ public class ComboboxShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType(HSSFSimpleShape.OBJECT_TYPE_COMBO_BOX);
-        c.setObjectId(shapeId);
+        c.setObjectId(  getCmoObjectId(shapeId) );
         c.setLocked(true);
         c.setPrintable(false);
         c.setAutofill(true);

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/CommentShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/CommentShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/CommentShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/CommentShape.java Wed Jun 22 13:48:43 2011
@@ -136,4 +136,10 @@ public final class CommentShape extends 
     {
         return _note;
     }
+
+    @Override
+    int getCmoObjectId(int shapeId){
+        return shapeId;
+    }
+
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/LineShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/LineShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/LineShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/LineShape.java Wed Jun 22 13:48:43 2011
@@ -97,7 +97,7 @@ public class LineShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType((short) ((HSSFSimpleShape)shape).getShapeType());
-        c.setObjectId(shapeId);
+        c.setObjectId(  getCmoObjectId(shapeId) );
         c.setLocked(true);
         c.setPrintable(true);
         c.setAutofill(true);

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/PictureShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/PictureShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/PictureShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/PictureShape.java Wed Jun 22 13:48:43 2011
@@ -99,21 +99,15 @@ public class PictureShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType((short) ((HSSFSimpleShape)shape).getShapeType());
-//        c.setObjectId((short) ( 1 ));
-        c.setObjectId(shapeId);
+        c.setObjectId( getCmoObjectId(shapeId) );
         c.setLocked(true);
         c.setPrintable(true);
         c.setAutofill(true);
         c.setAutoline(true);
-//        c.setReserved2( 0x012C0A84 );
         c.setReserved2( 0x0 );
-//        UnknownRecord sub1 = new UnknownRecord( (short)0x7, (short)0x2, new byte[] { 0x09,
0x00 } );
-//        UnknownRecord sub2 = new UnknownRecord( (short)0x8, (short)0x2, new byte[] { 0x01,
0x00 } );
         EndSubRecord e = new EndSubRecord();
 
         obj.addSubRecord(c);
-//        obj.addSubRecord( sub1 );
-//        obj.addSubRecord( sub2 );
         obj.addSubRecord(e);
 
         return obj;

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/PolygonShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/PolygonShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/PolygonShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/PolygonShape.java Wed Jun 22 13:48:43 2011
@@ -134,7 +134,7 @@ public class PolygonShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType( OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING );
-        c.setObjectId(shapeId);
+        c.setObjectId( getCmoObjectId(shapeId) );
         c.setLocked( true );
         c.setPrintable( true );
         c.setAutofill( true );

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/SimpleFilledShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/SimpleFilledShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/SimpleFilledShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/SimpleFilledShape.java Wed Jun 22 13:48:43
2011
@@ -101,7 +101,7 @@ public class SimpleFilledShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType( (short) ( (HSSFSimpleShape) shape ).getShapeType() );
-        c.setObjectId( shapeId );
+        c.setObjectId(  getCmoObjectId(shapeId) );
         c.setLocked( true );
         c.setPrintable( true );
         c.setAutofill( true );

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/TextboxShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/TextboxShape.java?rev=1138465&r1=1138464&r2=1138465&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/TextboxShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/TextboxShape.java Wed Jun 22 13:48:43 2011
@@ -59,7 +59,7 @@ public class TextboxShape
         ObjRecord obj = new ObjRecord();
         CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
         c.setObjectType( (short) ( (HSSFSimpleShape) shape ).getShapeType() );
-        c.setObjectId( shapeId );
+        c.setObjectId( getCmoObjectId(shapeId) );
         c.setLocked( true );
         c.setPrintable( true );
         c.setAutofill( true );
@@ -166,4 +166,5 @@ public class TextboxShape
     {
         return escherTextbox;
     }
+
 }

Copied: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestShapes.java (from r1137535,
poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestShapes.java?p2=poi/trunk/src/testcases/org/apache/poi/hssf/model/TestShapes.java&p1=poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java&r1=1137535&r2=1138465&rev=1138465&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestShapes.java Wed Jun 22 13:48:43
2011
@@ -1,704 +1,58 @@
-/* ====================================================================
-   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.
-==================================================================== */
+/*
+ *  ====================================================================
+ *    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.hssf.model;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
-
-import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.record.BOFRecord;
-import org.apache.poi.hssf.record.BlankRecord;
-import org.apache.poi.hssf.record.CellValueRecordInterface;
-import org.apache.poi.hssf.record.ColumnInfoRecord;
-import org.apache.poi.hssf.record.DimensionsRecord;
-import org.apache.poi.hssf.record.EOFRecord;
-import org.apache.poi.hssf.record.FormulaRecord;
-import org.apache.poi.hssf.record.GutsRecord;
-import org.apache.poi.hssf.record.IndexRecord;
-import org.apache.poi.hssf.record.MergeCellsRecord;
-import org.apache.poi.hssf.record.MulBlankRecord;
-import org.apache.poi.hssf.record.NumberRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.RecordBase;
-import org.apache.poi.hssf.record.RowRecord;
-import org.apache.poi.hssf.record.StringRecord;
-import org.apache.poi.hssf.record.UncalcedRecord;
-import org.apache.poi.hssf.record.WindowTwoRecord;
-import org.apache.poi.hssf.record.aggregates.ConditionalFormattingTable;
-import org.apache.poi.hssf.record.aggregates.PageSettingsBlock;
-import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
-import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.usermodel.RecordInspector.RecordCollector;
-import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
+import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
+import org.apache.poi.hssf.usermodel.HSSFComment;
+import org.apache.poi.hssf.usermodel.HSSFPicture;
+import org.apache.poi.hssf.usermodel.HSSFTextbox;
 
 /**
- * Unit test for the {@link InternalSheet} class.
  *
- * @author Glen Stampoultzis (glens at apache.org)
+ * @author Yegor Kozlov
  */
-public final class TestSheet extends TestCase {
-	private static InternalSheet createSheet(List<Record> inRecs) {
-		return InternalSheet.createSheet(new RecordStream(inRecs, 0));
-	}
-
-	private static Record[] getSheetRecords(InternalSheet s, int offset) {
-		RecordCollector rc = new RecordCollector();
-		s.visitContainedRecords(rc, offset);
-		return rc.getRecords();
-	}
-
-	public void testCreateSheet() {
-		// Check we're adding row and cell aggregates
-		List<Record> records = new ArrayList<Record>();
-		records.add(BOFRecord.createSheetBOF());
-		records.add( new DimensionsRecord() );
-		records.add(createWindow2Record());
-		records.add(EOFRecord.instance);
-		InternalSheet sheet = createSheet(records);
-		Record[] outRecs = getSheetRecords(sheet, 0);
-
-		int pos = 0;
-		assertTrue(outRecs[pos++] instanceof BOFRecord );
-		assertTrue(outRecs[pos++] instanceof IndexRecord );
-		assertTrue(outRecs[pos++] instanceof DimensionsRecord );
-		assertTrue(outRecs[pos++] instanceof WindowTwoRecord );
-		assertTrue(outRecs[pos++] instanceof EOFRecord );
-	}
-
-	private static Record createWindow2Record() {
-		WindowTwoRecord result = new WindowTwoRecord();
-		result.setOptions(( short ) 0x6b6);
-		result.setTopRow(( short ) 0);
-		result.setLeftCol(( short ) 0);
-		result.setHeaderColor(0x40);
-		result.setPageBreakZoom(( short ) 0);
-		result.setNormalZoom(( short ) 0);
-		return result;
-	}
-
-	private static final class MergedCellListener implements RecordVisitor {
-
-		private int _count;
-		public MergedCellListener() {
-			_count = 0;
-		}
-		public void visitRecord(Record r) {
-			if (r instanceof MergeCellsRecord) {
-				_count++;
-			}
-		}
-		public int getCount() {
-			return _count;
-		}
-	}
-
-	public void testAddMergedRegion() {
-		InternalSheet sheet = InternalSheet.createSheet();
-		int regionsToAdd = 4096;
-
-		//simple test that adds a load of regions
-		for (int n = 0; n < regionsToAdd; n++)
-		{
-			int index = sheet.addMergedRegion(0, (short) 0, 1, (short) 1);
-			assertTrue("Merged region index expected to be " + n + " got " + index, index == n);
-		}
-
-		//test all the regions were indeed added
-		assertTrue(sheet.getNumMergedRegions() == regionsToAdd);
-
-		//test that the regions were spread out over the appropriate number of records
-		MergedCellListener mcListener = new MergedCellListener();
-		sheet.visitContainedRecords(mcListener, 0);
-		int recordsAdded	= mcListener.getCount();
-		int recordsExpected = regionsToAdd/1027;
-		if ((regionsToAdd % 1027) != 0)
-			recordsExpected++;
-		assertTrue("The " + regionsToAdd + " merged regions should have been spread out over "
-				+ recordsExpected + " records, not " + recordsAdded, recordsAdded == recordsExpected);
-		// Check we can't add one with invalid date
-		try {
-			sheet.addMergedRegion(10, (short)10, 9, (short)12);
-			fail("Expected an exception to occur");
-		} catch(IllegalArgumentException e) {
-			// occurs during successful test
-			assertEquals("The 'to' row (9) must not be less than the 'from' row (10)", e.getMessage());
-		}
-		try {
-			sheet.addMergedRegion(10, (short)10, 12, (short)9);
-			fail("Expected an exception to occur");
-		} catch(IllegalArgumentException e) {
-			// occurs during successful test
-			assertEquals("The 'to' col (9) must not be less than the 'from' col (10)", e.getMessage());
-		}
-	}
-
-	public void testRemoveMergedRegion() {
-		InternalSheet sheet = InternalSheet.createSheet();
-		int regionsToAdd = 4096;
-
-		for (int n = 0; n < regionsToAdd; n++) {
-			sheet.addMergedRegion(n, 0, n, 1);
-		}
-
-		int nSheetRecords = sheet.getRecords().size();
-
-		//remove a third from the beginning
-		for (int n = 0; n < regionsToAdd/3; n++)
-		{
-			sheet.removeMergedRegion(0);
-			//assert they have been deleted
-			assertEquals("Num of regions", regionsToAdd - n - 1, sheet.getNumMergedRegions());
-		}
-
-		// merge records are removed from within the MergedCellsTable,
-		// so the sheet record count should not change
-		assertEquals("Sheet Records", nSheetRecords, sheet.getRecords().size());
-	}
-
-	/**
-	 * Bug: 22922 (Reported by Xuemin Guan)
-	 * <p>
-	 * Remove mergedregion fails when a sheet loses records after an initial CreateSheet
-	 * fills up the records.
-	 *
-	 */
-	public void testMovingMergedRegion() {
-		List<Record> records = new ArrayList<Record>();
-
-		CellRangeAddress[] cras = {
-			new CellRangeAddress(0, 1, 0, 2),
-		};
-		MergeCellsRecord merged = new MergeCellsRecord(cras, 0, cras.length);
-		records.add(BOFRecord.createSheetBOF());
-		records.add(new DimensionsRecord());
-		records.add(new RowRecord(0));
-		records.add(new RowRecord(1));
-		records.add(new RowRecord(2));
-		records.add(createWindow2Record());
-		records.add(EOFRecord.instance);
-		records.add(merged);
-
-		InternalSheet sheet = createSheet(records);
-		sheet.getRecords().remove(0); // TODO - what does this line do?
-
-		//stub object to throw off list INDEX operations
-		sheet.removeMergedRegion(0);
-		assertEquals("Should be no more merged regions", 0, sheet.getNumMergedRegions());
-	}
-
-	public void testGetMergedRegionAt() {
-		//TODO
-	}
-
-	public void testGetNumMergedRegions() {
-		//TODO
-	}
-
-	/**
-	 * Makes sure all rows registered for this sheet are aggregated, they were being skipped
-	 *
-	 */
-	public void testRowAggregation() {
-		List<Record> records = new ArrayList<Record>();
-
-		records.add(InternalSheet.createBOF());
-		records.add(new DimensionsRecord());
-		records.add(new RowRecord(0));
-		records.add(new RowRecord(1));
-		FormulaRecord formulaRecord = new FormulaRecord();
-		formulaRecord.setCachedResultTypeString();
-		records.add(formulaRecord);
-		records.add(new StringRecord());
-		records.add(new RowRecord(2));
-		records.add(createWindow2Record());
-		records.add(EOFRecord.instance);
-
-		InternalSheet sheet = createSheet(records);
-		assertNotNull("Row [2] was skipped", sheet.getRow(2));
-	}
-
-	/**
-	 * Make sure page break functionality works (in memory)
-	 *
-	 */
-	public void testRowPageBreaks() {
-		short colFrom = 0;
-		short colTo = 255;
-
-		InternalSheet worksheet = InternalSheet.createSheet();
-		PageSettingsBlock sheet = worksheet.getPageSettings();
-		sheet.setRowBreak(0, colFrom, colTo);
-
-		assertTrue("no row break at 0", sheet.isRowBroken(0));
-		assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
-
-		sheet.setRowBreak(0, colFrom, colTo);
-		sheet.setRowBreak(0, colFrom, colTo);
-
-		assertTrue("no row break at 0", sheet.isRowBroken(0));
-		assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
-
-		sheet.setRowBreak(10, colFrom, colTo);
-		sheet.setRowBreak(11, colFrom, colTo);
-
-		assertTrue("no row break at 10", sheet.isRowBroken(10));
-		assertTrue("no row break at 11", sheet.isRowBroken(11));
-		assertEquals("3 row break available", 3, sheet.getNumRowBreaks());
-
-
-		boolean is10 = false;
-		boolean is0 = false;
-		boolean is11 = false;
-
-		int[] rowBreaks = sheet.getRowBreaks();
-		for (int i = 0; i < rowBreaks.length; i++) {
-			int main = rowBreaks[i];
-			if (main != 0 && main != 10 && main != 11) fail("Invalid page break");
-			if (main == 0)	 is0 = true;
-			if (main == 10) is10= true;
-			if (main == 11) is11 = true;
-		}
-
-		assertTrue("one of the breaks didnt make it", is0 && is10 && is11);
-
-		sheet.removeRowBreak(11);
-		assertFalse("row should be removed", sheet.isRowBroken(11));
-
-		sheet.removeRowBreak(0);
-		assertFalse("row should be removed", sheet.isRowBroken(0));
-
-		sheet.removeRowBreak(10);
-		assertFalse("row should be removed", sheet.isRowBroken(10));
-
-		assertEquals("no more breaks", 0, sheet.getNumRowBreaks());
-	}
-
-	/**
-	 * Make sure column pag breaks works properly (in-memory)
-	 *
-	 */
-	public void testColPageBreaks() {
-		short rowFrom = 0;
-		short rowTo = (short)65535;
-
-		InternalSheet worksheet = InternalSheet.createSheet();
-		PageSettingsBlock sheet = worksheet.getPageSettings();
-		sheet.setColumnBreak((short)0, rowFrom, rowTo);
-
-		assertTrue("no col break at 0", sheet.isColumnBroken(0));
-		assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
-
-		sheet.setColumnBreak((short)0, rowFrom, rowTo);
-
-		assertTrue("no col break at 0", sheet.isColumnBroken(0));
-		assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
-
-		sheet.setColumnBreak((short)1, rowFrom, rowTo);
-		sheet.setColumnBreak((short)10, rowFrom, rowTo);
-		sheet.setColumnBreak((short)15, rowFrom, rowTo);
-
-		assertTrue("no col break at 1", sheet.isColumnBroken(1));
-		assertTrue("no col break at 10", sheet.isColumnBroken(10));
-		assertTrue("no col break at 15", sheet.isColumnBroken(15));
-		assertEquals("4 col break available", 4, sheet.getNumColumnBreaks());
-
-		boolean is10 = false;
-		boolean is0 = false;
-		boolean is1 = false;
-		boolean is15 = false;
-
-		int[] colBreaks = sheet.getColumnBreaks();
-		for (int i = 0; i < colBreaks.length; i++) {
-			int main = colBreaks[i];
-			if (main != 0 && main != 1 && main != 10 && main != 15) fail("Invalid
page break");
-			if (main == 0)  is0 = true;
-			if (main == 1)  is1 = true;
-			if (main == 10) is10= true;
-			if (main == 15) is15 = true;
-		}
-
-		assertTrue("one of the breaks didnt make it", is0 && is1 && is10 &&
is15);
-
-		sheet.removeColumnBreak(15);
-		assertFalse("column break should not be there", sheet.isColumnBroken(15));
-
-		sheet.removeColumnBreak(0);
-		assertFalse("column break should not be there", sheet.isColumnBroken(0));
-
-		sheet.removeColumnBreak(1);
-		assertFalse("column break should not be there", sheet.isColumnBroken(1));
-
-		sheet.removeColumnBreak(10);
-		assertFalse("column break should not be there", sheet.isColumnBroken(10));
-
-		assertEquals("no more breaks", 0, sheet.getNumColumnBreaks());
-	}
-
-	/**
-	 * test newly added method Sheet.getXFIndexForColAt(..)
-	 * works as designed.
-	 */
-	public void testXFIndexForColumn() {
-		final short TEST_IDX = 10;
-		final short DEFAULT_IDX = 0xF; // 15
-		short xfindex = Short.MIN_VALUE;
-		InternalSheet sheet = InternalSheet.createSheet();
-
-		// without ColumnInfoRecord
-		xfindex = sheet.getXFIndexForColAt((short) 0);
-		assertEquals(DEFAULT_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 1);
-		assertEquals(DEFAULT_IDX, xfindex);
-
-		ColumnInfoRecord nci = new ColumnInfoRecord();
-		sheet._columnInfos.insertColumn(nci);
-
-		// single column ColumnInfoRecord
-		nci.setFirstColumn((short) 2);
-		nci.setLastColumn((short) 2);
-		nci.setXFIndex(TEST_IDX);
-		xfindex = sheet.getXFIndexForColAt((short) 0);
-		assertEquals(DEFAULT_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 1);
-		assertEquals(DEFAULT_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 2);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 3);
-		assertEquals(DEFAULT_IDX, xfindex);
-
-		// ten column ColumnInfoRecord
-		nci.setFirstColumn((short) 2);
-		nci.setLastColumn((short) 11);
-		nci.setXFIndex(TEST_IDX);
-		xfindex = sheet.getXFIndexForColAt((short) 1);
-		assertEquals(DEFAULT_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 2);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 6);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 11);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 12);
-		assertEquals(DEFAULT_IDX, xfindex);
-
-		// single column ColumnInfoRecord starting at index 0
-		nci.setFirstColumn((short) 0);
-		nci.setLastColumn((short) 0);
-		nci.setXFIndex(TEST_IDX);
-		xfindex = sheet.getXFIndexForColAt((short) 0);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 1);
-		assertEquals(DEFAULT_IDX, xfindex);
-
-		// ten column ColumnInfoRecord starting at index 0
-		nci.setFirstColumn((short) 0);
-		nci.setLastColumn((short) 9);
-		nci.setXFIndex(TEST_IDX);
-		xfindex = sheet.getXFIndexForColAt((short) 0);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 7);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 9);
-		assertEquals(TEST_IDX, xfindex);
-		xfindex = sheet.getXFIndexForColAt((short) 10);
-		assertEquals(DEFAULT_IDX, xfindex);
-	}
-
-	private static final class SizeCheckingRecordVisitor implements RecordVisitor {
-
-		private int _totalSize;
-		public SizeCheckingRecordVisitor() {
-			_totalSize = 0;
-		}
-		public void visitRecord(Record r) {
-
-			int estimatedSize=r.getRecordSize();
-			byte[] buf = new byte[estimatedSize];
-			int serializedSize = r.serialize(0, buf);
-			if (estimatedSize != serializedSize) {
-				throw new AssertionFailedError("serialized size mismatch for record ("
-						+ r.getClass().getName() + ")");
-			}
-			_totalSize += estimatedSize;
-		}
-		public int getTotalSize() {
-			return _totalSize;
-		}
-	}
-	/**
-	 * Prior to bug 45066, POI would get the estimated sheet size wrong
-	 * when an <tt>UncalcedRecord</tt> was present.<p/>
-	 */
-	public void testUncalcSize_bug45066() {
-
-		List<Record> records = new ArrayList<Record>();
-		records.add(BOFRecord.createSheetBOF());
-		records.add(new UncalcedRecord());
-		records.add(new DimensionsRecord());
-		records.add(createWindow2Record());
-		records.add(EOFRecord.instance);
-		InternalSheet sheet = createSheet(records);
-
-		// The original bug was due to different logic for collecting records for sizing and
-		// serialization. The code has since been refactored into a single method for visiting
-		// all contained records.  Now this test is much less interesting
-		SizeCheckingRecordVisitor scrv = new SizeCheckingRecordVisitor();
-		sheet.visitContainedRecords(scrv, 0);
-		assertEquals(90, scrv.getTotalSize());
-	}
-
-	/**
-	 * Prior to bug 45145 <tt>RowRecordsAggregate</tt> and <tt>ValueRecordsAggregate</tt>
could
-	 * sometimes occur in reverse order.  This test reproduces one of those situations and makes
-	 * sure that RRA comes before VRA.<br/>
-	 *
-	 * The code here represents a normal POI use case where a spreadsheet is created from scratch.
-	 */
-	public void testRowValueAggregatesOrder_bug45145() {
-
-		InternalSheet sheet = InternalSheet.createSheet();
-
-		RowRecord rr = new RowRecord(5);
-		sheet.addRow(rr);
-
-		CellValueRecordInterface cvr = new BlankRecord();
-		cvr.setColumn((short)0);
-		cvr.setRow(5);
-		sheet.addValueRecord(5, cvr);
-
-
-		int dbCellRecordPos = getDbCellRecordPos(sheet);
-		if (dbCellRecordPos == 252) {
-			// The overt symptom of the bug
-			// DBCELL record pos is calculated wrong if VRA comes before RRA
-			throw new AssertionFailedError("Identified  bug 45145");
-		}
-
-		if (false) {
-			// make sure that RRA and VRA are in the right place
-			// (Aug 2008) since the VRA is now part of the RRA, there is much less chance that
-			// they could get out of order. Still, one could write serialize the sheet here,
-			// and read back with EventRecordFactory to make sure...
-		}
-		assertEquals(242, dbCellRecordPos);
-	}
-
-	/**
-	 * @return the value calculated for the position of the first DBCELL record for this sheet.
-	 * That value is found on the IndexRecord.
-	 */
-	private static int getDbCellRecordPos(InternalSheet sheet) {
-
-		MyIndexRecordListener myIndexListener = new MyIndexRecordListener();
-		sheet.visitContainedRecords(myIndexListener, 0);
-		IndexRecord indexRecord = myIndexListener.getIndexRecord();
-		int dbCellRecordPos = indexRecord.getDbcellAt(0);
-		return dbCellRecordPos;
-	}
-
-	private static final class MyIndexRecordListener implements RecordVisitor {
-
-		private IndexRecord _indexRecord;
-		public MyIndexRecordListener() {
-			// no-arg constructor
-		}
-		public IndexRecord getIndexRecord() {
-			return _indexRecord;
-		}
-		public void visitRecord(Record r) {
-			if (r instanceof IndexRecord) {
-				if (_indexRecord != null) {
-					throw new RuntimeException("too many index records");
-				}
-				_indexRecord = (IndexRecord)r;
-			}
-		}
-	}
-
-	/**
-	 * Checks for bug introduced around r682282-r683880 that caused a second GUTS records
-	 * which in turn got the dimensions record out of alignment
-	 */
-	public void testGutsRecord_bug45640() {
-
-		InternalSheet sheet = InternalSheet.createSheet();
-		sheet.addRow(new RowRecord(0));
-		sheet.addRow(new RowRecord(1));
-		sheet.groupRowRange( 0, 1, true );
-		sheet.toString();
-		List<RecordBase> recs = sheet.getRecords();
-		int count=0;
-		for(int i=0; i< recs.size(); i++) {
-			if (recs.get(i) instanceof GutsRecord) {
-				count++;
-			}
-		}
-		if (count == 2) {
-			throw new AssertionFailedError("Identified bug 45640");
-		}
-		assertEquals(1, count);
-	}
-
-	public void testMisplacedMergedCellsRecords_bug45699() {
-		HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45698-22488.xls");
-
-		HSSFSheet sheet = wb.getSheetAt(0);
-		HSSFRow row = sheet.getRow(3);
-		HSSFCell cell = row.getCell(4);
-		if (cell == null) {
-			throw new AssertionFailedError("Identified bug 45699");
-		}
-		assertEquals("Informations", cell.getRichStringCellValue().getString());
-	}
-	/**
-	 * In 3.1, setting margins between creating first row and first cell caused an exception.
-	 */
-	public void testSetMargins_bug45717() {
-		HSSFWorkbook workbook = new HSSFWorkbook();
-		HSSFSheet sheet = workbook.createSheet("Vorschauliste");
-		HSSFRow row = sheet.createRow(0);
-
-		sheet.setMargin(HSSFSheet.LeftMargin, 0.3);
-		try {
-			row.createCell(0);
-		} catch (IllegalStateException e) {
-			if (e.getMessage().equals("Cannot create value records before row records exist")) {
-				throw new AssertionFailedError("Identified bug 45717");
-			}
-			throw e;
-		}
-	}
-
-	/**
-	 * Some apps seem to write files with missing DIMENSION records.
-	 * Excel(2007) tolerates this, so POI should too.
-	 */
-	public void testMissingDims() {
-
-		int rowIx = 5;
-		int colIx = 6;
-		NumberRecord nr = new NumberRecord();
-		nr.setRow(rowIx);
-		nr.setColumn((short) colIx);
-		nr.setValue(3.0);
-
-		List<Record> inRecs = new ArrayList<Record>();
-		inRecs.add(BOFRecord.createSheetBOF());
-		inRecs.add(new RowRecord(rowIx));
-		inRecs.add(nr);
-		inRecs.add(createWindow2Record());
-		inRecs.add(EOFRecord.instance);
-		InternalSheet sheet;
-		try {
-			sheet = createSheet(inRecs);
-		} catch (RuntimeException e) {
-			if ("DimensionsRecord was not found".equals(e.getMessage())) {
-				throw new AssertionFailedError("Identified bug 46206");
-			}
-			throw e;
-		}
-
-		RecordCollector rv = new RecordCollector();
-		sheet.visitContainedRecords(rv, rowIx);
-		Record[] outRecs = rv.getRecords();
-		assertEquals(8, outRecs.length);
-		DimensionsRecord dims = (DimensionsRecord) outRecs[5];
-		assertEquals(rowIx, dims.getFirstRow());
-		assertEquals(rowIx, dims.getLastRow());
-		assertEquals(colIx, dims.getFirstCol());
-		assertEquals(colIx, dims.getLastCol());
-	}
-
-	/**
-	 * Prior to the fix for bug 46547, shifting formulas would have the side-effect
-	 * of creating a {@link ConditionalFormattingTable}.  There was no impairment to
-	 * functionality since empty record aggregates are equivalent to missing record
-	 * aggregates. However, since this unnecessary creation helped expose bug 46547b,
-	 * and since there is a slight performance hit the fix was made to avoid it.
-	 */
-	public void testShiftFormulasAddCondFormat_bug46547() {
-		// Create a sheet with data validity (similar to bugzilla attachment id=23131).
-		InternalSheet sheet = InternalSheet.createSheet();
-
-		List<RecordBase> sheetRecs = sheet.getRecords();
-		assertEquals(23, sheetRecs.size());
-
-		FormulaShifter shifter = FormulaShifter.createForRowShift(0, 0, 0, 1);
-		sheet.updateFormulasAfterCellShift(shifter, 0);
-		if (sheetRecs.size() == 24 && sheetRecs.get(22) instanceof ConditionalFormattingTable)
{
-			throw new AssertionFailedError("Identified bug 46547a");
-		}
-		assertEquals(23, sheetRecs.size());
-	}
-	/**
-	 * Bug 46547 happened when attempting to add conditional formatting to a sheet
-	 * which already had data validity constraints.
-	 */
-	public void testAddCondFormatAfterDataValidation_bug46547() {
-		// Create a sheet with data validity (similar to bugzilla attachment id=23131).
-		InternalSheet sheet = InternalSheet.createSheet();
-		sheet.getOrCreateDataValidityTable();
-
-		ConditionalFormattingTable cft;
-		// attempt to add conditional formatting
-		try {
-
-			cft = sheet.getConditionalFormattingTable(); // lazy getter
-		} catch (ClassCastException e) {
-			throw new AssertionFailedError("Identified bug 46547b");
-		}
-		assertNotNull(cft);
-	}
-
-	public void testCloneMulBlank_bug46776() {
-		Record[]  recs = {
-				InternalSheet.createBOF(),
-				new DimensionsRecord(),
-				new RowRecord(1),
-				new MulBlankRecord(1, 3, new short[] { 0x0F, 0x0F, 0x0F, } ),
-				new RowRecord(2),
-				createWindow2Record(),
-				EOFRecord.instance,
-		};
-
-		InternalSheet sheet = createSheet(Arrays.asList(recs));
-
-		InternalSheet sheet2;
-		try {
-			sheet2 = sheet.cloneSheet();
-		} catch (RuntimeException e) {
-			if (e.getMessage().equals("The class org.apache.poi.hssf.record.MulBlankRecord needs to
define a clone method")) {
-				throw new AssertionFailedError("Identified bug 46776");
-			}
-			throw e;
-		}
+public final class TestShapes extends TestCase {
 
-		RecordCollector rc = new RecordCollector();
-		sheet2.visitContainedRecords(rc, 0);
-		Record[] clonedRecs = rc.getRecords();
-		assertEquals(recs.length+2, clonedRecs.length); // +2 for INDEX and DBCELL
-	}
+    /**
+     * Test generator of ids for the CommonObjectDataSubRecord record.
+     *
+     * See Bug 51332
+     */
+    public void testShapeId(){
+
+        HSSFClientAnchor anchor = new HSSFClientAnchor();
+        AbstractShape shape;
+        CommonObjectDataSubRecord cmo;
+
+        shape = new TextboxShape(new HSSFTextbox(null, anchor), 1025);
+        cmo = (CommonObjectDataSubRecord)shape.getObjRecord().getSubRecords().get(0);
+        assertEquals(1, cmo.getObjectId());
+
+        shape = new PictureShape(new HSSFPicture(null, anchor), 1026);
+        cmo = (CommonObjectDataSubRecord)shape.getObjRecord().getSubRecords().get(0);
+        assertEquals(2, cmo.getObjectId());
+
+        shape = new CommentShape(new HSSFComment(null, anchor), 1027);
+        cmo = (CommonObjectDataSubRecord)shape.getObjRecord().getSubRecords().get(0);
+        assertEquals(1027, cmo.getObjectId());
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message