/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* 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 General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.glayer;
import com.bc.ceres.glayer.support.ShapeLayer;
import com.bc.ceres.grender.Rendering;
import com.bc.ceres.grender.support.BufferedImageRendering;
import static org.junit.Assert.*;
import org.junit.Test;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class CollectionLayerTest {
@Test
public void testCollection() {
Layer collectionLayer = new CollectionLayer();
assertTrue(collectionLayer.isCollectionLayer());
}
@Test
public void testModelBounds() {
Layer layer;
int x1;
int x2;
int y1;
int y2;
layer = new CollectionLayer();
assertEquals(null, layer.getModelBounds());
layer = new CollectionLayer();
layer.getChildren().add(new CollectionLayer());
layer.getChildren().add(new CollectionLayer());
layer.getChildren().add(new CollectionLayer());
assertEquals(null, layer.getModelBounds());
layer = new CollectionLayer();
layer.getChildren().add(new CollectionLayer());
layer.getChildren().add(new ShapeLayer(new Shape[]{new Rectangle(20, 10, 30, 50)}, new AffineTransform()));
layer.getChildren().add(new ShapeLayer(new Shape[]{new Rectangle(10, 20, 20, 60)}, new AffineTransform()));
x1 = Math.min(20, 10);
y1 = Math.min(10, 20);
x2 = Math.max(20 + 30, 10 + 20);
y2 = Math.max(10 + 50, 20 + 60);
assertEquals(new Rectangle(x1, y1, x2 - x1, y2 - y1), layer.getModelBounds());
layer = new CollectionLayer();
layer.getChildren().add(new ShapeLayer(new Shape[]{new Rectangle(-20, 10, 30, 50)}, new AffineTransform()));
layer.getChildren().add(new ShapeLayer(new Shape[]{new Rectangle(-10, 20, 20, 60)}, new AffineTransform()));
layer.getChildren().add(new ShapeLayer(new Shape[]{new Rectangle(1, 2, 40, 50)}, new AffineTransform()));
x1 = Math.min(Math.min(-20, -10), 1);
y1 = Math.min(Math.min(10, 20), 2);
x2 = Math.max(Math.max(-20 + 30, -10 + 20), 1 + 40);
y2 = Math.max(Math.max(10 + 50, 20 + 60), 2 + 50);
assertEquals(new Rectangle(x1, y1, x2 - x1, y2 - y1), layer.getModelBounds());
}
@Test
public void testRenderRecognisesVisibileState() {
final Layer layer = new CollectionLayer();
final RenderCountingLayer l1 = new RenderCountingLayer();
final RenderCountingLayer l2 = new RenderCountingLayer();
final RenderCountingLayer l3 = new RenderCountingLayer();
layer.getChildren().add(l1);
layer.getChildren().add(l2);
layer.getChildren().add(l3);
final Rendering rendering = new BufferedImageRendering(16, 16);
layer.render(rendering);
assertEquals(1, l1.getRenderCount());
assertEquals(1, l2.getRenderCount());
assertEquals(1, l3.getRenderCount());
l2.setVisible(false);
layer.render(rendering);
assertEquals(2, l1.getRenderCount());
assertEquals(1, l2.getRenderCount());
assertEquals(2, l3.getRenderCount());
l3.setVisible(false);
layer.render(rendering);
assertEquals(3, l1.getRenderCount());
assertEquals(1, l2.getRenderCount());
assertEquals(2, l3.getRenderCount());
layer.setVisible(false);
layer.render(rendering);
assertEquals(3, l1.getRenderCount());
assertEquals(1, l2.getRenderCount());
assertEquals(2, l3.getRenderCount());
}
@Test
public void testListInterfaceImplementionSpecConformance() {
final Layer layer = new CollectionLayer();
final java.util.List<Layer> list = layer.getChildren();
assertEquals(true, list.isEmpty());
assertEquals(0, list.size());
Iterator<Layer> layerIterator = list.iterator();
assertNotNull(layerIterator);
assertEquals(false, layerIterator.hasNext());
try {
layerIterator.next();
fail();
} catch (NoSuchElementException ignored) {
// ok
}
Layer childLayer0 = new CollectionLayer();
list.add(childLayer0);
assertEquals(false, list.isEmpty());
assertEquals(1, list.size());
layerIterator = list.iterator();
assertNotNull(layerIterator);
assertEquals(true, layerIterator.hasNext());
assertSame(childLayer0, layerIterator.next());
assertEquals(false, layerIterator.hasNext());
try {
layerIterator.next();
fail();
} catch (NoSuchElementException ignored) {
// ok
}
assertSame(childLayer0, list.get(0));
try {
list.get(1);
fail();
} catch (IndexOutOfBoundsException ignored) {
// ok
}
Layer childLayer1 = new CollectionLayer();
list.add(childLayer1);
assertEquals(2, list.size());
assertSame(childLayer0, list.get(0));
assertSame(childLayer1, list.get(1));
childLayer0 = new CollectionLayer();
list.set(0, childLayer0);
assertSame(childLayer0, list.get(0));
assertSame(childLayer1, list.get(1));
list.remove(childLayer0);
assertEquals(1, list.size());
assertSame(childLayer1, list.get(0));
list.remove(0);
assertEquals(0, list.size());
list.add(new CollectionLayer());
list.add(new CollectionLayer());
list.add(new CollectionLayer());
final Iterator<Layer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
assertEquals(0, list.size());
}
@Test
public void testChildLayerListIsLife() {
Layer owner = new CollectionLayer();
final List<Layer> list = owner.getChildren();
final TracingLayerListener ll = new TracingLayerListener();
owner.addListener(ll);
list.add(new CollectionLayer());
assertEquals("added 1;", ll.trace);
list.add(new CollectionLayer());
assertEquals("added 1;added 1;", ll.trace);
assertSame(owner, list.get(0).getParent());
assertSame(owner, list.get(1).getParent());
Layer layer0 = list.remove(0);
assertNull(layer0.getParent());
assertEquals("added 1;added 1;removed 1;", ll.trace);
layer0 = list.set(0, new CollectionLayer());
assertNull(layer0.getParent());
assertEquals("added 1;added 1;removed 1;removed 1;added 1;", ll.trace);
}
private static class RenderCountingLayer extends CollectionLayer {
private int renderCount;
@Override
protected void renderLayer(Rendering rendering) {
renderCount++;
}
public int getRenderCount() {
return renderCount;
}
}
}