// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.conflict.pair.properties; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.openstreetmap.josm.data.conflict.Conflict; 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.conflict.pair.MergeDecisionType; import org.openstreetmap.josm.testutils.JOSMTestRules; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * Unit tests of {@link PropertiesMergeModel}. */ public class PropertiesMergeModelTest { private abstract static class TestChangeListener implements ChangeListener { public int numInvocations; @Override public void stateChanged(ChangeEvent e) { numInvocations++; doTest(); } public abstract void doTest(); public void assertNumInvocations(int count) { assertEquals(count, numInvocations); } } PropertiesMergeModel model; /** * Setup test. */ @Rule @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public JOSMTestRules test = new JOSMTestRules(); /** * Setup test. */ @Before public void setUp() { model = new PropertiesMergeModel(); } private void populate(OsmPrimitive my, OsmPrimitive their) { model.populate(new Conflict<>(my, their)); } @Test public void testPopulate() { DataSet d1 = new DataSet(); DataSet d2 = new DataSet(); Node n1 = new Node(1); Node n2 = new Node(1); d1.addPrimitive(n1); d2.addPrimitive(n2); populate(n1, n2); Way w1 = new Way(1); Way w2 = new Way(1); d1.addPrimitive(w1); d2.addPrimitive(w2); populate(w2, w2); Relation r1 = new Relation(1); Relation r2 = new Relation(1); d1.addPrimitive(r1); d2.addPrimitive(r2); populate(r1, r2); } @Test public void testDecidingAboutCoords() { DataSet d1 = new DataSet(); DataSet d2 = new DataSet(); Node n1 = new Node(1); Node n2 = new Node(1); d1.addPrimitive(n1); d2.addPrimitive(n2); populate(n1, n2); assertFalse(model.hasCoordConflict()); n1.setCoor(new LatLon(1, 1)); populate(n1, n2); assertTrue(model.hasCoordConflict()); n1.cloneFrom(new Node(1)); n2.setCoor(new LatLon(2, 2)); populate(n1, n2); assertTrue(model.hasCoordConflict()); n1.setCoor(new LatLon(1, 1)); n2.setCoor(new LatLon(2, 2)); populate(n1, n2); assertTrue(model.hasCoordConflict()); // decide KEEP_MINE and ensure notification via Observable // TestChangeListener observerTest; model.addChangeListener( observerTest = new TestChangeListener() { @Override public void doTest() { assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE)); } } ); model.decideCoordsConflict(MergeDecisionType.KEEP_MINE); assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE)); observerTest.assertNumInvocations(1); // decide KEEP_THEIR and ensure notification via Observable // model.removeChangeListener(observerTest); model.addChangeListener( observerTest = new TestChangeListener() { @Override public void doTest() { assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR)); } } ); model.decideCoordsConflict(MergeDecisionType.KEEP_THEIR); assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR)); observerTest.assertNumInvocations(1); model.removeChangeListener(observerTest); } }