blob: f4ebc010c40dd92f90b0a458f94313bbe2fe152d [file] [log] [blame]
/*
* 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 org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.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.RegionBody;
import org.apache.fop.fo.pagination.Root;
import org.apache.fop.fo.pagination.SimplePageMaster;
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(RegionBody.class);
when(page.getSimplePageMaster()).thenReturn(spm);
when(page.getPageViewport()).thenReturn(pageViewport);
when(spm.getRegion(anyInt())).thenReturn(region);
when(region.getRegionName()).thenReturn(regionName);
return page;
}
@Test
public void testRegionNameNotFound() {
final PageSequence pseq = mock(PageSequence.class);
final AreaTreeHandler ath = mock(AreaTreeHandler.class);
final Flow flow = mock(Flow.class);
final Root root = mock(Root.class);
when(flow.getFlowName()).thenReturn(MAIN_FLOW_NAME);
when(pseq.getRoot()).thenReturn(root);
when(pseq.hasPagePositionLast()).thenReturn(true);
when(pseq.getMainFlow()).thenReturn(flow);
PageSequenceLayoutManager pageSequenceLayoutManager = new PageSequenceLayoutManager(ath, pseq) {
public void activateLayout() {
makeNewPage(false);
}
protected Page createPage(int pageNumber, boolean isBlank) {
return createPageForRegionName("test");
}
protected void finishPage() {
}
};
RuntimeException re = null;
try {
pageSequenceLayoutManager.activateLayout();
} catch (RuntimeException e) {
re = e;
}
assertEquals(re.getMessage(),
"The flow-name \"test\" could not be mapped to a region-name in the layout-master-set");
}
}