/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.layout; import junit.framework.TestCase; import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; import org.pentaho.reporting.engine.classic.core.layout.model.LayoutNodeTypes; import org.pentaho.reporting.engine.classic.core.layout.model.RenderNode; import org.pentaho.reporting.engine.classic.core.layout.model.SpacerRenderNode; import org.pentaho.reporting.engine.classic.core.layout.model.context.NodeLayoutProperties; import org.pentaho.reporting.engine.classic.core.layout.process.alignment.AlignmentChunk; import org.pentaho.reporting.engine.classic.core.layout.process.alignment.ChunkIterator; import org.pentaho.reporting.engine.classic.core.layout.process.layoutrules.DefaultSequenceList; import org.pentaho.reporting.engine.classic.core.layout.process.layoutrules.InlineSequenceElement; import org.pentaho.reporting.engine.classic.core.layout.process.layoutrules.SequenceList; import java.util.NoSuchElementException; public class ChunkIteratorTest extends TestCase { private static class DummyRenderNode extends RenderNode { private DummyRenderNode() { super( NodeLayoutProperties.GENERIC_PROPERTIES ); } public int getNodeType() { return LayoutNodeTypes.TYPE_NODE_TEXT; } } public ChunkIteratorTest() { } public ChunkIteratorTest( final String name ) { super( name ); } protected void setUp() throws Exception { ClassicEngineBoot.getInstance().start(); } public void testIterateEmpty() { final ChunkIterator it = new ChunkIterator( new DefaultSequenceList(), 0 ); assertFalse( it.hasNext() ); try { it.next(); fail(); } catch ( NoSuchElementException e ) { // expected } catch ( Throwable t ) { fail(); } } private void assertNext( final ChunkIterator it, final int start, final int length, final long width ) { assertTrue( it.hasNext() ); final AlignmentChunk next = it.next(); assertNotNull( next ); assertEquals( length, next.getLength() ); assertEquals( start, next.getStart() ); assertEquals( start + length, next.getEnd() ); assertEquals( width, next.getWidth() ); } public void testSequenceBuilding1() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 2, 20 ); assertNext( it, 2, 2, 20 ); assertFalse( it.hasNext() ); } public void testSequenceBuilding3() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 3, 30 ); assertNext( it, 3, 3, 30 ); assertFalse( it.hasNext() ); } public void testSequenceBuilding2() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 2, 20 ); assertNext( it, 2, 1, 10 ); assertNext( it, 3, 2, 20 ); assertFalse( it.hasNext() ); } public void testSequenceBuildingSpacer() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 2, 20 ); assertNext( it, 2, 3, 30 ); assertFalse( it.hasNext() ); } public void testSequenceBuilding4() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 2, 20 ); assertNext( it, 2, 1, 10 ); assertNext( it, 3, 3, 30 ); assertFalse( it.hasNext() ); } public void testSequenceBuilding5() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 3, 30 ); assertNext( it, 3, 3, 30 ); assertFalse( it.hasNext() ); } public void testSequenceBuildingSingle1() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 2, 20 ); assertFalse( it.hasNext() ); } public void testSequenceBuildingSingle2() { final SequenceList list = new DefaultSequenceList(); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.START ), new SpacerRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.CONTENT ), new DummyRenderNode() ); list.add( new TestInlineSequenceElement( InlineSequenceElement.Classification.END ), new SpacerRenderNode() ); final ChunkIterator it = new ChunkIterator( list, 0 ); assertNext( it, 0, 3, 30 ); assertFalse( it.hasNext() ); } }