]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
First step towards building row groups at the FO tree stage. The built row groups...
authorVincent Hennebert <vhennebert@apache.org>
Mon, 5 Nov 2007 16:07:45 +0000 (16:07 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Mon, 5 Nov 2007 16:07:45 +0000 (16:07 +0000)
- introduced RowGroupBuilder hierarchy;
- moved TableRowIterator test cases into fotree, and integrated them in the test suite.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@592058 13f79535-47bb-0310-9956-ffa450edef68

24 files changed:
src/java/org/apache/fop/fo/flow/FixedColRowGroupBuilder.java [new file with mode: 0644]
src/java/org/apache/fop/fo/flow/RowGroupBuilder.java [new file with mode: 0644]
src/java/org/apache/fop/fo/flow/Table.java
src/java/org/apache/fop/fo/flow/TableBody.java
src/java/org/apache/fop/fo/flow/TableCellContainer.java
src/java/org/apache/fop/fo/flow/TableFooter.java
src/java/org/apache/fop/fo/flow/TableHeader.java
src/java/org/apache/fop/fo/flow/VariableColRowGroupBuilder.java [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-col_no-row_simple.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-col_no-row_spans.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-col_simple.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-col_spans.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-row_simple.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_no-row_spans.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_simple.fo [new file with mode: 0644]
test/fotree/unittests/table/TableRowIterator_spans.fo [new file with mode: 0644]
test/java/org/apache/fop/fo/flow/AbstractTableTestCase.java
test/java/org/apache/fop/fo/flow/TableColumnColumnNumberTestCase.java
test/java/org/apache/fop/fo/flow/TableRowIteratorTestCase.java [new file with mode: 0644]
test/java/org/apache/fop/layoutmgr/table/TableRowIteratorTestCase.java [deleted file]
test/layoutmgr/table/TableRowIterator_no-row_simple.fo [deleted file]
test/layoutmgr/table/TableRowIterator_no-row_spans.fo [deleted file]
test/layoutmgr/table/TableRowIterator_simple.fo [deleted file]
test/layoutmgr/table/TableRowIterator_spans.fo [deleted file]

diff --git a/src/java/org/apache/fop/fo/flow/FixedColRowGroupBuilder.java b/src/java/org/apache/fop/fo/flow/FixedColRowGroupBuilder.java
new file mode 100644 (file)
index 0000000..5a4bd24
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fo.flow;
+
+
+/**
+ * A row group builder optimised for a fixed number of columns, known before the parsing
+ * of cells starts (that is, if the fo:table has explicit fo:table-column children).
+ */
+class FixedColRowGroupBuilder extends RowGroupBuilder {
+
+
+    FixedColRowGroupBuilder(Table t) {
+        super(t);
+        numberOfColumns = t.getNumberOfColumns();
+    }
+
+}
diff --git a/src/java/org/apache/fop/fo/flow/RowGroupBuilder.java b/src/java/org/apache/fop/fo/flow/RowGroupBuilder.java
new file mode 100644 (file)
index 0000000..359ccd5
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fo.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.fop.layoutmgr.table.GridUnit;
+import org.apache.fop.layoutmgr.table.PrimaryGridUnit;
+
+/**
+ * A class that creates groups of rows belonging to a same set of spans. The first row of
+ * such a group has only cells which don't span over several rows, or whose spanning
+ * starts on this row. Similarly, the last row has only non-row spanning cells or spans
+ * which end on this row.
+ */
+abstract class RowGroupBuilder {
+
+    /** Number of columns in the corresponding table. */
+    protected int numberOfColumns;
+
+    /** 0-based, index in the row group. */
+    private int currentRowIndex;
+
+    private Table table;
+
+    /** The rows belonging to this row group. List of List of {@link GridUnit}s. */
+    protected List rows;
+
+    /**
+     * Creates and initialises a new builder for the given table.
+     * 
+     * @param t a table
+     */
+    protected RowGroupBuilder(Table t) {
+        table = t;
+        initialize();
+    }
+
+    /**
+     * Prepares this builder for creating a new row group.
+     */
+    private void initialize() {
+        rows = new ArrayList();
+        currentRowIndex = 0;
+    }
+
+    /**
+     * Adds a table-cell to the row-group, creating {@link GridUnit}s accordingly.
+     * 
+     * @param cell
+     */
+    void addTableCell(TableCell cell) {
+        for (int i = rows.size(); i < currentRowIndex + cell.getNumberRowsSpanned(); i++) {
+            List effRow = new ArrayList(numberOfColumns);
+            for (int j = 0; j < numberOfColumns; j++) {
+                effRow.add(null);
+            }
+            rows.add(effRow);
+        }
+        int columnIndex = cell.getColumnNumber() - 1;
+        PrimaryGridUnit pgu = new PrimaryGridUnit(cell, table.getColumn(columnIndex), columnIndex,
+                currentRowIndex);
+        List row = (List) rows.get(currentRowIndex);
+        row.set(columnIndex, pgu);
+        for (int j = 1; j < cell.getNumberColumnsSpanned(); j++) {
+            row.set(j + columnIndex,
+                    new GridUnit(pgu, table.getColumn(columnIndex + j), columnIndex + j, j));
+        }
+        for (int i = 1; i < cell.getNumberRowsSpanned(); i++) {
+            row = (List) rows.get(currentRowIndex + i);
+            for (int j = 0; j < cell.getNumberColumnsSpanned(); j++) {
+                row.set(j + columnIndex,
+                        new GridUnit(pgu, table.getColumn(columnIndex + j), columnIndex + j, j));
+            }
+        }
+        
+    }
+
+    /**
+     * Signals that a table row has just ended, potentially finishing the current row
+     * group.
+     * 
+     * @param body the table-body containing the row. Its
+     * {@link TableBody#addRowGroup(List)} method will be called if the current row group
+     * is finished.
+     */
+    void signalNewRow(TableBody body) {
+        if (currentRowIndex == rows.size() - 1) {
+            // Means that the current row has no cell spanning over following rows
+            body.addRowGroup(rows);
+            initialize();
+        } else {
+            currentRowIndex++;
+        }
+    }
+
+    /**
+     * Finishes and records the last row-group of the given table-body, if any. If there
+     * is no fo:table-row and the last cell of the table-body didn't have ends-row="true",
+     * then the {@link signalNewRow} method has not been called and the last row group has
+     * yet to be recorded.
+     * 
+     * @param tableBody
+     */
+    void finishLastRowGroup(TableBody tableBody) {
+        if (rows.size() > 0) {
+            tableBody.addRowGroup(rows);
+        }
+        // Reset, in case this rowGroupBuilder is re-used for other
+        // table-header/footer/body
+        initialize();
+    }
+
+}
index 87f224c65dbb8374ff1c62e8020c05904aadf967..ab58686fc69c37f6cef9812dadc6bf87984745b0 100644 (file)
 package org.apache.fop.fo.flow;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.Length;
 import org.apache.fop.datatypes.ValidationPercentBaseContext;
 import org.apache.fop.fo.FONode;
-import org.apache.fop.fo.FObj;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.StaticPropertyList;
 import org.apache.fop.fo.ValidationException;
@@ -86,6 +86,7 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
 
     private boolean hasExplicitColumns = false;
     private boolean columnsFinalized = false;
+    private RowGroupBuilder rowGroupBuilder;
 
     /**
      * The table's property list. Used in case the table has
@@ -226,6 +227,7 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
                 }
             }
             this.propList = null;
+            rowGroupBuilder = null;
         }
         getFOEventHandler().endTable(this);
 
@@ -250,9 +252,15 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
         case FO_TABLE_HEADER:
         case FO_TABLE_FOOTER:
         case FO_TABLE_BODY:
-            if (hasExplicitColumns && !columnsFinalized) {
+            if (!columnsFinalized) {
                 columnsFinalized = true;
-                finalizeColumns();
+                if (hasExplicitColumns) {
+                    finalizeColumns();
+                    rowGroupBuilder = new FixedColRowGroupBuilder(this);
+                } else {
+                    rowGroupBuilder = new VariableColRowGroupBuilder(this);
+                }
+                
             }
             switch (childId) {
             case FO_TABLE_FOOTER:
@@ -293,9 +301,36 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
      * columns
      */
     void ensureColumnNumber(int columnNumber) throws FOPException {
+        assert !hasExplicitColumns;
         for (int i = columns.size() + 1; i <= columnNumber; i++) {
             columns.add(createImplicitColumn(i));
         }
+        ((VariableColRowGroupBuilder) rowGroupBuilder).ensureNumberOfColumns(columnNumber);
+        if (tableHeader != null) {
+            for (Iterator iter = tableHeader.getRowGroups().iterator(); iter.hasNext();) {
+                VariableColRowGroupBuilder.fillWithEmptyGridUnits((List) iter.next(),
+                        columnNumber); 
+            }
+        }
+        if (tableFooter != null) {
+            for (Iterator iter = tableFooter.getRowGroups().iterator(); iter.hasNext();) {
+                VariableColRowGroupBuilder.fillWithEmptyGridUnits((List) iter.next(),
+                        columnNumber); 
+            }
+        }
+        FONodeIterator bodyIter = getChildNodes();
+        if (bodyIter != null) {
+            while (bodyIter.hasNext()) {
+                FONode node = bodyIter.nextNode();
+                if (node instanceof TableBody) { // AFAIK, may be a marker
+                    for (Iterator iter = ((TableBody) node).getRowGroups().iterator();
+                            iter.hasNext();) {
+                        VariableColRowGroupBuilder.fillWithEmptyGridUnits((List) iter.next(),
+                                columnNumber); 
+                    }
+                }
+            }
+        }
     }
 
     private TableColumn createImplicitColumn(int colNumber)
@@ -499,18 +534,22 @@ public class Table extends TableFObj implements ColumnNumberManagerHolder {
      */
     public FONode clone(FONode parent, boolean removeChildren)
         throws FOPException {
-        FObj fobj = (FObj) super.clone(parent, removeChildren);
+        Table clone = (Table) super.clone(parent, removeChildren);
+        clone.columnsFinalized = false;
         if (removeChildren) {
-            Table t = (Table) fobj;
-            t.columns = new ArrayList();
-            t.tableHeader = null;
-            t.tableFooter = null;
+            clone.columns = new ArrayList();
+            clone.tableHeader = null;
+            clone.tableFooter = null;
         }
-        return fobj;
+        return clone;
     }
 
     /** {@inheritDoc} */
     public ColumnNumberManager getColumnNumberManager() {
         return columnNumberManager;
     }
+
+    RowGroupBuilder getRowGroupBuilder() {
+        return rowGroupBuilder;
+    }
 }
index 72c0ff61085802282397f2d886d077ce58a5188f..e8e1183b3c0a7055c0dfa1e755d1a3816aae113a 100644 (file)
@@ -20,6 +20,8 @@
 package org.apache.fop.fo.flow;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.FONode;
@@ -55,6 +57,8 @@ public class TableBody extends TableCellContainer {
 
     private boolean rowsStarted = false;
 
+    private List rowGroups = new LinkedList();
+
     /**
      * @param parent FONode that is the parent of the object
      */
@@ -119,6 +123,8 @@ public class TableBody extends TableCellContainer {
                         + "Expected: marker* (table-row+|table-cell+)");
                 getParent().removeChild(this);
             }
+        } else {
+            getTable().getRowGroupBuilder().finishLastRowGroup(this);
         }
     }
 
@@ -165,6 +171,7 @@ public class TableBody extends TableCellContainer {
             case FO_TABLE_ROW:
                 if (rowsStarted) {
                     columnNumberManager.prepareForNextRow(pendingSpans);
+                    getTable().getRowGroupBuilder().signalNewRow(this);
                 }
                 rowsStarted = true;
                 break;
@@ -175,6 +182,7 @@ public class TableBody extends TableCellContainer {
                 if (cell.endsRow()) {
                     firstRow = false;
                     columnNumberManager.prepareForNextRow(pendingSpans);
+                    getTable().getRowGroupBuilder().signalNewRow(this);
                 }
                 break;
             default:
@@ -184,6 +192,14 @@ public class TableBody extends TableCellContainer {
         super.addChildNode(child);
     }
 
+    void addRowGroup(List rowGroup) {
+        rowGroups.add(rowGroup);
+    }
+
+    List getRowGroups() {
+        return rowGroups;
+    }
+
     /**
      * @return the Common Border, Padding, and Background Properties.
      */
@@ -218,6 +234,7 @@ public class TableBody extends TableCellContainer {
             TableCell previousCell = (TableCell) getChildNodes().lastNode();
             if (!previousCell.endsRow()) {
                 columnNumberManager.prepareForNextRow(pendingSpans);
+                getTable().getRowGroupBuilder().signalNewRow(this);
             }
         }
         rowsStarted = true;
index 9f9b72d75d3e109ec9d54da0d08afe8ee721426b..c409e01afd28894bfb2ce03334f42e2f73caade6 100644 (file)
@@ -95,6 +95,8 @@ public abstract class TableCellContainer extends TableFObj implements ColumnNumb
         }
 
         columnNumberManager.signalUsedColumnNumbers(colNumber, colNumber + colSpan - 1);
+
+        t.getRowGroupBuilder().addTableCell(cell);
     }
 
     private void handleCellWidth(TableCell cell, int colNumber, int colSpan) throws FOPException {
index a543ca11f7360a23f66ce7543b2a4c01dba27775..a16586af9d6c9ad3395d46834a4fc0a825cd37c6 100644 (file)
@@ -50,6 +50,8 @@ public class TableFooter extends TableBody {
 //      getFOEventHandler().endFooter(this);
         if (!(tableRowsFound || tableCellsFound)) {
             missingChildElementError("marker* (table-row+|table-cell+)");
+        } else {
+            getTable().getRowGroupBuilder().finishLastRowGroup(this);
         }
 //      convertCellsToRows();
     }
index 568303c0d5f02e085f5afd0bde3a4eeaff593748..eb3568d47062a9e37b9cb222d7276a639045c8ab 100644 (file)
@@ -50,6 +50,8 @@ public class TableHeader extends TableBody {
 //      getFOEventHandler().endHeader(this);
         if (!(tableRowsFound || tableCellsFound)) {
             missingChildElementError("marker* (table-row+|table-cell+)");
+        } else {
+            getTable().getRowGroupBuilder().finishLastRowGroup(this);
         }
 //      convertCellsToRows();
     }
diff --git a/src/java/org/apache/fop/fo/flow/VariableColRowGroupBuilder.java b/src/java/org/apache/fop/fo/flow/VariableColRowGroupBuilder.java
new file mode 100644 (file)
index 0000000..a59c987
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fo.flow;
+
+import java.util.List;
+
+import org.apache.fop.layoutmgr.table.EmptyGridUnit;
+
+/**
+ * A row group builder accommodating a variable number of columns. More flexible, but less
+ * efficient.
+ */
+class VariableColRowGroupBuilder extends RowGroupBuilder {
+
+    VariableColRowGroupBuilder(Table t) {
+        super(t);
+        numberOfColumns = 1;
+    }
+
+    /**
+     * Fills the given row group with empty grid units if necessary, so that it matches
+     * the given number of columns.
+     * 
+     * @param rowGroup a List of List of GridUnit
+     * @param numberOfColumns the number of columns that the row group must have
+     */
+    static void fillWithEmptyGridUnits(List rowGroup, int numberOfColumns) {
+        for (int i = 0; i < rowGroup.size(); i++) {
+            List effRow = (List) rowGroup.get(i);
+            for (int j = effRow.size(); j < numberOfColumns; j++) {
+                effRow.add(new EmptyGridUnit(null, null, null, j));
+            }
+        }
+    }
+
+    /**
+     * Updates the current row group to match the given number of columns, by adding empty
+     * grid units if necessary.
+     * 
+     * @param numberOfColumns new number of columns
+     */
+    void ensureNumberOfColumns(int numberOfColumns) {
+        this.numberOfColumns = numberOfColumns;
+        fillWithEmptyGridUnits(rows, numberOfColumns);
+    }
+
+}
diff --git a/test/fotree/unittests/table/TableRowIterator_no-col_no-row_simple.fo b/test/fotree/unittests/table/TableRowIterator_no-col_no-row_simple.fo
new file mode 100644 (file)
index 0000000..0d35a2b
--- /dev/null
@@ -0,0 +1,196 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<!--
+  WARNING: this file was semi-automatically generated from TableRowIterator_simple.fo and
+  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
+  Please modify TableRowIterator_simple.fo instead.
+-->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-body>
+          <fo:table-cell starts-row="true" ends-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell><fo:block>Cell 1.2</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell><fo:block>Cell 1.2</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell><fo:block>Cell 1.2</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell><fo:block>Footer 1.2</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 6</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 11</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_no-col_no-row_spans.fo b/test/fotree/unittests/table/TableRowIterator_no-col_no-row_spans.fo
new file mode 100644 (file)
index 0000000..f20e47e
--- /dev/null
@@ -0,0 +1,122 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<!--
+  WARNING: this file was semi-automatically generated from TableRowIterator_spans.fo and
+  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
+  Please modify TableRowIterator_spans.fo instead.
+-->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-columns-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
+           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Footer 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Footer 7</fo:block></fo:table-cell>
+        </fo:table-footer>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_no-col_simple.fo b/test/fotree/unittests/table/TableRowIterator_no-col_simple.fo
new file mode 100644 (file)
index 0000000..dc1c246
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 6</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 6</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 11</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_no-col_spans.fo b/test/fotree/unittests/table/TableRowIterator_no-col_spans.fo
new file mode 100644 (file)
index 0000000..67d218a
--- /dev/null
@@ -0,0 +1,169 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-columns-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
+           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 7</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 9</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_no-row_simple.fo b/test/fotree/unittests/table/TableRowIterator_no-row_simple.fo
new file mode 100644 (file)
index 0000000..b7ab28e
--- /dev/null
@@ -0,0 +1,201 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<!--
+  WARNING: this file was semi-automatically generated from TableRowIterator_simple.fo and
+  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
+  Please modify TableRowIterator_simple.fo instead.
+-->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+        border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Header 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Header 6</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
+        </fo:table-footer>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+        </fo:table-body>
+        <fo:table-body>
+          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+          <fo:table-cell starts-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+          <fo:table-cell ends-row="true"><fo:block>Cell 11</fo:block></fo:table-cell>
+        </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_no-row_spans.fo b/test/fotree/unittests/table/TableRowIterator_no-row_spans.fo
new file mode 100644 (file)
index 0000000..83597db
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<!--
+  WARNING: this file was semi-automatically generated from TableRowIterator_spans.fo and
+  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
+  Please modify TableRowIterator_spans.fo instead.
+-->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-columns-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
+           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
+        </fo:table-header>
+        <fo:table-footer>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Footer 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Footer 7</fo:block></fo:table-cell>
+        </fo:table-footer>
+       <fo:table-body>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_simple.fo b/test/fotree/unittests/table/TableRowIterator_simple.fo
new file mode 100644 (file)
index 0000000..fb2e8c1
--- /dev/null
@@ -0,0 +1,266 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 6</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
+      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Header 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Header 6</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
+           <fo:table-cell><fo:block>Cell 11</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/test/fotree/unittests/table/TableRowIterator_spans.fo b/test/fotree/unittests/table/TableRowIterator_spans.fo
new file mode 100644 (file)
index 0000000..761d6e2
--- /dev/null
@@ -0,0 +1,175 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
+      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-columns-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 5</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 9</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
+           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
+      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
+       border-collapse="separate" border="1pt solid black">
+        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
+        <fo:table-header>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Header 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Header 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Header 4</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-header>
+        <fo:table-footer>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 3</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 4</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Footer 7</fo:block></fo:table-cell>
+         </fo:table-row>
+        </fo:table-footer>
+       <fo:table-body>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 2</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 8</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 9</fo:block></fo:table-cell>
+         </fo:table-row>
+         <fo:table-row>
+           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
+         </fo:table-row>
+       </fo:table-body>
+      </fo:table>
+
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
index 40f97055a6cc8253fe755dbda79e63be9dab1828..bbac7d8a315a5685cbe88fd9766dd342c67fc7a6 100644 (file)
@@ -19,6 +19,8 @@
 
 package org.apache.fop.fo.flow;
 
+import java.util.Iterator;
+
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fo.FOEventHandler;
 import org.apache.fop.fotreetest.FOTreeUnitTester;
@@ -49,4 +51,8 @@ abstract class AbstractTableTestCase extends FOTreeUnitTester {
     protected TableHandler getTableHandler() {
         return tableHandler;
     }
+
+    protected Iterator getTableIterator() {
+        return tableHandler.getTables().iterator();
+    }
 }
index 2af11c2726c4387153cca7787b9574b5bd53b45e..12d05d503c6a26c7fd4178654a5c2f96ac261735 100644 (file)
@@ -63,7 +63,7 @@ public class TableColumnColumnNumberTestCase extends AbstractTableTestCase {
 
     public void testColumnNumber() throws Exception {
         setUp("table/table-column_column-number.fo");
-        Iterator tableIter = getTableHandler().getTables().iterator();
+        Iterator tableIter = getTableIterator();
         Table t = (Table) tableIter.next();
         assertEquals(2, t.getNumberOfColumns());
         checkColumn(t, 1, false, 1, 2, 100000);
@@ -100,7 +100,7 @@ public class TableColumnColumnNumberTestCase extends AbstractTableTestCase {
     public void testImplicitColumns() throws Exception {
         setUp("table/implicit_columns_column-number.fo");
         percentBaseContext.setUnitaryWidth(100000);
-        Iterator tableIter = getTableHandler().getTables().iterator();
+        Iterator tableIter = getTableIterator();
 
         checkImplicitColumns(tableIter, 2);
         checkImplicitColumns(tableIter, 2);
diff --git a/test/java/org/apache/fop/fo/flow/TableRowIteratorTestCase.java b/test/java/org/apache/fop/fo/flow/TableRowIteratorTestCase.java
new file mode 100644 (file)
index 0000000..6f0bdad
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fo.flow;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Tests that TableRowIterator returns, for each part of a table, the expected number of
+ * row-groups with the expected number or rows in each.
+ */
+public class TableRowIteratorTestCase extends AbstractTableTestCase {
+
+    public TableRowIteratorTestCase() throws Exception {
+        super();
+    }
+
+    /**
+     * Prepares the iterators over the tables contained in the given FO file.
+     * 
+     * @param filename basename of a test FO file
+     * @throws Exception
+     */
+//    private void setUp(String filename) throws Exception {
+//        foReader.parse(new File("test/layoutmgr/table/" + filename).toURL().toExternalForm());
+//        List tables = tableHandler.getTables();
+//        List columnSetups = new LinkedList();
+//        tableIterator = tables.iterator();
+//        for (Iterator i = tables.iterator(); i.hasNext();) {
+//            columnSetups.add(new ColumnSetup((Table) i.next()));
+//        }
+//        columnSetupIterator = columnSetups.iterator();
+//    }
+
+    /**
+     * Checks that the given iterator will return row groups as expected. More precisely,
+     * checks that the number of row groups corresponds to the size of the given array,
+     * and that the number of rows inside each row group is equal to the corresponding
+     * integer in the array.
+     * 
+     * @param tri an iterator over a given part of a table (HEADER, FOOTER, BODY)
+     * @param expectedRowLengths expected lengths of all the row groups of this part of
+     * the table
+     */
+    private void checkTablePartRowGroups(TableBody body, int[] expectedRowLengths) {
+        Iterator rowGroupIter = body.getRowGroups().iterator();
+        for (int i = 0; i < expectedRowLengths.length; i++) {
+            assertTrue(rowGroupIter.hasNext());
+            List rowGroup = (List) rowGroupIter.next();
+            assertEquals(expectedRowLengths[i], rowGroup.size());
+        }
+        assertFalse(rowGroupIter.hasNext());
+    }
+
+    /**
+     * Gets the next table and checks its row-groups.
+     * @param tableIter TODO
+     * @param expectedHeaderRowLengths expected row-group sizes for the header. If null
+     * the table is not expected to have a header
+     * @param expectedFooterRowLengths expected row-group sizes for the footer. If null
+     * the table is not expected to have a footer
+     * @param expectedBodyRowLengths expected row-group sizes for the body(-ies)
+     */
+    private void checkNextTableRowGroups(Iterator tableIter,
+            int[] expectedHeaderRowLengths, int[] expectedFooterRowLengths, int[][] expectedBodyRowLengths) {
+        Table table = (Table) tableIter.next();
+        if (expectedHeaderRowLengths == null) {
+            assertNull(table.getTableHeader());
+        } else {
+            checkTablePartRowGroups(table.getTableHeader(), expectedHeaderRowLengths);
+        }
+        if (expectedFooterRowLengths == null) {
+            assertNull(table.getTableFooter());
+        } else {
+            checkTablePartRowGroups(table.getTableFooter(), expectedFooterRowLengths);
+        }
+        Iterator bodyIter = table.getChildNodes();
+        for (int i = 0; i < expectedBodyRowLengths.length; i++) {
+            assertTrue(bodyIter.hasNext());
+            checkTablePartRowGroups((TableBody) bodyIter.next(), expectedBodyRowLengths[i]);
+        }
+
+//        ColumnSetup columnSetup = (ColumnSetup) columnSetupIterator.next();
+//        TableRowIterator tri;
+//        if (expectedHeaderRowLengths != null) {
+//            tri = new TableRowIterator(table, columnSetup, TableRowIterator.HEADER);
+//            checkTablePartRowGroups(tri, expectedHeaderRowLengths);
+//        }
+//        if (expectedFooterRowLengths != null) {
+//            tri = new TableRowIterator(table, columnSetup, TableRowIterator.FOOTER);
+//            checkTablePartRowGroups(tri, expectedFooterRowLengths);
+//        }
+//        tri = new TableRowIterator(table, columnSetup, TableRowIterator.BODY);
+//        checkTablePartRowGroups(tri, expectedBodyRowLengths);
+    }
+
+    public void checkSimple(String filename) throws Exception {
+        setUp(filename);
+        Iterator tableIter = getTableIterator();
+
+        // Table 1: no header, no footer, one body (1 row)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1}});
+
+        // Table 2: no header, no footer, one body (2 rows)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1, 1}});
+
+        // Table 3: no header, no footer, two bodies (1 row, 1 row)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1}, {1}});
+
+        // Table 4: no header, no footer, two bodies (2 rows, 3 rows)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1, 1}, {1, 1, 1}});
+
+        // Table 5: one header (1 row), no footer, one body (1 row)
+        checkNextTableRowGroups(tableIter, new int[] {1}, null, new int[][] {{1}});
+
+        // Table 6: no header, one footer (1 row), one body (1 row)
+        checkNextTableRowGroups(tableIter, null, new int[] {1}, new int[][] {{1}});
+
+        // Table 7: one header (1 row), one footer (1 row), one body (1 row)
+        checkNextTableRowGroups(tableIter, new int[] {1}, new int[] {1}, new int[][] {{1}});
+
+        // Table 8: one header (2 rows), one footer (3 rows), one body (2 rows)
+        checkNextTableRowGroups(tableIter, new int[] {1, 1}, new int[] {1, 1, 1}, new int[][] {{1, 1}});
+
+        // Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows)
+        checkNextTableRowGroups(tableIter, new int[] {1, 1, 1}, new int[] {1, 1}, new int[][] {{1, 1}, {1}, {1, 1, 1}});
+    }
+
+    public void checkSpans(String filename) throws Exception {
+        setUp(filename);
+        Iterator tableIter = getTableIterator();
+
+        // Table 1: no header, no footer, one body (1 row with column-span)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1}});
+
+        // Table 2: no header, no footer, one body (1 row-group of 2 rows)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{2}});
+
+        // Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) 
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{2, 1}});
+
+        // Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows)
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1, 2}});
+
+        // Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) 
+        checkNextTableRowGroups(tableIter, null, null, new int[][] {{1, 3, 1}});
+
+        // Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
+        // one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) 
+        checkNextTableRowGroups(tableIter, new int[] {2}, new int[] {1, 3}, new int[][] {{2, 1, 3}});
+    }
+
+    public void testWithRowsSimple() throws Exception {
+        checkSimple("table/TableRowIterator_simple.fo");
+    }
+
+    public void testWithRowsSpans() throws Exception {
+        checkSpans("table/TableRowIterator_spans.fo");
+    }
+
+    public void testNoRowSimple() throws Exception {
+        checkSimple("table/TableRowIterator_no-row_simple.fo");
+    }
+
+    public void testNoRowSpans() throws Exception {
+        checkSpans("table/TableRowIterator_no-row_spans.fo");
+    }
+
+    public void testNoColWithRowsSimple() throws Exception {
+        checkSimple("table/TableRowIterator_no-col_simple.fo");
+    }
+
+    public void testNoColWithRowsSpans() throws Exception {
+        checkSpans("table/TableRowIterator_no-col_spans.fo");
+    }
+
+    public void testNoColNoRowSimple() throws Exception {
+        checkSimple("table/TableRowIterator_no-col_no-row_simple.fo");
+    }
+
+    public void testNoColNoRowSpans() throws Exception {
+        checkSpans("table/TableRowIterator_no-col_no-row_spans.fo");
+    }
+}
diff --git a/test/java/org/apache/fop/layoutmgr/table/TableRowIteratorTestCase.java b/test/java/org/apache/fop/layoutmgr/table/TableRowIteratorTestCase.java
deleted file mode 100644 (file)
index b695914..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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.
- */
-
-/* $Id$ */
-
-package org.apache.fop.layoutmgr.table;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import junit.framework.TestCase;
-
-import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.apps.Fop;
-import org.apache.fop.apps.FopFactory;
-import org.apache.fop.fo.flow.Table;
-import org.xml.sax.XMLReader;
-
-/**
- * Tests that TableRowIterator returns, for each part of a table, the expected number of
- * row-groups with the expected number or rows in each.
- */
-public class TableRowIteratorTestCase extends TestCase {
-
-    private XMLReader foReader;
-
-    private TableHandler tableHandler;
-
-    /** Returns Table instances. */
-    private Iterator tableIterator;
-
-    /** Returns ColumnSetup instances. */
-    private Iterator columnSetupIterator;
-
-    /**
-     * Creates the SAX parser for the FO file and a FO user agent with an overriden
-     * FOEventHandler and sets them up.
-     */
-    public void setUp() throws Exception {
-        SAXParserFactory spf = SAXParserFactory.newInstance();
-        spf.setNamespaceAware(true);
-        spf.setValidating(false);
-        SAXParser parser;
-        parser = spf.newSAXParser();
-        foReader = parser.getXMLReader();
-
-        FopFactory fopFactory = FopFactory.newInstance(); 
-        FOUserAgent ua = fopFactory.newFOUserAgent();
-        tableHandler = new TableHandler(ua);
-        ua.setFOEventHandlerOverride(tableHandler);
-
-        Fop fop = fopFactory.newFop(ua);
-
-        foReader.setContentHandler(fop.getDefaultHandler());
-        foReader.setDTDHandler(fop.getDefaultHandler());
-        foReader.setErrorHandler(fop.getDefaultHandler());
-        foReader.setEntityResolver(fop.getDefaultHandler());
-    }
-
-    /**
-     * Prepares the iterators over the tables contained in the given FO file.
-     * 
-     * @param filename basename of a test FO file
-     * @throws Exception
-     */
-    private void setUp(String filename) throws Exception {
-        foReader.parse(new File("test/layoutmgr/table/" + filename).toURL().toExternalForm());
-        List tables = tableHandler.getTables();
-        List columnSetups = new LinkedList();
-        tableIterator = tables.iterator();
-        for (Iterator i = tables.iterator(); i.hasNext();) {
-            columnSetups.add(new ColumnSetup((Table) i.next()));
-        }
-        columnSetupIterator = columnSetups.iterator();
-    }
-
-    /**
-     * Checks that the given iterator will return row groups as expected. More precisely,
-     * checks that the number of row groups corresponds to the size of the given array,
-     * and that the number of rows inside each row group is equal to the corresponding
-     * integer in the array.
-     * 
-     * @param tri an iterator over a given part of a table (HEADER, FOOTER, BODY)
-     * @param expectedRowLengths expected lengths of all the row groups of this part of
-     * the table
-     */
-    private void checkTablePartRowGroups(TableRowIterator tri, int[] expectedRowLengths) {
-        for (int i = 0; i < expectedRowLengths.length; i++) {
-            EffRow[] row = tri.getNextRowGroup();
-            assertTrue(row.length == expectedRowLengths[i]);
-        }
-        assertNull(tri.getNextRowGroup());        
-    }
-
-    /**
-     * Gets the next table and checks its row-groups.
-     * 
-     * @param expectedHeaderRowLengths expected row-group sizes for the header. If null
-     * the table is not expected to have a header
-     * @param expectedFooterRowLengths expected row-group sizes for the footer. If null
-     * the table is not expected to have a footer
-     * @param expectedBodyRowLengths expected row-group sizes for the body(-ies)
-     */
-    private void checkNextTableRowGroups(int[] expectedHeaderRowLengths,
-            int[] expectedFooterRowLengths, int[] expectedBodyRowLengths) {
-        Table table = (Table) tableIterator.next();
-        ColumnSetup columnSetup = (ColumnSetup) columnSetupIterator.next();
-        TableRowIterator tri;
-        if (expectedHeaderRowLengths != null) {
-            tri = new TableRowIterator(table, columnSetup, TableRowIterator.HEADER);
-            checkTablePartRowGroups(tri, expectedHeaderRowLengths);
-        }
-        if (expectedFooterRowLengths != null) {
-            tri = new TableRowIterator(table, columnSetup, TableRowIterator.FOOTER);
-            checkTablePartRowGroups(tri, expectedFooterRowLengths);
-        }
-        tri = new TableRowIterator(table, columnSetup, TableRowIterator.BODY);
-        checkTablePartRowGroups(tri, expectedBodyRowLengths);
-    }
-
-    public void checkSimple(String filename) throws Exception {
-        setUp(filename);
-
-        // Table 1: no header, no footer, one body (1 row)
-        checkNextTableRowGroups(null, null, new int[] {1});
-
-        // Table 2: no header, no footer, one body (2 rows)
-        checkNextTableRowGroups(null, null, new int[] {1, 1});
-
-        // Table 3: no header, no footer, two bodies (1 row, 1 row)
-        checkNextTableRowGroups(null, null, new int[] {1, 1});
-
-        // Table 4: no header, no footer, two bodies (2 rows, 3 rows)
-        checkNextTableRowGroups(null, null, new int[] {1, 1, 1, 1, 1});
-
-        // Table 5: one header (1 row), no footer, one body (1 row)
-        checkNextTableRowGroups(new int[] {1}, null, new int[] {1});
-
-        // Table 6: no header, one footer (1 row), one body (1 row)
-        checkNextTableRowGroups(null, new int[] {1}, new int[] {1});
-
-        // Table 7: one header (1 row), one footer (1 row), one body (1 row)
-        checkNextTableRowGroups(new int[] {1}, new int[] {1}, new int[] {1});
-
-        // Table 8: one header (2 rows), one footer (3 rows), one body (2 rows)
-        checkNextTableRowGroups(new int[] {1, 1}, new int[] {1, 1, 1}, new int[] {1, 1});
-
-        // Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows)
-        checkNextTableRowGroups(new int[] {1, 1, 1}, new int[] {1, 1}, new int[] {1, 1, 1, 1, 1, 1});
-    }
-
-    public void checkSpans(String filename) throws Exception {
-        setUp(filename);
-
-        // Table 1: no header, no footer, one body (1 row with column-span)
-        checkNextTableRowGroups(null, null, new int[] {1});
-
-        // Table 2: no header, no footer, one body (1 row-group of 2 rows)
-        checkNextTableRowGroups(null, null, new int[] {2});
-
-        // Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) 
-        checkNextTableRowGroups(null, null, new int[] {2, 1});
-
-        // Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows)
-        checkNextTableRowGroups(null, null, new int[] {1, 2});
-
-        // Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) 
-        checkNextTableRowGroups(null, null, new int[] {1, 3, 1});
-
-        // Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
-        // one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) 
-        checkNextTableRowGroups(new int[] {2}, new int[] {1, 3}, new int[] {2, 1, 3});
-    }
-
-    public void testWithRowsSimple() throws Exception {
-        checkSimple("TableRowIterator_simple.fo");
-    }
-
-    public void testWithRowsSpans() throws Exception {
-        checkSpans("TableRowIterator_spans.fo");
-    }
-
-    public void testNoRowSimple() throws Exception {
-        checkSimple("TableRowIterator_no-row_simple.fo");
-    }
-
-    public void testNoRowSpans() throws Exception {
-        checkSpans("TableRowIterator_no-row_spans.fo");
-    }
-}
\ No newline at end of file
diff --git a/test/layoutmgr/table/TableRowIterator_no-row_simple.fo b/test/layoutmgr/table/TableRowIterator_no-row_simple.fo
deleted file mode 100644 (file)
index b7ab28e..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!--
-  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.
--->
-<!-- $Id$ -->
-<!--
-  WARNING: this file was semi-automatically generated from TableRowIterator_simple.fo and
-  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
-  Please modify TableRowIterator_simple.fo instead.
--->
-<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-  <fo:layout-master-set>
-    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
-      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
-      <fo:region-body/>
-    </fo:simple-page-master>
-  </fo:layout-master-set>
-  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
-    <fo:flow flow-name="xsl-region-body">
-      <!-- Table 1: no header, no footer, one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 2: no header, no footer, one body (2 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-        </fo:table-body>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-        </fo:table-body>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
-        </fo:table-header>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-footer>
-          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
-        </fo:table-footer>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
-        </fo:table-header>
-        <fo:table-footer>
-          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
-        </fo:table-footer>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
-        </fo:table-header>
-        <fo:table-footer>
-          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
-        </fo:table-footer>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-        border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-          <fo:table-cell starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Header 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Header 5</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Header 6</fo:block></fo:table-cell>
-        </fo:table-header>
-        <fo:table-footer>
-          <fo:table-cell starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Footer 5</fo:block></fo:table-cell>
-        </fo:table-footer>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-        </fo:table-body>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
-        </fo:table-body>
-        <fo:table-body>
-          <fo:table-cell starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
-          <fo:table-cell starts-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
-          <fo:table-cell ends-row="true"><fo:block>Cell 11</fo:block></fo:table-cell>
-        </fo:table-body>
-      </fo:table>
-
-    </fo:flow>
-  </fo:page-sequence>
-</fo:root>
diff --git a/test/layoutmgr/table/TableRowIterator_no-row_spans.fo b/test/layoutmgr/table/TableRowIterator_no-row_spans.fo
deleted file mode 100644 (file)
index 83597db..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!--
-  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.
--->
-<!-- $Id$ -->
-<!--
-  WARNING: this file was semi-automatically generated from TableRowIterator_spans.fo and
-  contains the very same tables using starts-row/ends-row instead of fo:table-row objects.
-  Please modify TableRowIterator_spans.fo instead.
--->
-<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-  <fo:layout-master-set>
-    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
-      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
-      <fo:region-body/>
-    </fo:simple-page-master>
-  </fo:layout-master-set>
-  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
-    <fo:flow flow-name="xsl-region-body">
-      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" number-columns-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 4</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
-           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Header 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Header 4</fo:block></fo:table-cell>
-        </fo:table-header>
-        <fo:table-footer>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true"><fo:block>Footer 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Footer 4</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Footer 6</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Footer 7</fo:block></fo:table-cell>
-        </fo:table-footer>
-       <fo:table-body>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 2</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" ends-row="true"><fo:block>Cell 6</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true"><fo:block>Cell 7</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" ends-row="true"><fo:block>Cell 8</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2" starts-row="true" ends-row="true"><fo:block>Cell 9</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" starts-row="true" ends-row="true"><fo:block>Cell 10</fo:block></fo:table-cell>
-       </fo:table-body>
-      </fo:table>
-
-    </fo:flow>
-  </fo:page-sequence>
-</fo:root>
diff --git a/test/layoutmgr/table/TableRowIterator_simple.fo b/test/layoutmgr/table/TableRowIterator_simple.fo
deleted file mode 100644 (file)
index fb2e8c1..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!--
-  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.
--->
-<!-- $Id$ -->
-<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-  <fo:layout-master-set>
-    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
-      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
-      <fo:region-body/>
-    </fo:simple-page-master>
-  </fo:layout-master-set>
-  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
-    <fo:flow flow-name="xsl-region-body">
-      <!-- Table 1: no header, no footer, one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 2: no header, no footer, one body (2 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 3: no header, no footer, two bodies (1 row, 1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 4: no header, no footer, two bodies (2 rows, 3 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 5: one header (1 row), no footer, one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-header>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 6: no header, one footer (1 row), one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-footer>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-footer>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 7: one header (1 row), one footer (1 row), one body (1 row) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-header>
-        <fo:table-footer>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-footer>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 8: one header (2 rows), one footer (3 rows), one body (2 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-header>
-        <fo:table-footer>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 6</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-footer>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 9: one header (3 rows), one footer (2 rows), three bodies (2 rows, 1 row, 3 rows) -->
-      <fo:table width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 4</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Header 5</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Header 6</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-header>
-        <fo:table-footer>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Footer 4</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Footer 5</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-footer>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 6</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 7</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 8</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 9</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell><fo:block>Cell 10</fo:block></fo:table-cell>
-           <fo:table-cell><fo:block>Cell 11</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-    </fo:flow>
-  </fo:page-sequence>
-</fo:root>
diff --git a/test/layoutmgr/table/TableRowIterator_spans.fo b/test/layoutmgr/table/TableRowIterator_spans.fo
deleted file mode 100644 (file)
index 761d6e2..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!--
-  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.
--->
-<!-- $Id$ -->
-<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
-  <fo:layout-master-set>
-    <fo:simple-page-master master-name="page" page-height="20cm" page-width="15cm"
-      margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
-      <fo:region-body/>
-    </fo:simple-page-master>
-  </fo:layout-master-set>
-  <fo:page-sequence master-reference="page" font-family="serif" font-size="14pt">
-    <fo:flow flow-name="xsl-region-body">
-      <!-- Table 1: no header, no footer, one body (1 row with column-span) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-columns-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 2: no header, no footer, one body (1 row-group of 2 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 3: no header, no footer, one body (1 row-group of 2 rows, 1 row) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 4: no header, no footer, one body (1 row, 1 row-group of 2 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 5: no header, no footer, one body (1 row, 1 row-group of 3 rows, 1 row) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 4</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 5</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 8</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 9</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-      <!-- Table 6: one header (1 row-group of 2 rows), one footer (1 row, 1 row-group of 3 rows),
-           one body (1 row-group of 2 rows, 1 row, 1 row-group of 3 rows) -->
-      <fo:table border-separation="2pt" width="10cm" space-before="12pt" table-layout="fixed"
-       border-collapse="separate" border="1pt solid black">
-        <fo:table-column number-columns-repeated="2" column-width="proportional-column-width(1)"/>
-        <fo:table-header>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Header 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Header 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Header 4</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-header>
-        <fo:table-footer>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Footer 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Footer 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 3</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Footer 4</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Footer 6</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Footer 7</fo:block></fo:table-cell>
-         </fo:table-row>
-        </fo:table-footer>
-       <fo:table-body>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 1</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 2</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 3</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 5</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 6</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 7</fo:block></fo:table-cell>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 8</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid" number-rows-spanned="2"><fo:block>Cell 9</fo:block></fo:table-cell>
-         </fo:table-row>
-         <fo:table-row>
-           <fo:table-cell border="1pt solid"><fo:block>Cell 10</fo:block></fo:table-cell>
-         </fo:table-row>
-       </fo:table-body>
-      </fo:table>
-
-    </fo:flow>
-  </fo:page-sequence>
-</fo:root>