// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.layer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.Arrays;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openstreetmap.josm.JOSMFixture;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.gui.util.GuiHelper;
/**
* Tests {@link MainLayerManager}.
* @author Michael Zangl
*/
public class MainLayerManagerTest extends LayerManagerTest {
private MainLayerManager layerManagerWithActive;
private class CapturingActiveLayerChangeListener implements ActiveLayerChangeListener {
private ActiveLayerChangeEvent lastEvent;
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
assertSame(layerManager, e.getSource());
lastEvent = e;
}
}
private final class CapturingThreadCheckingActiveLayerChangeListener extends CapturingActiveLayerChangeListener {
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
GuiHelper.assertCallFromEdt();
super.activeOrEditLayerChanged(e);
}
}
protected static class AbstractTestOsmLayer extends OsmDataLayer {
public AbstractTestOsmLayer() {
super(new DataSet(), "OSM layer", null);
}
@Override
public LayerPositionStrategy getDefaultLayerPosition() {
return LayerPositionStrategy.afterLast(o -> true);
}
}
@BeforeClass
public static void setUpClass() {
JOSMFixture.createUnitTestFixture().init();
}
@Override
@Before
public void setUp() {
layerManager = layerManagerWithActive = new MainLayerManager();
}
@Test
public void testAddLayerSetsActiveLayer() {
TestLayer layer1 = new TestLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
TestLayer layer3 = new TestLayer();
assertNull(layerManagerWithActive.getActiveLayer());
assertNull(layerManagerWithActive.getEditLayer());
layerManagerWithActive.addLayer(layer1);
assertSame(layer1, layerManagerWithActive.getActiveLayer());
assertNull(layerManagerWithActive.getEditLayer());
layerManagerWithActive.addLayer(layer2);
assertSame(layer2, layerManagerWithActive.getActiveLayer());
assertSame(layer2, layerManagerWithActive.getEditLayer());
layerManagerWithActive.addLayer(layer3);
assertSame(layer2, layerManagerWithActive.getActiveLayer());
assertSame(layer2, layerManagerWithActive.getEditLayer());
}
@Test
public void testRemoveLayerUnsetsActiveLayer() {
TestLayer layer1 = new TestLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
TestLayer layer3 = new TestLayer();
AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
layerManagerWithActive.addLayer(layer3);
layerManagerWithActive.addLayer(layer4);
assertSame(layer4, layerManagerWithActive.getActiveLayer());
assertSame(layer4, layerManagerWithActive.getEditLayer());
layerManagerWithActive.removeLayer(layer4);
//prefer osm layers
assertSame(layer2, layerManagerWithActive.getActiveLayer());
assertSame(layer2, layerManagerWithActive.getEditLayer());
layerManagerWithActive.removeLayer(layer2);
assertSame(layer1, layerManagerWithActive.getActiveLayer());
assertNull(layerManagerWithActive.getEditLayer());
layerManagerWithActive.removeLayer(layer1);
layerManagerWithActive.removeLayer(layer3);
assertNull(layerManagerWithActive.getActiveLayer());
assertNull(layerManagerWithActive.getEditLayer());
}
/**
* Test {@link MainLayerManager#addActiveLayerChangeListener(ActiveLayerChangeListener)} and
* {@link MainLayerManager#addAndFireActiveLayerChangeListener(ActiveLayerChangeListener)}
*/
@Test
public void testAddActiveLayerChangeListener() {
TestLayer layer1 = new TestLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
CapturingActiveLayerChangeListener listener = new CapturingThreadCheckingActiveLayerChangeListener();
layerManagerWithActive.addActiveLayerChangeListener(listener);
assertNull(listener.lastEvent);
CapturingActiveLayerChangeListener listener2 = new CapturingActiveLayerChangeListener();
layerManagerWithActive.addAndFireActiveLayerChangeListener(listener2);
assertSame(listener2.lastEvent.getPreviousActiveLayer(), null);
assertSame(listener2.lastEvent.getPreviousEditLayer(), null);
layerManagerWithActive.setActiveLayer(layer1);
assertSame(listener2.lastEvent.getPreviousActiveLayer(), layer2);
assertSame(listener2.lastEvent.getPreviousEditLayer(), layer2);
layerManagerWithActive.setActiveLayer(layer2);
assertSame(listener2.lastEvent.getPreviousActiveLayer(), layer1);
assertSame(listener2.lastEvent.getPreviousEditLayer(), layer2);
}
/**
* Test if {@link MainLayerManager#addActiveLayerChangeListener(ActiveLayerChangeListener)} prevents listener from beeing added twice.
*/
@Test(expected = IllegalArgumentException.class)
public void testAddActiveLayerChangeListenerTwice() {
CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
layerManagerWithActive.addActiveLayerChangeListener(listener);
layerManagerWithActive.addActiveLayerChangeListener(listener);
}
/**
* Test if {@link MainLayerManager#removeActiveLayerChangeListener(ActiveLayerChangeListener)} works.
*/
@Test
public void testRemoveActiveLayerChangeListener() {
TestLayer layer1 = new TestLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
layerManagerWithActive.addActiveLayerChangeListener(listener);
layerManagerWithActive.removeActiveLayerChangeListener(listener);
layerManagerWithActive.setActiveLayer(layer2);
assertNull(listener.lastEvent);
}
/**
* Test if {@link MainLayerManager#removeActiveLayerChangeListener(ActiveLayerChangeListener)} checks if listener is in list.
*/
@Test(expected = IllegalArgumentException.class)
public void testRemoveActiveLayerChangeListenerNotInList() {
layerManagerWithActive.removeActiveLayerChangeListener(new CapturingActiveLayerChangeListener());
}
/**
* Tests {@link MainLayerManager#setActiveLayer(Layer)} and {@link MainLayerManager#getActiveLayer()}.
* <p>
* Edit and active layer getters are also tested in {@link #testAddLayerSetsActiveLayer()}
*/
@Test
public void testSetGetActiveLayer() {
TestLayer layer1 = new TestLayer();
TestLayer layer2 = new TestLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
layerManagerWithActive.setActiveLayer(layer1);
assertSame(layer1, layerManagerWithActive.getActiveLayer());
layerManagerWithActive.setActiveLayer(layer2);
assertSame(layer2, layerManagerWithActive.getActiveLayer());
}
/**
* Tests {@link MainLayerManager#getEditDataSet()}
*/
@Test
public void testGetEditDataSet() {
assertNull(layerManagerWithActive.getEditDataSet());
TestLayer layer0 = new TestLayer();
layerManagerWithActive.addLayer(layer0);
assertNull(layerManagerWithActive.getEditDataSet());
AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
layerManagerWithActive.setActiveLayer(layer1);
assertSame(layer1.data, layerManagerWithActive.getEditDataSet());
layerManagerWithActive.setActiveLayer(layer2);
assertSame(layer2.data, layerManagerWithActive.getEditDataSet());
}
/**
* Tests {@link MainLayerManager#getVisibleLayersInZOrder()}
*/
@Test
public void testGetVisibleLayersInZOrder() {
AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
TestLayer layer3 = new TestLayer();
layer3.setVisible(false);
AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
TestLayer layer5 = new TestLayer();
AbstractTestOsmLayer layer6 = new AbstractTestOsmLayer();
AbstractTestOsmLayer layer7 = new AbstractTestOsmLayer();
layerManagerWithActive.addLayer(layer1);
layerManagerWithActive.addLayer(layer2);
layerManagerWithActive.addLayer(layer3);
layerManagerWithActive.addLayer(layer4);
layerManagerWithActive.addLayer(layer5);
layerManagerWithActive.addLayer(layer6);
layerManagerWithActive.addLayer(layer7);
layerManagerWithActive.setActiveLayer(layer1);
assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
layerManagerWithActive.getVisibleLayersInZOrder());
layerManagerWithActive.setActiveLayer(layer4);
assertEquals(Arrays.asList(layer7, layer6, layer5, layer2, layer1, layer4),
layerManagerWithActive.getVisibleLayersInZOrder());
// should not be moved ouside edit layer block
layerManagerWithActive.setActiveLayer(layer6);
assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
layerManagerWithActive.getVisibleLayersInZOrder());
layerManagerWithActive.setActiveLayer(layer7);
assertEquals(Arrays.asList(layer6, layer7, layer5, layer4, layer2, layer1),
layerManagerWithActive.getVisibleLayersInZOrder());
// ignored
layerManagerWithActive.setActiveLayer(layer3);
assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
layerManagerWithActive.getVisibleLayersInZOrder());
layerManagerWithActive.setActiveLayer(layer5);
assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
layerManagerWithActive.getVisibleLayersInZOrder());
}
}