/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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. */ package org.geotoolkit.map; import java.beans.PropertyChangeEvent; import java.util.EventObject; import org.geotoolkit.factory.FactoryFinder; import org.geotoolkit.style.MutableStyle; import org.geotoolkit.style.MutableStyleFactory; import org.geotoolkit.style.StyleConstants; import org.geotoolkit.util.collection.CollectionChangeEvent; import org.junit.Test; import static org.junit.Assert.*; /** * * @author Johann Sorel (Geomatys) * @module */ public class TreeMapContextTest extends org.geotoolkit.test.TestBase { private static final MutableStyleFactory SF = (MutableStyleFactory) FactoryFinder.getStyleFactory(null); public TreeMapContextTest() { } /** * Check that flat context are correctly created. */ @Test public void testFlatStructure(){ MapContext context = MapBuilder.createContext(); assertEquals(0, context.layers().size()); MapLayer layer1 = MapBuilder.createEmptyMapLayer(); layer1.setName("layer 1"); MapLayer layer2 = MapBuilder.createEmptyMapLayer(); layer2.setName("layer 2"); MapLayer layer3 = MapBuilder.createEmptyMapLayer(); layer3.setName("layer 3"); //add layers context.layers().add(layer1); assertEquals(1, context.layers().size()); context.layers().add(layer2); context.layers().add(layer3); assertEquals(3, context.layers().size()); assertEquals(layer1, context.layers().get(0)); assertEquals(layer2, context.layers().get(1)); assertEquals(layer3, context.layers().get(2)); //remove a layer context.layers().remove(layer2); assertEquals(2, context.layers().size()); assertEquals(layer1, context.layers().get(0)); assertEquals(layer3, context.layers().get(1)); } /** * Test property change events and items add events. */ @Test public void testItemEvents(){ MapItem item = MapBuilder.createItem(); final RecordListener listener = new RecordListener(); item.addItemListener(listener); //test a property event item.setName("test"); assertEquals(0, listener.itemChangecount); assertEquals(1, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof PropertyChangeEvent); PropertyChangeEvent event = (PropertyChangeEvent) listener.lastEvent; assertEquals(MapItem.NAME_PROPERTY, event.getPropertyName()); assertEquals(null, event.getOldValue()); assertEquals("test", event.getNewValue()); listener.reset(); //test an item add event MapItem child = MapBuilder.createItem(); item.items().add(child); assertEquals(1, listener.itemChangecount); assertEquals(0, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof CollectionChangeEvent); CollectionChangeEvent levent = (CollectionChangeEvent) listener.lastEvent; assertEquals(item,levent.getSource()); assertEquals(CollectionChangeEvent.ITEM_ADDED,levent.getType()); assertEquals(0,levent.getRange().getMinValue()); assertEquals(0,levent.getRange().getMaxValue()); assertEquals(1,levent.getItems().size()); assertEquals(child,levent.getItems().iterator().next()); listener.reset(); //test an item change event child.setDescription(SF.description("child0", "abstract child0")); assertEquals(1, listener.itemChangecount); assertEquals(0, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof CollectionChangeEvent); levent = (CollectionChangeEvent) listener.lastEvent; assertEquals(item,levent.getSource()); assertEquals(CollectionChangeEvent.ITEM_CHANGED,levent.getType()); assertEquals(0,levent.getRange().getMinValue()); assertEquals(0,levent.getRange().getMaxValue()); assertEquals(1,levent.getItems().size()); assertEquals(child,levent.getItems().iterator().next()); assertTrue(levent.getChangeEvent() instanceof PropertyChangeEvent); PropertyChangeEvent pevent = (PropertyChangeEvent) levent.getChangeEvent(); assertEquals(child,pevent.getSource()); assertEquals(MapItem.DESCRIPTION_PROPERTY, pevent.getPropertyName()); assertEquals(StyleConstants.DEFAULT_DESCRIPTION, pevent.getOldValue()); assertEquals(SF.description("child0", "abstract child0"), pevent.getNewValue()); listener.reset(); //test an item remove event item.items().remove(child); assertEquals(1, listener.itemChangecount); assertEquals(0, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof CollectionChangeEvent); levent = (CollectionChangeEvent) listener.lastEvent; assertEquals(item,levent.getSource()); assertEquals(CollectionChangeEvent.ITEM_REMOVED,levent.getType()); assertEquals(0,levent.getRange().getMinValue()); assertEquals(0,levent.getRange().getMaxValue()); assertEquals(1,levent.getItems().size()); assertEquals(child,levent.getItems().iterator().next()); listener.reset(); } @Test public void testContextEvents(){ MapContext context = MapBuilder.createContext(); final RecordListener listener = new RecordListener(); context.addContextListener(listener); //test a layer event MapLayer layer = MapBuilder.createEmptyMapLayer(); context.layers().add(layer); assertEquals(1, listener.itemChangecount); assertEquals(1, listener.layerChangecount); assertEquals(0, listener.propertyChangecount); listener.reset(); //test an item event context.items().add(MapBuilder.createItem()); assertEquals(1, listener.itemChangecount); assertEquals(0, listener.layerChangecount); assertEquals(0, listener.propertyChangecount); listener.reset(); //test a layer property change layer.setName("layer0"); assertEquals(1, listener.itemChangecount); assertEquals(1, listener.layerChangecount); assertEquals(0, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof CollectionChangeEvent); CollectionChangeEvent levent = (CollectionChangeEvent) listener.lastEvent; assertEquals(context,levent.getSource()); assertEquals(CollectionChangeEvent.ITEM_CHANGED,levent.getType()); assertEquals(0,levent.getRange().getMinValue()); assertEquals(0,levent.getRange().getMaxValue()); assertEquals(1,levent.getItems().size()); assertEquals(layer,levent.getItems().iterator().next()); assertTrue(levent.getChangeEvent() instanceof PropertyChangeEvent); PropertyChangeEvent pevent = (PropertyChangeEvent) levent.getChangeEvent(); assertEquals(layer,pevent.getSource()); assertEquals(MapItem.NAME_PROPERTY, pevent.getPropertyName()); assertEquals(null, pevent.getOldValue()); assertEquals("layer0", pevent.getNewValue()); listener.reset(); //test a layer style change MutableStyle style = SF.style(SF.pointSymbolizer()); layer.setStyle(style); assertEquals(1, listener.itemChangecount); assertEquals(1, listener.layerChangecount); assertEquals(0, listener.propertyChangecount); assertTrue(listener.lastEvent instanceof CollectionChangeEvent); levent = (CollectionChangeEvent) listener.lastEvent; assertEquals(context,levent.getSource()); assertEquals(CollectionChangeEvent.ITEM_CHANGED,levent.getType()); assertEquals(0,levent.getRange().getMinValue()); assertEquals(0,levent.getRange().getMaxValue()); assertEquals(1,levent.getItems().size()); assertEquals(layer,levent.getItems().iterator().next()); assertTrue(levent.getChangeEvent() instanceof PropertyChangeEvent); pevent = (PropertyChangeEvent) levent.getChangeEvent(); assertEquals(layer,pevent.getSource()); assertEquals(MapLayer.STYLE_PROPERTY, pevent.getPropertyName()); assertEquals(style, pevent.getNewValue()); listener.reset(); } /** * Check that tree like context are correctly created. */ @Test public void testTreeStructure(){ MapContext context = MapBuilder.createContext(); assertEquals(0, context.items().size()); assertEquals(0, context.layers().size()); MapItem item1 = MapBuilder.createItem(); item1.setName("item 1"); MapItem item11 = MapBuilder.createItem(); item11.setName("item 11"); MapItem item12 = MapBuilder.createItem(); item12.setName("item 12"); MapItem item2 = MapBuilder.createItem(); item2.setName("item 2"); MapItem item3 = MapBuilder.createItem(); item3.setName("item 3"); MapItem item31 = MapBuilder.createItem(); item31.setName("item 31"); MapItem item32 = MapBuilder.createItem(); item32.setName("item 32"); MapItem item321 = MapBuilder.createItem(); item321.setName("item 321"); MapItem item33 = MapBuilder.createItem(); item33.setName("item 33"); MapLayer layer1 = MapBuilder.createEmptyMapLayer(); layer1.setName("layer 1"); MapLayer layer2 = MapBuilder.createEmptyMapLayer(); layer2.setName("layer 2"); MapLayer layer3 = MapBuilder.createEmptyMapLayer(); layer3.setName("layer 3"); assertEquals(0, context.layers().size()); context.items().add(item1); item1.items().add(item11); item1.items().add(item12); item12.items().add(layer1); assertEquals(1, context.layers().size()); context.items().add(item2); context.items().add(layer2); assertEquals(2, context.layers().size()); context.items().add(item3); item3.items().add(item31); item3.items().add(item32); item32.items().add(item321); item321.items().add(layer3); assertEquals(3, context.layers().size()); item3.items().add(item33); // DefaultMapContext[Description : Title= Abstract=] //  ├─DefaultMapItem (item 1) [Description : Title= Abstract=] //  │   ├─DefaultMapItem (item 11) [Description : Title= Abstract=] //  │   └─DefaultMapItem (item 12) [Description : Title= Abstract=] //  │       └─EmptyMapLayer[Description : Title= Abstract=] //  ├─DefaultMapItem (item 2) [Description : Title= Abstract=] //  ├─EmptyMapLayer[Description : Title= Abstract=] //  └─DefaultMapItem (item 3) [Description : Title= Abstract=] //      ├─DefaultMapItem (item 31) [Description : Title= Abstract=] //      ├─DefaultMapItem (item 32) [Description : Title= Abstract=] //      │   └─DefaultMapItem (item 321) [Description : Title= Abstract=] //      │       └─EmptyMapLayer[Description : Title= Abstract=] //      └─DefaultMapItem (item 33) [Description : Title= Abstract=] assertEquals(4, context.items().size()); assertEquals(2, item1.items().size()); assertEquals(0, item11.items().size()); assertEquals(1, item12.items().size()); assertEquals(0, item2.items().size()); assertEquals(3, item3.items().size()); assertEquals(0, item31.items().size()); assertEquals(1, item32.items().size()); assertEquals(1, item321.items().size()); assertEquals(0, item33.items().size()); //layers method from mapcontext must contain the layers assertEquals(3, context.layers().size()); assertEquals(layer1, context.layers().get(0)); assertEquals(layer2, context.layers().get(1)); assertEquals(layer3, context.layers().get(2)); //check operation on the list context.layers().remove(layer3); assertEquals(2, context.layers().size()); assertEquals(0, item321.items().size()); } private static class RecordListener implements ContextListener{ private EventObject lastEvent = null; private int layerChangecount = 0; private int itemChangecount = 0; private int propertyChangecount = 0; public void reset(){ lastEvent = null; layerChangecount = 0; itemChangecount = 0; propertyChangecount = 0; } @Override public void layerChange(final CollectionChangeEvent<MapLayer> event) { lastEvent = event; layerChangecount++; } @Override public void itemChange(final CollectionChangeEvent<MapItem> event) { lastEvent = event; itemChangecount++; } @Override public void propertyChange(final PropertyChangeEvent event) { lastEvent = event; propertyChangecount++; } } }