// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.turnrestrictions.editor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import javax.swing.ListSelectionModel; import org.junit.Rule; import org.junit.Test; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.testutils.JOSMTestRules; /** * Unit test for {@see JosmSelctionListModel} */ public class JosmSelectionListModelTest { @Rule public JOSMTestRules rules = new JOSMTestRules().preferences(); @Test public void testConstructor() { assertNotNull(new JosmSelectionListModel(new OsmDataLayer(new DataSet(), "test", null))); } @Test(expected = IllegalArgumentException.class) public void testConstructorNull() { new JosmSelectionListModel(null); } @Test public void test_setJOSMSelection() { DataSet ds = new DataSet(); OsmDataLayer layer = new OsmDataLayer(ds, "test", null); JosmSelectionListModel model = new JosmSelectionListModel(layer); // set a selection with three objects model.setJOSMSelection(Arrays.asList(new Node(new LatLon(1, 1)), new Way(), new Relation())); assertEquals(3, model.getSize()); // null is allowed model.setJOSMSelection(null); assertEquals(0, model.getSize()); assertTrue(model.getSelected().isEmpty()); // empty has the same effect model.setJOSMSelection(new ArrayList<>()); assertEquals(0, model.getSize()); assertTrue(model.getSelected().isEmpty()); } @Test public void test_setJOSMSelection_withSelected() { DataSet ds = new DataSet(); OsmDataLayer layer = new OsmDataLayer(ds, "test", null); JosmSelectionListModel model = new JosmSelectionListModel(layer); List<OsmPrimitive> objects = (Arrays.asList(new Node(new LatLon(1, 1)), new Way(), new Relation())); model.setJOSMSelection(objects); model.setSelected(objects.subList(0, 1)); assertEquals(new HashSet<>(objects.subList(0, 1)), model.getSelected()); // set new selection which includes one object which is currently // selected in the model. Should still be selected after setting // the new JOSM selection objects = objects.subList(1, 2); model.setJOSMSelection(objects); assertEquals(Collections.singleton(objects.get(0)), model.getSelected()); } @Test public void test_getSelected() { DataSet ds = new DataSet(); OsmDataLayer layer = new OsmDataLayer(ds, "test", null); JosmSelectionListModel model = new JosmSelectionListModel(layer); ListSelectionModel selectionModel = model.getListSelectionModel(); assertNotNull(model.getSelected()); assertTrue(model.getSelected().isEmpty()); // select one element model.setJOSMSelection(Arrays.asList(new Node(new LatLon(1, 1)), new Way(), new Relation())); selectionModel.setSelectionInterval(0, 0); assertEquals(Collections.singleton(model.getElementAt(0)), model.getSelected()); // select two elements selectionModel.setSelectionInterval(1, 2); assertEquals(new HashSet<>(Arrays.asList(model.getElementAt(1), model.getElementAt(2))), model.getSelected()); } @Test public void test_setSelected() { // set selected with null is OK - nothing selected thereafter JosmSelectionListModel model = new JosmSelectionListModel(new OsmDataLayer(new DataSet(), "test", null)); model.setSelected(null); assertTrue(model.getSelected().isEmpty()); // set selected with empty list is OK - nothing selected thereafter model.setSelected(new ArrayList<>()); assertTrue(model.getSelected().isEmpty()); // select an object existing in the list of displayed objects List<OsmPrimitive> objects = (Arrays.asList(new Node(new LatLon(1, 1)), new Way(), new Relation())); model.setJOSMSelection(objects); model.setSelected(Arrays.asList(objects.get(0))); assertEquals(Collections.singleton(objects.get(0)), model.getSelected()); // select an object not-existing in the list of displayed objects model.setJOSMSelection(objects); model.setSelected(Arrays.asList(new Way())); assertTrue(model.getSelected().isEmpty()); } @Test public void test_editLayerChanged() { DataSet ds = new DataSet(); List<OsmPrimitive> objects = (Arrays.asList(new Node(new LatLon(1, 1)), new Way(), new Relation())); objects.stream().forEach(ds::addPrimitive); OsmDataLayer layer1 = new OsmDataLayer(ds, "layer1", null); OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), "layer2", null); Main.getLayerManager().addLayer(layer1); Main.getLayerManager().addLayer(layer2); JosmSelectionListModel model = new JosmSelectionListModel(layer1); Main.getLayerManager().addActiveLayerChangeListener(model); // switch from edit layer1 to edit layer2. content of the JOSM selection // should be empty thereafter Main.getLayerManager().setActiveLayer(layer1); Main.getLayerManager().setActiveLayer(layer2); assertEquals(0, model.getSize()); // switch from layer2 to layer1 which has one object selected. Object should // be displayed in the JOSM selection list ds.setSelected(Collections.singleton(objects.get(0))); Main.getLayerManager().setActiveLayer(layer1); assertEquals(1, model.getSize()); assertEquals(objects.get(0), model.getElementAt(0)); // switch to a "null" edit layer (i.e. no edit layer)- nothing should // be displayed in the selection list Main.getLayerManager().removeLayer(layer2); Main.getLayerManager().removeLayer(layer1); assertEquals(0, model.getSize()); Main.getLayerManager().removeActiveLayerChangeListener(model); } }