Author: phancock
Date: Fri Mar  2 09:50:50 2012
New Revision: 1296104

URL: http://svn.apache.org/viewvc?rev=1296104&view=rev
Log:
Bugzilla#50391: Adding support for different flow-name of fo:region-body in FOP

Unit tests and a bugfix related to a repeatable sub-sequence specifier combo

Added:
    
xmlgraphics/fop/trunk/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
    
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/simple-page-master_unmapped_flow-name.xml
Modified:
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/StandardTestSuite.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/AllTests.java
    xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/AllTests.java
    
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/PageSequenceMasterTestCase.java
    
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternativesTestCase.java
    
xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
 Fri Mar  2 09:50:50 2012
@@ -218,7 +218,7 @@ public class PageSequenceMaster extends 
             if (nextSubSequence == null) {
                 //Sub-sequence exhausted so attempt to reuse it
                 blockLevelEventProducer.pageSequenceMasterExhausted(this,
-                        masterName, canRecover, getLocator());
+                        masterName, canRecover & 
currentSubSequence.isReusable(), getLocator());
                 currentSubSequence.reset();
                 if (!currentSubSequence.canProcess(mainFlowName)) {
                     throw new PageProductionException(

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
 Fri Mar  2 09:50:50 2012
@@ -233,6 +233,9 @@ public class RepeatablePageMasterAlterna
         return getMaximumRepeats() == INFINITE;
     }
 
-
+    /** {@inheritDoc} */
+    public boolean isReusable() {
+        return false;
+    }
 
 }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
 Fri Mar  2 09:50:50 2012
@@ -181,6 +181,9 @@ public class RepeatablePageMasterReferen
         return getMaximumRepeats() == INFINITE;
     }
 
-
+    /** {@inheritDoc} */
+    public boolean isReusable() {
+        return false;
+    }
 
 }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
 Fri Mar  2 09:50:50 2012
@@ -159,5 +159,10 @@ public class SinglePageMasterReference e
         return false;
     }
 
+    /** {@inheritDoc} */
+    public boolean isReusable() {
+        return true;
+    }
+
 }
 

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
 Fri Mar  2 09:50:50 2012
@@ -82,5 +82,12 @@ public interface SubSequenceSpecifier {
      */
     boolean isInfinite();
 
+    /**
+     * Test if this can be reused when it is the last sub-sequence specifer,
+     * and has been exhausted
+     * @return true if and only if it can be reused
+     */
+    boolean isReusable();
+
 }
 

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageProvider.java 
Fri Mar  2 09:50:50 2012
@@ -330,7 +330,6 @@ public class PageProvider implements Con
         boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
                 index, isFirstPage, isLastPage, isBlank);
-
         Page page = new Page(spm, index, pageNumberString, isBlank, spanAll);
         //Set unique key obtained from the AreaTreeHandler
         
page.getPageViewport().setKey(areaTreeHandler.generatePageViewportKey());

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java
 Fri Mar  2 09:50:50 2012
@@ -148,12 +148,18 @@ public class PageSequenceLayoutManager e
 
     @Override
     protected Page makeNewPage(boolean isBlank) {
-        Page newPage;
+        Page newPage = super.makeNewPage(isBlank);
 
-        do {
-            newPage = super.makeNewPage(isBlank);
-        } while (!getPageSequence().getMainFlow().getFlowName()
-                
.equals(newPage.getSimplePageMaster().getRegion(FO_REGION_BODY).getRegionName()));
+        // Empty pages (pages that have been generated from a SPM that has an 
un-mapped flow name)
+        // cannot layout areas from the main flow.  Blank pages can be created 
from empty pages.
+
+        if (!isBlank) {
+            while (!getPageSequence().getMainFlow().getFlowName()
+                    .equals(newPage.getSimplePageMaster()
+                            .getRegion(FO_REGION_BODY).getRegionName())) {
+                newPage = super.makeNewPage(isBlank);
+            }
+        }
 
         return newPage;
     }

Modified: xmlgraphics/fop/trunk/test/java/org/apache/fop/StandardTestSuite.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/StandardTestSuite.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/StandardTestSuite.java 
(original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/StandardTestSuite.java Fri 
Mar  2 09:50:50 2012
@@ -36,6 +36,7 @@ import org.apache.fop.image.loader.batik
 import org.apache.fop.intermediate.IFMimickingTestCase;
 import org.apache.fop.render.extensions.prepress.PageBoundariesTestCase;
 import org.apache.fop.render.extensions.prepress.PageScaleTestCase;
+import org.apache.fop.layoutmgr.PageSequenceLayoutManagerTestCase;
 import org.apache.fop.render.pdf.PDFAConformanceTestCase;
 import org.apache.fop.render.pdf.PDFCMapTestCase;
 import org.apache.fop.render.pdf.PDFEncodingTestCase;
@@ -62,6 +63,7 @@ import org.apache.fop.pdf.PDFLibraryTest
         ImageLoaderTestCase.class,
         ImagePreloaderTestCase.class,
         IFMimickingTestCase.class,
+        PageSequenceLayoutManagerTestCase.class,
         PageBoundariesTestCase.class,
         PageScaleTestCase.class,
         org.apache.fop.afp.AFPTestSuite.class,

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/AllTests.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/AllTests.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/AllTests.java 
(original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/flow/table/AllTests.java 
Fri Mar  2 09:50:50 2012
@@ -21,14 +21,13 @@ package org.apache.fop.fo.flow.table;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
-import org.junit.runners.Suite.SuiteClasses;
 
 /**
  * All test to be added in FOTreeTestSuite
  *
  */
 @RunWith(Suite.class)
-@SuiteClasses({
[email protected]({
         CollapsedConditionalBorderTestCase.class,
         IllegalRowSpanTestCase.class,
         RowGroupBuilderTestCase.class,

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/AllTests.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/AllTests.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/AllTests.java 
(original)
+++ xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/AllTests.java 
Fri Mar  2 09:50:50 2012
@@ -29,7 +29,5 @@ import org.junit.runner.RunWith;
 @RunWith(Suite.class)
 @Suite.SuiteClasses({ PageSequenceMasterTestCase.class,
         RepeatablePageMasterAlternativesTestCase.class})
-
 public final class AllTests {
-
 }

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/PageSequenceMasterTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/PageSequenceMasterTestCase.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/PageSequenceMasterTestCase.java
 (original)
+++ 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/PageSequenceMasterTestCase.java
 Fri Mar  2 09:50:50 2012
@@ -23,14 +23,18 @@ import static org.junit.Assert.fail;
 
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.layoutmgr.BlockLevelEventProducer;
-
 import org.junit.Test;
+import org.xml.sax.Locator;
 
 
 /**
@@ -39,57 +43,119 @@ import org.junit.Test;
  */
 public class PageSequenceMasterTestCase {
 
-   /**
-    * Test that PageProductionException is thrown if the final 
simple-page-master
-    * cannot handle the main-flow of the page sequence
-    * @throws Exception exception
-    */
-   @Test
-    public void testGetNextSimplePageMasterException() throws Exception {
-
-        final String mainFlowRegionName = "main";
-        final String emptyFlowRegionName = "empty";
-        //  Create stubs
-
-        FONode mockParent = mock(FONode.class);
-        Root mockRoot = mock(Root.class);
-        LayoutMasterSet mockLayoutMasterSet = mock(LayoutMasterSet.class);
-
-        //  This will represent a page master that does not map to the main 
flow
-        //  of the page sequence
-        SimplePageMaster mockEmptySPM = mock(SimplePageMaster.class);
-        Region mockRegion = mock(Region.class);
-        SinglePageMasterReference mockSinglePageMasterReference
-                = mock(SinglePageMasterReference.class);
-        BlockLevelEventProducer mockBlockLevelEventProducer = 
mock(BlockLevelEventProducer.class);
-
-        //Stub behaviour
-        when(mockParent.getRoot()).thenReturn(mockRoot);
-        when(mockRoot.getLayoutMasterSet()).thenReturn(mockLayoutMasterSet);
-
-        //The layout master set should return the empty page master
-        
when(mockLayoutMasterSet.getSimplePageMaster(anyString())).thenReturn(mockEmptySPM);
-        when(mockEmptySPM.getRegion(anyInt())).thenReturn(mockRegion);
-
-        when(mockRegion.getRegionName()).thenReturn(emptyFlowRegionName);
-
-        when(mockSinglePageMasterReference.getNextPageMaster(anyBoolean(), 
anyBoolean(),
-                anyBoolean(), anyBoolean()))
-                .thenReturn(null, mockEmptySPM);
-
-        PageSequenceMaster pageSequenceMaster = new 
PageSequenceMaster(mockParent,
-                mockBlockLevelEventProducer);
-        pageSequenceMaster.startOfNode();
-        
pageSequenceMaster.addSubsequenceSpecifier(mockSinglePageMasterReference);
-
-        try {
-            pageSequenceMaster.getNextSimplePageMaster(false, false, false, 
false,
-                    mainFlowRegionName);
-            fail("The next simple page master does not refer to the main 
flow");
-       } catch (PageProductionException ppe) {
-           //Passed test
-       }
-    }
+    /**
+     * Test that block level events are produced in line with
+     *  XSL:FO - 6.4.8 fo:page-sequence-master -
+     * "It is an error if the entire sequence of sub-sequence-specifiers 
children is exhausted
+     *  while some areas returned by an fo:flow are not placed. 
Implementations may recover,
+     *  if possible, by re-using the sub-sequence-specifier that was last used 
to generate a page."
+     *
+     * @throws Exception exception
+     */
+    @Test
+     public void testGetNextSimplePageMasterExhausted() throws Exception {
+
+         //Test when the last sub-sequence specifier is not repeatable
+        testGetNextSimplePageMasterExhausted(true);
+
+         //Test when the last sub-sequence specifier is repeatable
+        testGetNextSimplePageMasterExhausted(false);
+
+     }
+
+     private void testGetNextSimplePageMasterExhausted(boolean canResume) 
throws Exception {
+
+         SimplePageMaster spm = mock(SimplePageMaster.class);
+         SubSequenceSpecifier mockSinglePageMasterReference
+                 = mock(SubSequenceSpecifier.class);
+         BlockLevelEventProducer mockBlockLevelEventProducer = 
mock(BlockLevelEventProducer.class);
+
+         // subject under test
+         PageSequenceMaster pageSequenceMaster = createPageSequenceMaster(
+                 mockBlockLevelEventProducer);
+         
pageSequenceMaster.addSubsequenceSpecifier(mockSinglePageMasterReference);
+
+         //Setup to mock the exhaustion of the last sub-sequence specifier
+         when(mockSinglePageMasterReference.getNextPageMaster(anyBoolean(), 
anyBoolean(),
+                 anyBoolean(), anyBoolean())).thenReturn(null, spm);
+
+         //Need this for the method to return normally
+         
when(mockSinglePageMasterReference.canProcess(anyString())).thenReturn(true);
+
+         
when(mockSinglePageMasterReference.isReusable()).thenReturn(canResume);
+
+         pageSequenceMaster.getNextSimplePageMaster(false, false, false, 
false, null);
+
+         
verify(mockBlockLevelEventProducer).pageSequenceMasterExhausted((Locator)anyObject(),
+                 anyString(), eq(canResume), (Locator)anyObject());
+     }
+
+     /**
+      * Test that PageProductionException is thrown if the final 
simple-page-master
+      * cannot handle the main-flow of the page sequence
+      * @throws Exception exception
+      */
+    @Test
+      public void testGetNextSimplePageMasterException() throws Exception {
+
+          final String mainFlowRegionName = "main";
+          final String emptyFlowRegionName = "empty";
+
+          //  This will represent a page master that does not map to the main 
flow
+          //  of the page sequence
+          SimplePageMaster mockEmptySPM = mock(SimplePageMaster.class);
+          Region mockRegion = mock(Region.class);
+          SinglePageMasterReference mockSinglePageMasterReference
+                  = mock(SinglePageMasterReference.class);
+          BlockLevelEventProducer mockBlockLevelEventProducer = 
mock(BlockLevelEventProducer.class);
+
+          LayoutMasterSet mockLayoutMasterSet = mock(LayoutMasterSet.class);
+          //The layout master set should return the empty page master
+          
when(mockLayoutMasterSet.getSimplePageMaster(anyString())).thenReturn(mockEmptySPM);
+          when(mockEmptySPM.getRegion(anyInt())).thenReturn(mockRegion);
+
+          when(mockRegion.getRegionName()).thenReturn(emptyFlowRegionName);
+
+          when(mockSinglePageMasterReference.getNextPageMaster(anyBoolean(), 
anyBoolean(),
+                  anyBoolean(), anyBoolean()))
+                  .thenReturn(null, mockEmptySPM);
+
+          PageSequenceMaster pageSequenceMaster = 
createPageSequenceMaster(mockLayoutMasterSet,
+                  mockBlockLevelEventProducer);
+
+          pageSequenceMaster.startOfNode();
+          
pageSequenceMaster.addSubsequenceSpecifier(mockSinglePageMasterReference);
+
+          try {
+              pageSequenceMaster.getNextSimplePageMaster(false, false, false, 
false,
+                      mainFlowRegionName);
+              fail("The next simple page master does not refer to the main 
flow");
+         } catch (PageProductionException ppe) {
+             //Passed test
+         }
+      }
+
+
+     private PageSequenceMaster createPageSequenceMaster(
+             BlockLevelEventProducer blockLevelEventProducer) throws 
FOPException {
+
+         return createPageSequenceMaster(mock(LayoutMasterSet.class), 
blockLevelEventProducer);
+     }
+
+     private PageSequenceMaster createPageSequenceMaster(LayoutMasterSet 
layoutMasterSet,
+             BlockLevelEventProducer blockLevelEventProducer) throws 
FOPException {
+         FONode mockParent = mock(FONode.class);
+         Root mockRoot = mock(Root.class);
+
+         //Stub generic components
+         when(mockParent.getRoot()).thenReturn(mockRoot);
+         when(mockRoot.getLayoutMasterSet()).thenReturn(layoutMasterSet);
+
+         PageSequenceMaster psm =  new PageSequenceMaster(mockParent, 
blockLevelEventProducer);
+         psm.startOfNode();
+
+         return psm;
+     }
 
 }
 

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternativesTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternativesTestCase.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternativesTestCase.java
 (original)
+++ 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternativesTestCase.java
 Fri Mar  2 09:50:50 2012
@@ -25,21 +25,18 @@ import static org.mockito.Matchers.anyIn
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import org.junit.Test;
-
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.expr.NumericProperty;
 import org.apache.fop.fo.properties.Property;
 
-
+import org.junit.Test;
 
 /**
  * Unit Test for RepeatablePageMasterAlternatives
  *
  */
-public class RepeatablePageMasterAlternativesTestCase
-implements Constants {
+public class RepeatablePageMasterAlternativesTestCase implements Constants {
 
     /**
      *

Modified: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java?rev=1296104&r1=1296103&r2=1296104&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java 
(original)
+++ 
xmlgraphics/fop/trunk/test/java/org/apache/fop/fotreetest/FOTreeTestSuite.java 
Fri Mar  2 09:50:50 2012
@@ -34,4 +34,5 @@ import org.junit.runners.Suite;
         org.apache.fop.fo.DelegatingFOEventHandlerTestCase.class
 })
 public final class FOTreeTestSuite {
+
 }

Added: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java?rev=1296104&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
 (added)
+++ 
xmlgraphics/fop/trunk/test/java/org/apache/fop/layoutmgr/PageSequenceLayoutManagerTestCase.java
 Fri Mar  2 09:50:50 2012
@@ -0,0 +1,118 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.fop.area.AreaTreeHandler;
+import org.apache.fop.area.PageViewport;
+import org.apache.fop.fo.pagination.Flow;
+import org.apache.fop.fo.pagination.PageSequence;
+import org.apache.fop.fo.pagination.Region;
+import org.apache.fop.fo.pagination.Root;
+import org.apache.fop.fo.pagination.SimplePageMaster;
+import org.junit.Test;
+
+public class PageSequenceLayoutManagerTestCase {
+
+    private static final String MAIN_FLOW_NAME = "main";
+    private static final String EMPTY_FLOW_NAME = "empty";
+
+    /**
+     * Blank pages can be created from empty pages
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testGetNextPageBlank() throws Exception {
+
+        final Page expectedPage = createPageForRegionName(EMPTY_FLOW_NAME);
+        final Page[] providedPages = new Page[]{expectedPage};
+
+        testGetNextPage(providedPages, expectedPage, true);
+    }
+
+    /**
+     * Empty pages should not be provided by the PageSequenceLayoutManager
+     * to layout the main flow
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testGetNextPageFirstEmpty() throws Exception {
+
+        final Page emptyPage = createPageForRegionName(EMPTY_FLOW_NAME);
+        final Page expectedPage = createPageForRegionName(MAIN_FLOW_NAME);
+        final Page[] providedPages = new Page[]{emptyPage, expectedPage};
+
+        testGetNextPage(providedPages, expectedPage, false);
+    }
+
+    private void testGetNextPage(final Page[] providedPages, Page 
expectedPage, boolean isBlank) {
+
+        final Flow flow = mock(Flow.class);
+        final PageSequence pseq = mock(PageSequence.class);
+        final Root root = mock(Root.class);
+        final AreaTreeHandler ath = mock(AreaTreeHandler.class);
+
+        when(flow.getFlowName()).thenReturn(MAIN_FLOW_NAME);
+        when(pseq.getMainFlow()).thenReturn(flow);
+        when(pseq.getRoot()).thenReturn(root);
+
+        PageSequenceLayoutManager sut = new PageSequenceLayoutManager(ath, 
pseq) {
+
+            @Override
+            protected Page createPage(int i, boolean b) {
+                return providedPages[i - 1];
+            }
+
+            @Override
+            protected void finishPage() {
+                //nop
+            }
+
+            // Expose the protected method for testing
+            public Page makeNewPage(boolean isBlank) {
+                return super.makeNewPage(isBlank);
+            }
+        };
+
+        assertEquals(expectedPage, sut.makeNewPage(isBlank));
+    }
+
+
+    private static Page createPageForRegionName(final String regionName) {
+        final Page page = mock(Page.class);
+        final SimplePageMaster spm = mock(SimplePageMaster.class);
+        final PageViewport pageViewport = mock(PageViewport.class);
+        final Region region = mock(Region.class);
+
+        when(page.getSimplePageMaster()).thenReturn(spm);
+        when(page.getPageViewport()).thenReturn(pageViewport);
+        when(spm.getRegion(anyInt())).thenReturn(region);
+
+        when(region.getRegionName()).thenReturn(regionName);
+
+        return page;
+    }
+}

Added: 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/simple-page-master_unmapped_flow-name.xml
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/simple-page-master_unmapped_flow-name.xml?rev=1296104&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/simple-page-master_unmapped_flow-name.xml
 (added)
+++ 
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/simple-page-master_unmapped_flow-name.xml
 Fri Mar  2 09:50:50 2012
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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$ -->
+<testcase>
+  <info>
+    <p>
+      This test checks that when the region-body@region-name of 
simple-page-master does not map to
+      the main flow, the PageSequenceLayoutManager treats the generated Page 
as an empty/blank page.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="main" page-width="2in" 
page-height="2in">
+          <fo:region-body region-name="main" margin-top="1in"/>
+          <fo:region-before region-name="main-before"/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="empty" page-width="2in" 
page-height="2in">
+          <fo:region-body region-name="empty"/>
+          <fo:region-before region-name="empty-before" />
+        </fo:simple-page-master>
+        <fo:page-sequence-master master-name="psm">
+          <fo:repeatable-page-master-reference maximum-repeats="1" 
master-reference="main"/>
+          <fo:repeatable-page-master-reference maximum-repeats="1" 
master-reference="empty"/>
+          <fo:repeatable-page-master-reference master-reference="main"/>
+        </fo:page-sequence-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="psm">
+
+        <fo:static-content flow-name="main-before">
+          <fo:block background-color="#afa">main <fo:page-number/></fo:block>
+        </fo:static-content>
+
+        <fo:static-content flow-name="empty-before">
+          <fo:block background-color="#faa">empty <fo:page-number/></fo:block>
+        </fo:static-content>
+
+        <fo:flow flow-name="main">
+          <fo:block break-before="page">flow 1</fo:block>
+          <fo:block break-before="page">flow 2</fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="main-before" 
xpath="//pageViewport[1]//regionBefore/@name"/>
+    <eval expected="empty-before" 
xpath="//pageViewport[2]//regionBefore/@name"/>
+    <eval expected="main-before" 
xpath="//pageViewport[3]//regionBefore/@name"/>
+  </checks>
+</testcase>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to