// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm;
import java.util.Arrays;
import java.util.HashSet;
import org.junit.Assert;
import org.junit.BeforeClass;
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.projection.Projections;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Unit tests of the {@code OsmPrimitive} class.
*/
public class OsmPrimitiveTest {
/**
* Setup test.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules();
private void compareReferrers(OsmPrimitive actual, OsmPrimitive... expected) {
Assert.assertEquals(new HashSet<>(Arrays.asList(expected)),
new HashSet<>(actual.getReferrers()));
}
private DataSet dataSet = new DataSet();
/**
* Setup test.
*/
@BeforeClass
public static void setUp() {
Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
}
@Test
public void testSimpleReferrersTest() {
Node n1 = new Node(LatLon.ZERO);
Way w1 = new Way();
w1.addNode(n1);
dataSet.addPrimitive(n1);
dataSet.addPrimitive(w1);
compareReferrers(n1, w1);
}
@Test
public void testAddAndRemoveReferrer() {
Node n1 = new Node(LatLon.ZERO);
Node n2 = new Node(LatLon.ZERO);
Way w1 = new Way();
w1.addNode(n1);
w1.addNode(n2);
w1.addNode(n1);
w1.removeNode(n1);
dataSet.addPrimitive(n1);
dataSet.addPrimitive(n2);
dataSet.addPrimitive(w1);
compareReferrers(n1);
compareReferrers(n2, w1);
}
@Test
public void testMultipleReferrers() {
Node n1 = new Node(LatLon.ZERO);
Way w1 = new Way();
Way w2 = new Way();
Relation r1 = new Relation();
w1.addNode(n1);
w2.addNode(n1);
r1.addMember(new RelationMember("", n1));
dataSet.addPrimitive(n1);
dataSet.addPrimitive(w1);
dataSet.addPrimitive(w2);
dataSet.addPrimitive(r1);
compareReferrers(n1, w1, w2, r1);
}
@Test
public void testRemoveMemberFromRelationReferrerTest() {
Node n1 = new Node(LatLon.ZERO);
Relation r1 = new Relation();
r1.addMember(new RelationMember("", n1));
r1.addMember(new RelationMember("", n1));
r1.removeMember(0);
dataSet.addPrimitive(n1);
dataSet.addPrimitive(r1);
compareReferrers(n1, r1);
}
@Test
public void testSetRelationMemberReferrerTest() {
Node n1 = new Node(LatLon.ZERO);
Node n2 = new Node(LatLon.ZERO);
Relation r1 = new Relation();
Relation r2 = new Relation();
r1.addMember(new RelationMember("", n1));
r2.addMember(new RelationMember("", n2));
r2.setMember(0, r1.getMember(0));
dataSet.addPrimitive(n1);
dataSet.addPrimitive(n2);
dataSet.addPrimitive(r1);
dataSet.addPrimitive(r2);
compareReferrers(n1, r1, r2);
compareReferrers(n2);
}
@Test
public void testRemovePrimitiveReferrerTest() {
Node n1 = new Node(LatLon.ZERO);
Way w1 = new Way();
w1.addNode(n1);
w1.setDeleted(true);
dataSet.addPrimitive(n1);
compareReferrers(n1);
w1.setDeleted(false);
dataSet.addPrimitive(w1);
compareReferrers(n1, w1);
Relation r1 = new Relation();
r1.addMember(new RelationMember("", w1));
r1.setDeleted(true);
dataSet.addPrimitive(r1);
compareReferrers(w1);
r1.setDeleted(false);
compareReferrers(w1, r1);
}
@Test
public void testNodeFromMultipleDatasets() {
// n has two referrers - w1 and w2. But only w1 is returned because it is in the same dataset as n
Node n = new Node(LatLon.ZERO);
Way w1 = new Way();
w1.addNode(n);
dataSet.addPrimitive(n);
dataSet.addPrimitive(w1);
new Way(w1);
Assert.assertEquals(n.getReferrers().size(), 1);
Assert.assertEquals(n.getReferrers().get(0), w1);
}
@Test(expected = DataIntegrityProblemException.class)
public void testCheckMustBeInDatasate() {
Node n = new Node();
n.getReferrers();
}
}