]> source.dussan.org Git - poi.git/commitdiff
Write tests for xssf StylesTable, now able to round-trip just fine
authorNick Burch <nick@apache.org>
Sat, 22 Mar 2008 15:09:37 +0000 (15:09 +0000)
committerNick Burch <nick@apache.org>
Sat, 22 Mar 2008 15:09:37 +0000 (15:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@640005 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java [new file with mode: 0644]

index 7e1cef9efee5a5ac1740608951d68858e1d6c14a..fcb0503daaee8f38584d51dad3d87594132faa28 100644 (file)
@@ -84,8 +84,15 @@ public class StylesTable implements StylesSource, XSSFModel {
        doc = StyleSheetDocument.Factory.newInstance();
        doc.addNewStyleSheet();
        
-       // Add a single, default cell style xf
-       xfs.add(CTXf.Factory.newInstance());
+       // Add a single, default cell xf and cell style xf
+       // Excel seems to require these
+       CTXf[] ctxfs = new CTXf[2];
+       for (int i = 0; i < ctxfs.length; i++) {
+                       ctxfs[i] = CTXf.Factory.newInstance(); 
+                       ctxfs[i].setNumFmtId(0);
+               }
+       xfs.add(ctxfs[0]);
+       styleXfs.add(ctxfs[1]);
     }
 
     /**
@@ -224,6 +231,18 @@ public class StylesTable implements StylesSource, XSSFModel {
     public int _getBordersSize() {
        return borders.size();
     }
+    /**
+     * For unit testing only
+     */
+    public int _getXfsSize() {
+       return xfs.size();
+    }
+    /**
+     * For unit testing only
+     */
+    public int _getStyleXfsSize() {
+       return styleXfs.size();
+    }
     /**
      * For unit testing only!
      */
@@ -246,10 +265,6 @@ public class StylesTable implements StylesSource, XSSFModel {
         // Requests use of whitespace for easier reading
         options.setSavePrettyPrint();
 
-        // XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2
-        options.setSaveSyntheticDocumentElement(
-                       new QName(CTStylesheet.type.getName().getNamespaceURI(), doc.getStyleSheet().getDomNode().getNodeName()));
-
         
         // Work on the current one
         // Need to do this, as we don't handle
index c899d4c13c256bd968f94722846100ed284e7507..3d15cd919e25a071cd1931ffde8305011a7d95d8 100644 (file)
@@ -95,6 +95,7 @@ public class XSSFCell implements Cell {
     }
 
     public CellStyle getCellStyle() {
+       // Zero is the empty default
        if(this.cell.getS() > 0) {
                return stylesSource.getStyleAt(this.cell.getS());
        }
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java
new file mode 100644 (file)
index 0000000..be187cc
--- /dev/null
@@ -0,0 +1,172 @@
+/* ====================================================================
+   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.xssf.model;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import junit.framework.TestCase;
+
+public class TestStylesTable extends TestCase {
+       private File xml;
+       
+       protected void setUp() throws Exception {
+               xml = new File(
+                               System.getProperty("HSSF.testdata.path") +
+                               File.separator + "Formatting.xlsx"
+               );
+               assertTrue(xml.exists());
+       }
+
+       public void testCreateNew() throws Exception {
+               StylesTable st = new StylesTable();
+               
+               // Check defaults
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(1, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(0, st._getNumberFormatSize());
+       }
+       
+       public void testCreateSaveLoad() throws Exception {
+               StylesTable st = new StylesTable();
+               
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(1, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(0, st._getNumberFormatSize());
+               
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               st.writeTo(baos);
+               ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+               st = new StylesTable(bais);
+               
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(1, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(0, st._getNumberFormatSize());
+       }
+       
+       public void testLoadExisting() throws Exception {
+               XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
+               assertNotNull(workbook.getStylesSource());
+               
+               StylesTable st = (StylesTable)workbook.getStylesSource();
+               
+               doTestExisting(st);
+       }
+       public void testLoadSaveLoad() throws Exception {
+               XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
+               assertNotNull(workbook.getStylesSource());
+               
+               StylesTable st = (StylesTable)workbook.getStylesSource();
+               doTestExisting(st);
+               
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               st.writeTo(baos);
+               ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+               st = new StylesTable(bais);
+               doTestExisting(st);
+       }
+       public void doTestExisting(StylesTable st) throws Exception {
+               // Check contents
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(11, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(8, st._getNumberFormatSize());
+               
+               assertEquals(2, st._getFontsSize());
+               assertEquals(2, st._getFillsSize());
+               assertEquals(1, st._getBordersSize());
+               
+               assertEquals("yyyy/mm/dd", st.getNumberFormatAt(165));
+               assertEquals("yy/mm/dd", st.getNumberFormatAt(167));
+               
+               assertNotNull(st.getStyleAt(0));
+               assertNotNull(st.getStyleAt(1));
+               assertNotNull(st.getStyleAt(2));
+               
+               assertEquals(0, st.getStyleAt(0).getDataFormat());
+               assertEquals(14, st.getStyleAt(1).getDataFormat());
+               assertEquals(0, st.getStyleAt(2).getDataFormat());
+               assertEquals(165, st.getStyleAt(3).getDataFormat());
+               
+               assertEquals("yyyy/mm/dd", st.getStyleAt(3).getDataFormatString());
+       }
+       
+       public void testPopulateNew() throws Exception {
+               StylesTable st = new StylesTable();
+               
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(1, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(0, st._getNumberFormatSize());
+               
+               long nf1 = st.putNumberFormat("yyyy-mm-dd");
+               long nf2 = st.putNumberFormat("yyyy-mm-DD");
+               assertEquals(nf1, st.putNumberFormat("yyyy-mm-dd"));
+               
+               st.putStyle(new XSSFCellStyle(st));
+               
+               // Save and re-load
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               st.writeTo(baos);
+               ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+               st = new StylesTable(bais);
+               
+               assertNotNull(st._getRawStylesheet());
+               assertEquals(2, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(2, st._getNumberFormatSize());
+               
+               assertEquals("yyyy-mm-dd", st.getNumberFormatAt(nf1));
+               assertEquals(nf1, st.putNumberFormat("yyyy-mm-dd"));
+               assertEquals(nf2, st.putNumberFormat("yyyy-mm-DD"));
+       }
+       
+       public void testPopulateExisting() throws Exception {
+               XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
+               assertNotNull(workbook.getStylesSource());
+               
+               StylesTable st = (StylesTable)workbook.getStylesSource();
+               assertEquals(11, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(8, st._getNumberFormatSize());
+               
+               long nf1 = st.putNumberFormat("YYYY-mm-dd");
+               long nf2 = st.putNumberFormat("YYYY-mm-DD");
+               assertEquals(nf1, st.putNumberFormat("YYYY-mm-dd"));
+               
+               ByteArrayOutputStream baos = new ByteArrayOutputStream();
+               st.writeTo(baos);
+               ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+               st = new StylesTable(bais);
+               
+               assertEquals(11, st._getXfsSize());
+               assertEquals(1, st._getStyleXfsSize());
+               assertEquals(10, st._getNumberFormatSize());
+               
+               assertEquals("YYYY-mm-dd", st.getNumberFormatAt(nf1));
+               assertEquals(nf1, st.putNumberFormat("YYYY-mm-dd"));
+               assertEquals(nf2, st.putNumberFormat("YYYY-mm-DD"));
+       }
+}