]> source.dussan.org Git - poi.git/commitdiff
Bug 45312: Add unit-test and javadoc, also convert file to proper line-ending and...
authorDominik Stadler <centic@apache.org>
Sun, 31 Aug 2014 11:40:22 +0000 (11:40 +0000)
committerDominik Stadler <centic@apache.org>
Sun, 31 Aug 2014 11:40:22 +0000 (11:40 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1621586 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/dev/BiffViewer.java
src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java
src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
src/java/org/apache/poi/hssf/usermodel/HSSFShape.java
src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java

index 19cdd02942e7ffdf0d3bef259b47124280c8d39e..5451b27899a5d4fe84883843c6e6b7d1a9a64fc9 100644 (file)
@@ -145,7 +145,7 @@ public final class BiffViewer {
                        case DatRecord.sid:            return new DatRecord(in);
                        case DataFormatRecord.sid:     return new DataFormatRecord(in);
                        case DateWindow1904Record.sid: return new DateWindow1904Record(in);
-               case DConRefRecord.sid: return new DConRefRecord(in);
+                       case DConRefRecord.sid: return new DConRefRecord(in);
                        case DefaultColWidthRecord.sid:return new DefaultColWidthRecord(in);
                        case DefaultDataLabelTextPropertiesRecord.sid: return new DefaultDataLabelTextPropertiesRecord(in);
                        case DefaultRowHeightRecord.sid: return new DefaultRowHeightRecord(in);
index 078f0205d79daf70ec0e14039fe3ff5c9aa349f6..d3263834c7a79759d56bc290c61fa18bd80eefd1 100644 (file)
@@ -57,20 +57,19 @@ public abstract class AbstractEscherHolderRecord extends Record {
     public AbstractEscherHolderRecord(RecordInputStream in)
     {
         escherRecords = new ArrayList<EscherRecord>();
-        if (! DESERIALISE )
-        {
+        if (! DESERIALISE ) {
             rawDataContainer.concatenate(in.readRemainder());
-        }
-        else
-        {
+        } else {
             byte[] data = in.readAllContinuedRemainder();
             convertToEscherRecords( 0, data.length, data );
         }
     }
 
     protected void convertRawBytesToEscherRecords() {
-        byte[] rawData = getRawData();
-       convertToEscherRecords(0, rawData.length, rawData);
+        if (! DESERIALISE ) {
+            byte[] rawData = getRawData();
+               convertToEscherRecords(0, rawData.length, rawData);
+        }
     }
     private void convertToEscherRecords( int offset, int size, byte[] data )
     {
@@ -224,7 +223,7 @@ public abstract class AbstractEscherHolderRecord extends Record {
 
     public EscherRecord getEscherRecord(int index)
     {
-        return (EscherRecord) escherRecords.get(index);
+        return escherRecords.get(index);
     }
 
     /**
index 0a65bbd8ffe4b0c7358783f57cb1b085938399b7..c46f7b7a92f5f1ea6c9c7022b4f3115fca2f2d01 100644 (file)
@@ -42,6 +42,10 @@ public final class HSSFClientAnchor extends HSSFAnchor implements ClientAnchor {
     /**
      * Creates a new client anchor and sets the top-left and bottom-right
      * coordinates of the anchor.
+     * 
+     * Note: Microsoft Excel seems to sometimes disallow 
+     * higher y1 than y2 or higher x1 than x2, you might need to 
+     * reverse them and draw shapes vertically or horizontally flipped! 
      *
      * @param dx1  the x coordinate within the first cell.
      * @param dy1  the y coordinate within the first cell.
@@ -186,8 +190,12 @@ public final class HSSFClientAnchor extends HSSFAnchor implements ClientAnchor {
     }
 
     /**
-     * Dets the top-left and bottom-right
-     * coordinates of the anchor.
+     * Sets the top-left and bottom-right coordinates of 
+     * the anchor.
+     * 
+     * Note: Microsoft Excel seems to sometimes disallow 
+     * higher y1 than y2 or higher x1 than x2, you might need to 
+     * reverse them and draw shapes vertically or horizontally flipped! 
      *
      * @param x1   the x coordinate within the first cell.
      * @param y1   the y coordinate within the first cell.
index 7745801fd2362ff5db15830a5e44d6a56499a203..dda4b395759509f438d169d397e212e06902e6c8 100644 (file)
@@ -171,6 +171,10 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
     /**
      * Creates a simple shape.  This includes such shapes as lines, rectangles,
      * and ovals.
+     * 
+     * Note: Microsoft Excel seems to sometimes disallow 
+     * higher y1 than y2 or higher x1 than x2 in the anchor, you might need to 
+     * reverse them and draw shapes vertically or horizontally flipped! 
      *
      * @param anchor the client anchor describes how this group is attached
      *               to the sheet.
index 4ea7d31e6a6b75bee07e46a3da6cc8477a712892..4775122f8206b7edb1466f62b8cb39ae2515ccc2 100644 (file)
@@ -27,6 +27,11 @@ import java.io.IOException;
 
 /**
  * An abstract shape.
+ * 
+ * Note: Microsoft Excel seems to sometimes disallow 
+ * higher y1 than y2 or higher x1 than x2 in the anchor, you might need to 
+ * reverse them and draw shapes vertically or horizontally flipped via
+ * setFlipVertical() or setFlipHorizontally(). 
  */
 public abstract class HSSFShape {
     public static final int LINEWIDTH_ONE_PT = 12700;
index 8b84477286eb17b435cd1e1a22a63892cab7c724..c829159a5c4e8eafddf2b5d3bec119c95845639e 100644 (file)
-/* ====================================================================\r
-   Licensed to the Apache Software Foundation (ASF) under one or more\r
-   contributor license agreements.  See the NOTICE file distributed with\r
-   this work for additional information regarding copyright ownership.\r
-   The ASF licenses this file to You under the Apache License, Version 2.0\r
-   (the "License"); you may not use this file except in compliance with\r
-   the License.  You may obtain a copy of the License at\r
-\r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-   Unless required by applicable law or agreed to in writing, software\r
-   distributed under the License is distributed on an "AS IS" BASIS,\r
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-   See the License for the specific language governing permissions and\r
-   limitations under the License.\r
-==================================================================== */\r
-\r
-package org.apache.poi.hssf.model;\r
-\r
-import junit.framework.TestCase;\r
-import org.apache.poi.ddf.*;\r
-import org.apache.poi.hssf.HSSFTestDataSamples;\r
-import org.apache.poi.hssf.record.CommonObjectDataSubRecord;\r
-import org.apache.poi.hssf.record.EscherAggregate;\r
-import org.apache.poi.hssf.record.ObjRecord;\r
-import org.apache.poi.hssf.usermodel.*;\r
-import org.apache.poi.ss.usermodel.Workbook;\r
-import org.apache.poi.util.HexDump;\r
-\r
-import java.io.IOException;\r
-\r
-/**\r
- * @author Evgeniy Berlog\r
- * date: 12.06.12\r
- */\r
-public class TestDrawingShapes extends TestCase {\r
-\r
-    /**\r
-     * HSSFShape tree bust be built correctly\r
-     * Check file with such records structure:\r
-     * -patriarch\r
-     * --shape\r
-     * --group\r
-     * ---group\r
-     * ----shape\r
-     * ----shape\r
-     * ---shape\r
-     * ---group\r
-     * ----shape\r
-     * ----shape\r
-     */\r
-    public void testDrawingGroups() {\r
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");\r
-        HSSFSheet sheet = wb.getSheet("groups");\r
-        HSSFPatriarch patriarch = sheet.getDrawingPatriarch();\r
-        assertEquals(patriarch.getChildren().size(), 2);\r
-        HSSFShapeGroup group = (HSSFShapeGroup) patriarch.getChildren().get(1);\r
-        assertEquals(3, group.getChildren().size());\r
-        HSSFShapeGroup group1 = (HSSFShapeGroup) group.getChildren().get(0);\r
-        assertEquals(2, group1.getChildren().size());\r
-        group1 = (HSSFShapeGroup) group.getChildren().get(2);\r
-        assertEquals(2, group1.getChildren().size());\r
-    }\r
-\r
-    public void testHSSFShapeCompatibility() {\r
-        HSSFSimpleShape shape = new HSSFSimpleShape(null, new HSSFClientAnchor());\r
-        shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);\r
-        assertEquals(0x08000040, shape.getLineStyleColor());\r
-        assertEquals(0x08000009, shape.getFillColor());\r
-        assertEquals(HSSFShape.LINEWIDTH_DEFAULT, shape.getLineWidth());\r
-        assertEquals(HSSFShape.LINESTYLE_SOLID, shape.getLineStyle());\r
-        assertFalse(shape.isNoFill());\r
-\r
-        AbstractShape sp = AbstractShape.createShape(shape, 1);\r
-        EscherContainerRecord spContainer = sp.getSpContainer();\r
-        EscherOptRecord opt =\r
-                spContainer.getChildById(EscherOptRecord.RECORD_ID);\r
-\r
-        assertEquals(7, opt.getEscherProperties().size());\r
-        assertEquals(true,\r
-                ((EscherBoolProperty) opt.lookup(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE)).isTrue());\r
-        assertEquals(0x00000004,\r
-                ((EscherSimpleProperty) opt.lookup(EscherProperties.GEOMETRY__SHAPEPATH)).getPropertyValue());\r
-        assertEquals(0x08000009,\r
-                ((EscherSimpleProperty) opt.lookup(EscherProperties.FILL__FILLCOLOR)).getPropertyValue());\r
-        assertEquals(true,\r
-                ((EscherBoolProperty) opt.lookup(EscherProperties.FILL__NOFILLHITTEST)).isTrue());\r
-        assertEquals(0x08000040,\r
-                ((EscherSimpleProperty) opt.lookup(EscherProperties.LINESTYLE__COLOR)).getPropertyValue());\r
-        assertEquals(true,\r
-                ((EscherBoolProperty) opt.lookup(EscherProperties.LINESTYLE__NOLINEDRAWDASH)).isTrue());\r
-        assertEquals(true,\r
-                ((EscherBoolProperty) opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());\r
-    }\r
-\r
-    public void testDefaultPictureSettings() {\r
-        HSSFPicture picture = new HSSFPicture(null, new HSSFClientAnchor());\r
-        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);\r
-        assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);\r
-        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_NONE);\r
-        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);\r
-        assertEquals(picture.isNoFill(), false);\r
-        assertEquals(picture.getPictureIndex(), -1);//not set yet\r
-    }\r
-\r
-    /**\r
-     * No NullPointerException should appear\r
-     */\r
-    public void testDefaultSettingsWithEmptyContainer() {\r
-        EscherContainerRecord container = new EscherContainerRecord();\r
-        EscherOptRecord opt = new EscherOptRecord();\r
-        opt.setRecordId(EscherOptRecord.RECORD_ID);\r
-        container.addChildRecord(opt);\r
-        ObjRecord obj = new ObjRecord();\r
-        CommonObjectDataSubRecord cod = new CommonObjectDataSubRecord();\r
-        cod.setObjectType(HSSFSimpleShape.OBJECT_TYPE_PICTURE);\r
-        obj.addSubRecord(cod);\r
-        HSSFPicture picture = new HSSFPicture(container, obj);\r
-\r
-        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);\r
-        assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);\r
-        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);\r
-        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);\r
-        assertEquals(picture.isNoFill(), HSSFShape.NO_FILL_DEFAULT);\r
-        assertEquals(picture.getPictureIndex(), -1);//not set yet\r
-    }\r
-\r
-    /**\r
-     * create a rectangle, save the workbook, read back and verify that all shape properties are there\r
-     */\r
-    public void testReadWriteRectangle() throws IOException {\r
-\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-\r
-        HSSFPatriarch drawing = sheet.createDrawingPatriarch();\r
-        HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 50, 50, (short) 2, 2, (short) 4, 4);\r
-        anchor.setAnchorType(2);\r
-        assertEquals(anchor.getAnchorType(), 2);\r
-\r
-        HSSFSimpleShape rectangle = drawing.createSimpleShape(anchor);\r
-        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-        rectangle.setLineWidth(10000);\r
-        rectangle.setFillColor(777);\r
-        assertEquals(rectangle.getFillColor(), 777);\r
-        assertEquals(10000, rectangle.getLineWidth());\r
-        rectangle.setLineStyle(10);\r
-        assertEquals(10, rectangle.getLineStyle());\r
-        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_SQUARE);\r
-        rectangle.setLineStyleColor(1111);\r
-        rectangle.setNoFill(true);\r
-        rectangle.setWrapText(HSSFSimpleShape.WRAP_NONE);\r
-        rectangle.setString(new HSSFRichTextString("teeeest"));\r
-        assertEquals(rectangle.getLineStyleColor(), 1111);\r
-        assertEquals(((EscherSimpleProperty)((EscherOptRecord)HSSFTestHelper.getEscherContainer(rectangle).getChildById(EscherOptRecord.RECORD_ID))\r
-                .lookup(EscherProperties.TEXT__TEXTID)).getPropertyValue(), "teeeest".hashCode());\r
-        assertEquals(rectangle.isNoFill(), true);\r
-        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_NONE);\r
-        assertEquals(rectangle.getString().getString(), "teeeest");\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        drawing = sheet.getDrawingPatriarch();\r
-        assertEquals(1, drawing.getChildren().size());\r
-\r
-        HSSFSimpleShape rectangle2 =\r
-                (HSSFSimpleShape) drawing.getChildren().get(0);\r
-        assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE,\r
-                rectangle2.getShapeType());\r
-        assertEquals(10000, rectangle2.getLineWidth());\r
-        assertEquals(10, rectangle2.getLineStyle());\r
-        assertEquals(anchor, rectangle2.getAnchor());\r
-        assertEquals(rectangle2.getLineStyleColor(), 1111);\r
-        assertEquals(rectangle2.getFillColor(), 777);\r
-        assertEquals(rectangle2.isNoFill(), true);\r
-        assertEquals(rectangle2.getString().getString(), "teeeest");\r
-        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_NONE);\r
-\r
-        rectangle2.setFillColor(3333);\r
-        rectangle2.setLineStyle(9);\r
-        rectangle2.setLineStyleColor(4444);\r
-        rectangle2.setNoFill(false);\r
-        rectangle2.setLineWidth(77);\r
-        rectangle2.getAnchor().setDx1(2);\r
-        rectangle2.getAnchor().setDx2(3);\r
-        rectangle2.getAnchor().setDy1(4);\r
-        rectangle2.getAnchor().setDy2(5);\r
-        rectangle.setWrapText(HSSFSimpleShape.WRAP_BY_POINTS);\r
-        rectangle2.setString(new HSSFRichTextString("test22"));\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        drawing = sheet.getDrawingPatriarch();\r
-        assertEquals(1, drawing.getChildren().size());\r
-        rectangle2 = (HSSFSimpleShape) drawing.getChildren().get(0);\r
-        assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, rectangle2.getShapeType());\r
-        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_BY_POINTS);\r
-        assertEquals(77, rectangle2.getLineWidth());\r
-        assertEquals(9, rectangle2.getLineStyle());\r
-        assertEquals(rectangle2.getLineStyleColor(), 4444);\r
-        assertEquals(rectangle2.getFillColor(), 3333);\r
-        assertEquals(rectangle2.getAnchor().getDx1(), 2);\r
-        assertEquals(rectangle2.getAnchor().getDx2(), 3);\r
-        assertEquals(rectangle2.getAnchor().getDy1(), 4);\r
-        assertEquals(rectangle2.getAnchor().getDy2(), 5);\r
-        assertEquals(rectangle2.isNoFill(), false);\r
-        assertEquals(rectangle2.getString().getString(), "test22");\r
-\r
-        HSSFSimpleShape rect3 = drawing.createSimpleShape(new HSSFClientAnchor());\r
-        rect3.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-\r
-        drawing = wb.getSheetAt(0).getDrawingPatriarch();\r
-        assertEquals(drawing.getChildren().size(), 2);\r
-    }\r
-\r
-    public void testReadExistingImage() {\r
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");\r
-        HSSFSheet sheet = wb.getSheet("pictures");\r
-        HSSFPatriarch drawing = sheet.getDrawingPatriarch();\r
-        assertEquals(1, drawing.getChildren().size());\r
-        HSSFPicture picture = (HSSFPicture) drawing.getChildren().get(0);\r
-\r
-        assertEquals(picture.getPictureIndex(), 2);\r
-        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);\r
-        assertEquals(picture.getFillColor(), 0x5DC943);\r
-        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);\r
-        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);\r
-        assertEquals(picture.isNoFill(), false);\r
-\r
-        picture.setPictureIndex(2);\r
-        assertEquals(picture.getPictureIndex(), 2);\r
-    }\r
-\r
-\r
-    /* assert shape properties when reading shapes from a existing workbook */\r
-    public void testReadExistingRectangle() {\r
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");\r
-        HSSFSheet sheet = wb.getSheet("rectangles");\r
-        HSSFPatriarch drawing = sheet.getDrawingPatriarch();\r
-        assertEquals(1, drawing.getChildren().size());\r
-\r
-        HSSFSimpleShape shape = (HSSFSimpleShape) drawing.getChildren().get(0);\r
-        assertEquals(shape.isNoFill(), false);\r
-        assertEquals(shape.getLineStyle(), HSSFShape.LINESTYLE_DASHDOTGEL);\r
-        assertEquals(shape.getLineStyleColor(), 0x616161);\r
-        assertEquals(HexDump.toHex(shape.getFillColor()), shape.getFillColor(), 0x2CE03D);\r
-        assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT * 2);\r
-        assertEquals(shape.getString().getString(), "POItest");\r
-        assertEquals(shape.getRotationDegree(), 27);\r
-    }\r
-\r
-    public void testShapeIds() {\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet1 = wb.createSheet();\r
-        HSSFPatriarch patriarch1 = sheet1.createDrawingPatriarch();\r
-        for (int i = 0; i < 2; i++) {\r
-            patriarch1.createSimpleShape(new HSSFClientAnchor());\r
-        }\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet1 = wb.getSheetAt(0);\r
-        patriarch1 = sheet1.getDrawingPatriarch();\r
-\r
-        EscherAggregate agg1 = HSSFTestHelper.getEscherAggregate(patriarch1);\r
-        // last shape ID cached in EscherDgRecord\r
-        EscherDgRecord dg1 =\r
-                agg1.getEscherContainer().getChildById(EscherDgRecord.RECORD_ID);\r
-        assertEquals(1026, dg1.getLastMSOSPID());\r
-\r
-        // iterate over shapes and check shapeId\r
-        EscherContainerRecord spgrContainer =\r
-                agg1.getEscherContainer().getChildContainers().get(0);\r
-        // root spContainer + 2 spContainers for shapes\r
-        assertEquals(3, spgrContainer.getChildRecords().size());\r
-\r
-        EscherSpRecord sp0 =\r
-                ((EscherContainerRecord) spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);\r
-        assertEquals(1024, sp0.getShapeId());\r
-\r
-        EscherSpRecord sp1 =\r
-                ((EscherContainerRecord) spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);\r
-        assertEquals(1025, sp1.getShapeId());\r
-\r
-        EscherSpRecord sp2 =\r
-                ((EscherContainerRecord) spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);\r
-        assertEquals(1026, sp2.getShapeId());\r
-    }\r
-\r
-    /**\r
-     * Test get new id for shapes from existing file\r
-     * File already have for 1 shape on each sheet, because document must contain EscherDgRecord for each sheet\r
-     */\r
-    public void testAllocateNewIds() {\r
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("empty.xls");\r
-        HSSFSheet sheet = wb.getSheetAt(0);\r
-        HSSFPatriarch patriarch = sheet.getDrawingPatriarch();\r
-\r
-        /**\r
-         * 2048 - main SpContainer id\r
-         * 2049 - existing shape id\r
-         */\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2050);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2051);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2052);\r
-\r
-        sheet = wb.getSheetAt(1);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        /**\r
-         * 3072 - main SpContainer id\r
-         * 3073 - existing shape id\r
-         */\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3074);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3075);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3076);\r
-\r
-\r
-        sheet = wb.getSheetAt(2);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1026);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1027);\r
-        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1028);\r
-    }\r
-\r
-    public void testOpt() throws Exception {\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-\r
-        // create a sheet with a text box\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());\r
-        EscherOptRecord opt1 = HSSFTestHelper.getOptRecord(textbox);\r
-        EscherOptRecord opt2 = HSSFTestHelper.getEscherContainer(textbox).getChildById(EscherOptRecord.RECORD_ID);\r
-        assertSame(opt1, opt2);\r
-    }\r
-    \r
-    public void testCorrectOrderInOptRecord(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());\r
-        EscherOptRecord opt = HSSFTestHelper.getOptRecord(textbox);    \r
-        \r
-        String opt1Str = opt.toXml();\r
-\r
-        textbox.setFillColor(textbox.getFillColor());\r
-        EscherContainerRecord container = HSSFTestHelper.getEscherContainer(textbox);\r
-        EscherOptRecord optRecord = container.getChildById(EscherOptRecord.RECORD_ID);\r
-        assertEquals(opt1Str, optRecord.toXml());\r
-        textbox.setLineStyle(textbox.getLineStyle());\r
-        assertEquals(opt1Str, optRecord.toXml());\r
-        textbox.setLineWidth(textbox.getLineWidth());\r
-        assertEquals(opt1Str, optRecord.toXml());\r
-        textbox.setLineStyleColor(textbox.getLineStyleColor());\r
-        assertEquals(opt1Str, optRecord.toXml());\r
-    }\r
-\r
-    public void testDgRecordNumShapes(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        EscherAggregate aggregate = HSSFTestHelper.getEscherAggregate(patriarch);\r
-        EscherDgRecord dgRecord = (EscherDgRecord) aggregate.getEscherRecord(0).getChild(0);\r
-        assertEquals(dgRecord.getNumShapes(), 1);\r
-    }\r
-\r
-    public void testTextForSimpleShape(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFSimpleShape shape = patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-\r
-        EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);\r
-        assertEquals(agg.getShapeToObjMapping().size(), 2);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        shape = (HSSFSimpleShape) patriarch.getChildren().get(0);\r
-\r
-        agg = HSSFTestHelper.getEscherAggregate(patriarch);\r
-        assertEquals(agg.getShapeToObjMapping().size(), 2);\r
-\r
-        shape.setString(new HSSFRichTextString("string1"));\r
-        assertEquals(shape.getString().getString(), "string1");\r
-\r
-        assertNotNull(HSSFTestHelper.getEscherContainer(shape).getChildById(EscherTextboxRecord.RECORD_ID));\r
-        assertEquals(agg.getShapeToObjMapping().size(), 2);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        shape = (HSSFSimpleShape) patriarch.getChildren().get(0);\r
-\r
-        assertNotNull(HSSFTestHelper.getTextObjRecord(shape));\r
-        assertEquals(shape.getString().getString(), "string1");\r
-        assertNotNull(HSSFTestHelper.getEscherContainer(shape).getChildById(EscherTextboxRecord.RECORD_ID));\r
-        assertEquals(agg.getShapeToObjMapping().size(), 2);\r
-    }\r
-\r
-    public void testRemoveShapes(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-\r
-        int idx = wb.addPicture(new byte[]{1,2,3}, Workbook.PICTURE_TYPE_JPEG);\r
-        patriarch.createPicture(new HSSFClientAnchor(), idx);\r
-\r
-        patriarch.createCellComment(new HSSFClientAnchor());\r
-\r
-        HSSFPolygon polygon = patriarch.createPolygon(new HSSFClientAnchor());\r
-        polygon.setPoints(new int[]{1,2}, new int[]{2,3});\r
-\r
-        patriarch.createTextbox(new HSSFClientAnchor());\r
-\r
-        HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());\r
-        group.createTextbox(new HSSFChildAnchor());\r
-        group.createPicture(new HSSFChildAnchor(), idx);\r
-\r
-        assertEquals(patriarch.getChildren().size(), 6);\r
-        assertEquals(group.getChildren().size(), 2);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 12);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 12);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-\r
-        assertEquals(patriarch.getChildren().size(), 6);\r
-\r
-        group = (HSSFShapeGroup) patriarch.getChildren().get(5);\r
-        group.removeShape(group.getChildren().get(0));\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 10);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 10);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-\r
-        group = (HSSFShapeGroup) patriarch.getChildren().get(5);\r
-        patriarch.removeShape(group);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 8);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 8);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 5);\r
-\r
-        HSSFShape shape = patriarch.getChildren().get(0);\r
-        patriarch.removeShape(shape);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 6);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 4);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 6);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 4);\r
-\r
-        HSSFPicture picture = (HSSFPicture) patriarch.getChildren().get(0);\r
-        patriarch.removeShape(picture);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 5);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 3);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 5);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 3);\r
-\r
-        HSSFComment comment = (HSSFComment) patriarch.getChildren().get(0);\r
-        patriarch.removeShape(comment);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 3);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 2);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 3);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 2);\r
-\r
-        polygon = (HSSFPolygon) patriarch.getChildren().get(0);\r
-        patriarch.removeShape(polygon);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 2);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 1);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 2);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 1);\r
-\r
-        HSSFTextbox textbox = (HSSFTextbox) patriarch.getChildren().get(0);\r
-        patriarch.removeShape(textbox);\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 0);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 0);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 0);\r
-        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 0);\r
-    }\r
-\r
-    public void testShapeFlip(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-\r
-        assertEquals(rectangle.isFlipVertical(), false);\r
-        assertEquals(rectangle.isFlipHorizontal(), false);\r
-\r
-        rectangle.setFlipVertical(true);\r
-        assertEquals(rectangle.isFlipVertical(), true);\r
-        rectangle.setFlipHorizontal(true);\r
-        assertEquals(rectangle.isFlipHorizontal(), true);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);\r
-\r
-        assertEquals(rectangle.isFlipHorizontal(), true);\r
-        rectangle.setFlipHorizontal(false);\r
-        assertEquals(rectangle.isFlipHorizontal(), false);\r
-\r
-        assertEquals(rectangle.isFlipVertical(), true);\r
-        rectangle.setFlipVertical(false);\r
-        assertEquals(rectangle.isFlipVertical(), false);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);\r
-\r
-        assertEquals(rectangle.isFlipVertical(), false);\r
-        assertEquals(rectangle.isFlipHorizontal(), false);\r
-    }\r
-\r
-    public void testRotation() {\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor(0,0,100,100, (short) 0,0,(short)5,5));\r
-        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);\r
-\r
-        assertEquals(rectangle.getRotationDegree(), 0);\r
-        rectangle.setRotationDegree((short) 45);\r
-        assertEquals(rectangle.getRotationDegree(), 45);\r
-        rectangle.setFlipHorizontal(true);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);\r
-        assertEquals(rectangle.getRotationDegree(), 45);\r
-        rectangle.setRotationDegree((short) 30);\r
-        assertEquals(rectangle.getRotationDegree(), 30);\r
-\r
-        patriarch.setCoordinates(0, 0, 10, 10);\r
-        rectangle.setString(new HSSFRichTextString("1234"));\r
-    }\r
-\r
-    public void testShapeContainerImplementsIterable(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        patriarch.createSimpleShape(new HSSFClientAnchor());\r
-\r
-        int i=2;\r
-\r
-        for (HSSFShape shape: patriarch){\r
-            i--;\r
-        }\r
-        assertEquals(i, 0);\r
-    }\r
-\r
-    public void testClearShapesForPatriarch(){\r
-        HSSFWorkbook wb = new HSSFWorkbook();\r
-        HSSFSheet sheet = wb.createSheet();\r
-        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();\r
-\r
-        patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        patriarch.createSimpleShape(new HSSFClientAnchor());\r
-        patriarch.createCellComment(new HSSFClientAnchor());\r
-\r
-        EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);\r
-\r
-        assertEquals(agg.getShapeToObjMapping().size(), 6);\r
-        assertEquals(agg.getTailRecords().size(), 1);\r
-        assertEquals(patriarch.getChildren().size(), 3);\r
-\r
-        patriarch.clear();\r
-\r
-        assertEquals(agg.getShapeToObjMapping().size(), 0);\r
-        assertEquals(agg.getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 0);\r
-\r
-        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);\r
-        sheet = wb.getSheetAt(0);\r
-        patriarch = sheet.getDrawingPatriarch();\r
-\r
-        assertEquals(agg.getShapeToObjMapping().size(), 0);\r
-        assertEquals(agg.getTailRecords().size(), 0);\r
-        assertEquals(patriarch.getChildren().size(), 0);\r
-    }\r
-}\r
+/* ====================================================================
+   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.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.ddf.EscherBoolProperty;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherDgRecord;
+import org.apache.poi.ddf.EscherOptRecord;
+import org.apache.poi.ddf.EscherProperties;
+import org.apache.poi.ddf.EscherSimpleProperty;
+import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.ddf.EscherTextboxRecord;
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
+import org.apache.poi.hssf.record.EscherAggregate;
+import org.apache.poi.hssf.record.ObjRecord;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.util.HexDump;
+
+
+/**
+ * @author Evgeniy Berlog
+ * date: 12.06.12
+ */
+public class TestDrawingShapes extends TestCase {
+    static {
+        //System.setProperty("poi.deserialize.escher", "true");
+    }
+    
+    /**
+     * HSSFShape tree bust be built correctly
+     * Check file with such records structure:
+     * -patriarch
+     * --shape
+     * --group
+     * ---group
+     * ----shape
+     * ----shape
+     * ---shape
+     * ---group
+     * ----shape
+     * ----shape
+     */
+    public void testDrawingGroups() {
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
+        HSSFSheet sheet = wb.getSheet("groups");
+        HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
+        assertEquals(patriarch.getChildren().size(), 2);
+        HSSFShapeGroup group = (HSSFShapeGroup) patriarch.getChildren().get(1);
+        assertEquals(3, group.getChildren().size());
+        HSSFShapeGroup group1 = (HSSFShapeGroup) group.getChildren().get(0);
+        assertEquals(2, group1.getChildren().size());
+        group1 = (HSSFShapeGroup) group.getChildren().get(2);
+        assertEquals(2, group1.getChildren().size());
+    }
+
+    public void testHSSFShapeCompatibility() {
+        HSSFSimpleShape shape = new HSSFSimpleShape(null, new HSSFClientAnchor());
+        shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
+        assertEquals(0x08000040, shape.getLineStyleColor());
+        assertEquals(0x08000009, shape.getFillColor());
+        assertEquals(HSSFShape.LINEWIDTH_DEFAULT, shape.getLineWidth());
+        assertEquals(HSSFShape.LINESTYLE_SOLID, shape.getLineStyle());
+        assertFalse(shape.isNoFill());
+
+        AbstractShape sp = AbstractShape.createShape(shape, 1);
+        EscherContainerRecord spContainer = sp.getSpContainer();
+        EscherOptRecord opt =
+                spContainer.getChildById(EscherOptRecord.RECORD_ID);
+
+        assertEquals(7, opt.getEscherProperties().size());
+        assertEquals(true,
+                ((EscherBoolProperty) opt.lookup(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE)).isTrue());
+        assertEquals(0x00000004,
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.GEOMETRY__SHAPEPATH)).getPropertyValue());
+        assertEquals(0x08000009,
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.FILL__FILLCOLOR)).getPropertyValue());
+        assertEquals(true,
+                ((EscherBoolProperty) opt.lookup(EscherProperties.FILL__NOFILLHITTEST)).isTrue());
+        assertEquals(0x08000040,
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.LINESTYLE__COLOR)).getPropertyValue());
+        assertEquals(true,
+                ((EscherBoolProperty) opt.lookup(EscherProperties.LINESTYLE__NOLINEDRAWDASH)).isTrue());
+        assertEquals(true,
+                ((EscherBoolProperty) opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());
+    }
+
+    public void testDefaultPictureSettings() {
+        HSSFPicture picture = new HSSFPicture(null, new HSSFClientAnchor());
+        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
+        assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
+        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_NONE);
+        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
+        assertEquals(picture.isNoFill(), false);
+        assertEquals(picture.getPictureIndex(), -1);//not set yet
+    }
+
+    /**
+     * No NullPointerException should appear
+     */
+    public void testDefaultSettingsWithEmptyContainer() {
+        EscherContainerRecord container = new EscherContainerRecord();
+        EscherOptRecord opt = new EscherOptRecord();
+        opt.setRecordId(EscherOptRecord.RECORD_ID);
+        container.addChildRecord(opt);
+        ObjRecord obj = new ObjRecord();
+        CommonObjectDataSubRecord cod = new CommonObjectDataSubRecord();
+        cod.setObjectType(HSSFSimpleShape.OBJECT_TYPE_PICTURE);
+        obj.addSubRecord(cod);
+        HSSFPicture picture = new HSSFPicture(container, obj);
+
+        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
+        assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
+        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
+        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
+        assertEquals(picture.isNoFill(), HSSFShape.NO_FILL_DEFAULT);
+        assertEquals(picture.getPictureIndex(), -1);//not set yet
+    }
+
+    /**
+     * create a rectangle, save the workbook, read back and verify that all shape properties are there
+     */
+    public void testReadWriteRectangle() throws IOException {
+
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+
+        HSSFPatriarch drawing = sheet.createDrawingPatriarch();
+        HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 50, 50, (short) 2, 2, (short) 4, 4);
+        anchor.setAnchorType(2);
+        assertEquals(anchor.getAnchorType(), 2);
+
+        HSSFSimpleShape rectangle = drawing.createSimpleShape(anchor);
+        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+        rectangle.setLineWidth(10000);
+        rectangle.setFillColor(777);
+        assertEquals(rectangle.getFillColor(), 777);
+        assertEquals(10000, rectangle.getLineWidth());
+        rectangle.setLineStyle(10);
+        assertEquals(10, rectangle.getLineStyle());
+        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_SQUARE);
+        rectangle.setLineStyleColor(1111);
+        rectangle.setNoFill(true);
+        rectangle.setWrapText(HSSFSimpleShape.WRAP_NONE);
+        rectangle.setString(new HSSFRichTextString("teeeest"));
+        assertEquals(rectangle.getLineStyleColor(), 1111);
+        assertEquals(((EscherSimpleProperty)((EscherOptRecord)HSSFTestHelper.getEscherContainer(rectangle).getChildById(EscherOptRecord.RECORD_ID))
+                .lookup(EscherProperties.TEXT__TEXTID)).getPropertyValue(), "teeeest".hashCode());
+        assertEquals(rectangle.isNoFill(), true);
+        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_NONE);
+        assertEquals(rectangle.getString().getString(), "teeeest");
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        drawing = sheet.getDrawingPatriarch();
+        assertEquals(1, drawing.getChildren().size());
+
+        HSSFSimpleShape rectangle2 =
+                (HSSFSimpleShape) drawing.getChildren().get(0);
+        assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE,
+                rectangle2.getShapeType());
+        assertEquals(10000, rectangle2.getLineWidth());
+        assertEquals(10, rectangle2.getLineStyle());
+        assertEquals(anchor, rectangle2.getAnchor());
+        assertEquals(rectangle2.getLineStyleColor(), 1111);
+        assertEquals(rectangle2.getFillColor(), 777);
+        assertEquals(rectangle2.isNoFill(), true);
+        assertEquals(rectangle2.getString().getString(), "teeeest");
+        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_NONE);
+
+        rectangle2.setFillColor(3333);
+        rectangle2.setLineStyle(9);
+        rectangle2.setLineStyleColor(4444);
+        rectangle2.setNoFill(false);
+        rectangle2.setLineWidth(77);
+        rectangle2.getAnchor().setDx1(2);
+        rectangle2.getAnchor().setDx2(3);
+        rectangle2.getAnchor().setDy1(4);
+        rectangle2.getAnchor().setDy2(5);
+        rectangle.setWrapText(HSSFSimpleShape.WRAP_BY_POINTS);
+        rectangle2.setString(new HSSFRichTextString("test22"));
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        drawing = sheet.getDrawingPatriarch();
+        assertEquals(1, drawing.getChildren().size());
+        rectangle2 = (HSSFSimpleShape) drawing.getChildren().get(0);
+        assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, rectangle2.getShapeType());
+        assertEquals(rectangle.getWrapText(), HSSFSimpleShape.WRAP_BY_POINTS);
+        assertEquals(77, rectangle2.getLineWidth());
+        assertEquals(9, rectangle2.getLineStyle());
+        assertEquals(rectangle2.getLineStyleColor(), 4444);
+        assertEquals(rectangle2.getFillColor(), 3333);
+        assertEquals(rectangle2.getAnchor().getDx1(), 2);
+        assertEquals(rectangle2.getAnchor().getDx2(), 3);
+        assertEquals(rectangle2.getAnchor().getDy1(), 4);
+        assertEquals(rectangle2.getAnchor().getDy2(), 5);
+        assertEquals(rectangle2.isNoFill(), false);
+        assertEquals(rectangle2.getString().getString(), "test22");
+
+        HSSFSimpleShape rect3 = drawing.createSimpleShape(new HSSFClientAnchor());
+        rect3.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+
+        drawing = wb.getSheetAt(0).getDrawingPatriarch();
+        assertEquals(drawing.getChildren().size(), 2);
+    }
+
+    public void testReadExistingImage() {
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
+        HSSFSheet sheet = wb.getSheet("pictures");
+        HSSFPatriarch drawing = sheet.getDrawingPatriarch();
+        assertEquals(1, drawing.getChildren().size());
+        HSSFPicture picture = (HSSFPicture) drawing.getChildren().get(0);
+
+        assertEquals(picture.getPictureIndex(), 2);
+        assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
+        assertEquals(picture.getFillColor(), 0x5DC943);
+        assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
+        assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
+        assertEquals(picture.isNoFill(), false);
+
+        picture.setPictureIndex(2);
+        assertEquals(picture.getPictureIndex(), 2);
+    }
+
+
+    /* assert shape properties when reading shapes from a existing workbook */
+    public void testReadExistingRectangle() {
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
+        HSSFSheet sheet = wb.getSheet("rectangles");
+        HSSFPatriarch drawing = sheet.getDrawingPatriarch();
+        assertEquals(1, drawing.getChildren().size());
+
+        HSSFSimpleShape shape = (HSSFSimpleShape) drawing.getChildren().get(0);
+        assertEquals(shape.isNoFill(), false);
+        assertEquals(shape.getLineStyle(), HSSFShape.LINESTYLE_DASHDOTGEL);
+        assertEquals(shape.getLineStyleColor(), 0x616161);
+        assertEquals(HexDump.toHex(shape.getFillColor()), shape.getFillColor(), 0x2CE03D);
+        assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT * 2);
+        assertEquals(shape.getString().getString(), "POItest");
+        assertEquals(shape.getRotationDegree(), 27);
+    }
+
+    public void testShapeIds() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet1 = wb.createSheet();
+        HSSFPatriarch patriarch1 = sheet1.createDrawingPatriarch();
+        for (int i = 0; i < 2; i++) {
+            patriarch1.createSimpleShape(new HSSFClientAnchor());
+        }
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet1 = wb.getSheetAt(0);
+        patriarch1 = sheet1.getDrawingPatriarch();
+
+        EscherAggregate agg1 = HSSFTestHelper.getEscherAggregate(patriarch1);
+        // last shape ID cached in EscherDgRecord
+        EscherDgRecord dg1 =
+                agg1.getEscherContainer().getChildById(EscherDgRecord.RECORD_ID);
+        assertEquals(1026, dg1.getLastMSOSPID());
+
+        // iterate over shapes and check shapeId
+        EscherContainerRecord spgrContainer =
+                agg1.getEscherContainer().getChildContainers().get(0);
+        // root spContainer + 2 spContainers for shapes
+        assertEquals(3, spgrContainer.getChildRecords().size());
+
+        EscherSpRecord sp0 =
+                ((EscherContainerRecord) spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);
+        assertEquals(1024, sp0.getShapeId());
+
+        EscherSpRecord sp1 =
+                ((EscherContainerRecord) spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);
+        assertEquals(1025, sp1.getShapeId());
+
+        EscherSpRecord sp2 =
+                ((EscherContainerRecord) spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);
+        assertEquals(1026, sp2.getShapeId());
+    }
+
+    /**
+     * Test get new id for shapes from existing file
+     * File already have for 1 shape on each sheet, because document must contain EscherDgRecord for each sheet
+     */
+    public void testAllocateNewIds() {
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("empty.xls");
+        HSSFSheet sheet = wb.getSheetAt(0);
+        HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
+
+        /**
+         * 2048 - main SpContainer id
+         * 2049 - existing shape id
+         */
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2050);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2051);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2052);
+
+        sheet = wb.getSheetAt(1);
+        patriarch = sheet.getDrawingPatriarch();
+
+        /**
+         * 3072 - main SpContainer id
+         * 3073 - existing shape id
+         */
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3074);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3075);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3076);
+
+
+        sheet = wb.getSheetAt(2);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1026);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1027);
+        assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1028);
+    }
+
+    public void testOpt() throws Exception {
+        HSSFWorkbook wb = new HSSFWorkbook();
+
+        try {
+            // create a sheet with a text box
+            HSSFSheet sheet = wb.createSheet();
+            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+    
+            HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());
+            EscherOptRecord opt1 = HSSFTestHelper.getOptRecord(textbox);
+            EscherOptRecord opt2 = HSSFTestHelper.getEscherContainer(textbox).getChildById(EscherOptRecord.RECORD_ID);
+            assertSame(opt1, opt2);
+        } finally {
+            wb.close();
+        }
+    }
+    
+    public void testCorrectOrderInOptRecord() throws IOException{
+        HSSFWorkbook wb = new HSSFWorkbook();
+        
+        try {
+            HSSFSheet sheet = wb.createSheet();
+            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+    
+            HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());
+            EscherOptRecord opt = HSSFTestHelper.getOptRecord(textbox);
+            
+            String opt1Str = opt.toXml();
+    
+            textbox.setFillColor(textbox.getFillColor());
+            EscherContainerRecord container = HSSFTestHelper.getEscherContainer(textbox);
+            EscherOptRecord optRecord = container.getChildById(EscherOptRecord.RECORD_ID);
+            assertEquals(opt1Str, optRecord.toXml());
+            textbox.setLineStyle(textbox.getLineStyle());
+            assertEquals(opt1Str, optRecord.toXml());
+            textbox.setLineWidth(textbox.getLineWidth());
+            assertEquals(opt1Str, optRecord.toXml());
+            textbox.setLineStyleColor(textbox.getLineStyleColor());
+            assertEquals(opt1Str, optRecord.toXml());
+        } finally {
+            wb.close();
+        }
+    }
+
+    public void testDgRecordNumShapes() throws IOException{
+        HSSFWorkbook wb = new HSSFWorkbook();
+        try {
+            HSSFSheet sheet = wb.createSheet();
+            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+    
+            EscherAggregate aggregate = HSSFTestHelper.getEscherAggregate(patriarch);
+            EscherDgRecord dgRecord = (EscherDgRecord) aggregate.getEscherRecord(0).getChild(0);
+            assertEquals(dgRecord.getNumShapes(), 1);
+        } finally {
+            wb.close();
+        }
+    }
+
+    public void testTextForSimpleShape(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFSimpleShape shape = patriarch.createSimpleShape(new HSSFClientAnchor());
+        shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+
+        EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);
+        assertEquals(agg.getShapeToObjMapping().size(), 2);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        shape = (HSSFSimpleShape) patriarch.getChildren().get(0);
+
+        agg = HSSFTestHelper.getEscherAggregate(patriarch);
+        assertEquals(agg.getShapeToObjMapping().size(), 2);
+
+        shape.setString(new HSSFRichTextString("string1"));
+        assertEquals(shape.getString().getString(), "string1");
+
+        assertNotNull(HSSFTestHelper.getEscherContainer(shape).getChildById(EscherTextboxRecord.RECORD_ID));
+        assertEquals(agg.getShapeToObjMapping().size(), 2);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        shape = (HSSFSimpleShape) patriarch.getChildren().get(0);
+
+        assertNotNull(HSSFTestHelper.getTextObjRecord(shape));
+        assertEquals(shape.getString().getString(), "string1");
+        assertNotNull(HSSFTestHelper.getEscherContainer(shape).getChildById(EscherTextboxRecord.RECORD_ID));
+        assertEquals(agg.getShapeToObjMapping().size(), 2);
+    }
+
+    public void testRemoveShapes(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor());
+        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+
+        int idx = wb.addPicture(new byte[]{1,2,3}, Workbook.PICTURE_TYPE_JPEG);
+        patriarch.createPicture(new HSSFClientAnchor(), idx);
+
+        patriarch.createCellComment(new HSSFClientAnchor());
+
+        HSSFPolygon polygon = patriarch.createPolygon(new HSSFClientAnchor());
+        polygon.setPoints(new int[]{1,2}, new int[]{2,3});
+
+        patriarch.createTextbox(new HSSFClientAnchor());
+
+        HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
+        group.createTextbox(new HSSFChildAnchor());
+        group.createPicture(new HSSFChildAnchor(), idx);
+
+        assertEquals(patriarch.getChildren().size(), 6);
+        assertEquals(group.getChildren().size(), 2);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 12);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 12);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+
+        assertEquals(patriarch.getChildren().size(), 6);
+
+        group = (HSSFShapeGroup) patriarch.getChildren().get(5);
+        group.removeShape(group.getChildren().get(0));
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 10);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 10);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+
+        group = (HSSFShapeGroup) patriarch.getChildren().get(5);
+        patriarch.removeShape(group);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 8);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 8);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 5);
+
+        HSSFShape shape = patriarch.getChildren().get(0);
+        patriarch.removeShape(shape);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 6);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 4);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 6);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 4);
+
+        HSSFPicture picture = (HSSFPicture) patriarch.getChildren().get(0);
+        patriarch.removeShape(picture);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 5);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 3);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 5);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 3);
+
+        HSSFComment comment = (HSSFComment) patriarch.getChildren().get(0);
+        patriarch.removeShape(comment);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 3);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 2);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 3);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 2);
+
+        polygon = (HSSFPolygon) patriarch.getChildren().get(0);
+        patriarch.removeShape(polygon);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 2);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 1);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 2);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 1);
+
+        HSSFTextbox textbox = (HSSFTextbox) patriarch.getChildren().get(0);
+        patriarch.removeShape(textbox);
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 0);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 0);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getShapeToObjMapping().size(), 0);
+        assertEquals(HSSFTestHelper.getEscherAggregate(patriarch).getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 0);
+    }
+
+    public void testShapeFlip(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor());
+        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+
+        assertEquals(rectangle.isFlipVertical(), false);
+        assertEquals(rectangle.isFlipHorizontal(), false);
+
+        rectangle.setFlipVertical(true);
+        assertEquals(rectangle.isFlipVertical(), true);
+        rectangle.setFlipHorizontal(true);
+        assertEquals(rectangle.isFlipHorizontal(), true);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);
+
+        assertEquals(rectangle.isFlipHorizontal(), true);
+        rectangle.setFlipHorizontal(false);
+        assertEquals(rectangle.isFlipHorizontal(), false);
+
+        assertEquals(rectangle.isFlipVertical(), true);
+        rectangle.setFlipVertical(false);
+        assertEquals(rectangle.isFlipVertical(), false);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);
+
+        assertEquals(rectangle.isFlipVertical(), false);
+        assertEquals(rectangle.isFlipHorizontal(), false);
+    }
+
+    public void testRotation() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFSimpleShape rectangle = patriarch.createSimpleShape(new HSSFClientAnchor(0,0,100,100, (short) 0,0,(short)5,5));
+        rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
+
+        assertEquals(rectangle.getRotationDegree(), 0);
+        rectangle.setRotationDegree((short) 45);
+        assertEquals(rectangle.getRotationDegree(), 45);
+        rectangle.setFlipHorizontal(true);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+        rectangle = (HSSFSimpleShape) patriarch.getChildren().get(0);
+        assertEquals(rectangle.getRotationDegree(), 45);
+        rectangle.setRotationDegree((short) 30);
+        assertEquals(rectangle.getRotationDegree(), 30);
+
+        patriarch.setCoordinates(0, 0, 10, 10);
+        rectangle.setString(new HSSFRichTextString("1234"));
+    }
+
+    public void testShapeContainerImplementsIterable() throws IOException{
+        HSSFWorkbook wb = new HSSFWorkbook();
+        
+        try {
+            HSSFSheet sheet = wb.createSheet();
+            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+    
+            patriarch.createSimpleShape(new HSSFClientAnchor());
+            patriarch.createSimpleShape(new HSSFClientAnchor());
+    
+            int i=2;
+    
+            for (HSSFShape shape: patriarch){
+                i--;
+            }
+            assertEquals(i, 0);
+        } finally {
+            wb.close();
+        }
+    }
+
+    public void testClearShapesForPatriarch(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        patriarch.createSimpleShape(new HSSFClientAnchor());
+        patriarch.createSimpleShape(new HSSFClientAnchor());
+        patriarch.createCellComment(new HSSFClientAnchor());
+
+        EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);
+
+        assertEquals(agg.getShapeToObjMapping().size(), 6);
+        assertEquals(agg.getTailRecords().size(), 1);
+        assertEquals(patriarch.getChildren().size(), 3);
+
+        patriarch.clear();
+
+        assertEquals(agg.getShapeToObjMapping().size(), 0);
+        assertEquals(agg.getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 0);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sheet = wb.getSheetAt(0);
+        patriarch = sheet.getDrawingPatriarch();
+
+        assertEquals(agg.getShapeToObjMapping().size(), 0);
+        assertEquals(agg.getTailRecords().size(), 0);
+        assertEquals(patriarch.getChildren().size(), 0);
+    }
+    
+    public void testBug45312() throws Exception {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        try {
+            HSSFSheet sheet = wb.createSheet();
+            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+    
+            {
+                HSSFClientAnchor a1 = new HSSFClientAnchor();
+                a1.setAnchor( (short)1, 1, 0, 0, (short) 1, 1, 512, 100);
+                HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
+                shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
+            }
+            {
+                HSSFClientAnchor a1 = new HSSFClientAnchor();
+                a1.setAnchor( (short)1, 1, 512, 0, (short) 1, 1, 1024, 100);
+                HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
+                shape1.setFlipVertical(true);
+                shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
+            }
+
+            {
+                HSSFClientAnchor a1 = new HSSFClientAnchor();
+                a1.setAnchor( (short)2, 2, 0, 0, (short) 2, 2, 512, 100);
+                HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
+                shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
+            }
+            {
+                HSSFClientAnchor a1 = new HSSFClientAnchor();
+                a1.setAnchor( (short)2, 2, 0, 100, (short) 2, 2, 512, 200);
+                HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
+                shape1.setFlipHorizontal(true);
+                shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
+            }
+            
+            /*OutputStream stream = new FileOutputStream("/tmp/45312.xls");
+            try {
+                wb.write(stream);
+            } finally {
+                stream.close();
+            }*/
+            
+            checkWorkbookBack(wb);
+        } finally {
+            wb.close();
+        }
+    }
+
+    private void checkWorkbookBack(HSSFWorkbook wb) {
+        HSSFWorkbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        assertNotNull(wbBack);
+        
+        HSSFSheet sheetBack = wbBack.getSheetAt(0);
+        assertNotNull(sheetBack);
+        
+        HSSFPatriarch patriarchBack = sheetBack.getDrawingPatriarch();
+        assertNotNull(patriarchBack);
+        
+        List<HSSFShape> children = patriarchBack.getChildren();
+        assertEquals(4, children.size());
+        HSSFShape hssfShape = children.get(0);
+        assertTrue(hssfShape instanceof HSSFSimpleShape);
+        HSSFAnchor anchor = hssfShape.getAnchor();
+        assertTrue(anchor instanceof HSSFClientAnchor);
+        assertEquals(0, anchor.getDx1());
+        assertEquals(512, anchor.getDx2());
+        assertEquals(0, anchor.getDy1());
+        assertEquals(100, anchor.getDy2());
+        HSSFClientAnchor cAnchor = (HSSFClientAnchor) anchor;
+        assertEquals(1, cAnchor.getCol1());
+        assertEquals(1, cAnchor.getCol2());
+        assertEquals(1, cAnchor.getRow1());
+        assertEquals(1, cAnchor.getRow2());
+
+        hssfShape = children.get(1);
+        assertTrue(hssfShape instanceof HSSFSimpleShape);
+        anchor = hssfShape.getAnchor();
+        assertTrue(anchor instanceof HSSFClientAnchor);
+        assertEquals(512, anchor.getDx1());
+        assertEquals(1024, anchor.getDx2());
+        assertEquals(0, anchor.getDy1());
+        assertEquals(100, anchor.getDy2());
+        cAnchor = (HSSFClientAnchor) anchor;
+        assertEquals(1, cAnchor.getCol1());
+        assertEquals(1, cAnchor.getCol2());
+        assertEquals(1, cAnchor.getRow1());
+        assertEquals(1, cAnchor.getRow2());
+
+        hssfShape = children.get(2);
+        assertTrue(hssfShape instanceof HSSFSimpleShape);
+        anchor = hssfShape.getAnchor();
+        assertTrue(anchor instanceof HSSFClientAnchor);
+        assertEquals(0, anchor.getDx1());
+        assertEquals(512, anchor.getDx2());
+        assertEquals(0, anchor.getDy1());
+        assertEquals(100, anchor.getDy2());
+        cAnchor = (HSSFClientAnchor) anchor;
+        assertEquals(2, cAnchor.getCol1());
+        assertEquals(2, cAnchor.getCol2());
+        assertEquals(2, cAnchor.getRow1());
+        assertEquals(2, cAnchor.getRow2());
+
+        hssfShape = children.get(3);
+        assertTrue(hssfShape instanceof HSSFSimpleShape);
+        anchor = hssfShape.getAnchor();
+        assertTrue(anchor instanceof HSSFClientAnchor);
+        assertEquals(0, anchor.getDx1());
+        assertEquals(512, anchor.getDx2());
+        assertEquals(100, anchor.getDy1());
+        assertEquals(200, anchor.getDy2());
+        cAnchor = (HSSFClientAnchor) anchor;
+        assertEquals(2, cAnchor.getCol1());
+        assertEquals(2, cAnchor.getCol2());
+        assertEquals(2, cAnchor.getRow1());
+        assertEquals(2, cAnchor.getRow2());
+    }
+}