// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.conflict.pair.tags;
import static org.fest.reflect.core.Reflection.field;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.data.osm.Node;
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 TagMergeModel} class.
*/
@SuppressWarnings("unchecked")
public class TagMergeModelTest {
/**
* Setup test.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules();
@Test
public void testAddPropertyChangeListener() {
TagMergeModel model = new TagMergeModel();
PropertyChangeListener listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
}
};
model.addPropertyChangeListener(listener);
Set<?> list = field("listeners").ofType(Set.class)
.in(model)
.get();
assertEquals(1, list.size());
assertEquals(listener, list.iterator().next());
}
@Test
public void testRemovePropertyChangeListener() {
TagMergeModel model = new TagMergeModel();
PropertyChangeListener listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
}
};
model.addPropertyChangeListener(listener);
model.removePropertyChangeListener(listener);
Set<?> list = field("listeners")
.ofType(Set.class)
.in(model)
.get();
assertEquals(0, list.size());
}
@Test
public void testPopulateNoConflichts() {
Node my = new Node(1);
Node their = new Node(1);
TagMergeModel model = new TagMergeModel();
model.populate(my, their);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(0, list.size());
}
@Test
public void testPopulateNoConflicts1() {
Node my = new Node(1);
my.put("key", "value");
Node their = new Node(1);
their.put("key", "value");
TagMergeModel model = new TagMergeModel();
model.populate(my, their);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(0, list.size());
}
@Test
public void testPopulateMissingKeyMine() {
Node my = new Node(1);
Node their = new Node(1);
their.put("key", "value");
TagMergeModel model = new TagMergeModel();
model.populate(my, their);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(1, list.size());
TagMergeItem item = list.get(0);
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
assertEquals("key", item.getKey());
assertNull(item.getMyTagValue());
assertEquals("value", item.getTheirTagValue());
}
@Test
public void testPopulateMissingKeyTheir() {
Node my = new Node(1);
my.put("key", "value");
Node their = new Node(1);
TagMergeModel model = new TagMergeModel();
model.populate(my, their);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(1, list.size());
TagMergeItem item = list.get(0);
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
assertEquals("key", item.getKey());
assertNull(item.getTheirTagValue());
assertEquals("value", item.getMyTagValue());
}
@Test
public void testPopulateConflictingValues() {
Node my = new Node(1);
my.put("key", "myvalue");
Node their = new Node(1);
their.put("key", "theirvalue");
TagMergeModel model = new TagMergeModel();
model.populate(my, their);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(1, list.size());
TagMergeItem item = list.get(0);
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
assertEquals("key", item.getKey());
assertEquals("myvalue", item.getMyTagValue());
assertEquals("theirvalue", item.getTheirTagValue());
}
@Test
public void testAddItem() {
TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
TagMergeModel model = new TagMergeModel();
model.addItem(item);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(1, list.size());
item = list.get(0);
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
assertEquals("key", item.getKey());
assertEquals("myvalue", item.getMyTagValue());
assertEquals("theirvalue", item.getTheirTagValue());
}
@Test
public void testDecide() {
TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
TagMergeModel model = new TagMergeModel();
model.addItem(item);
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
model.decide(0, MergeDecisionType.KEEP_MINE);
assertEquals(1, list.size());
item = list.get(0);
assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
model.decide(0, MergeDecisionType.KEEP_THEIR);
assertEquals(1, list.size());
item = list.get(0);
assertEquals(MergeDecisionType.KEEP_THEIR, item.getMergeDecision());
model.decide(0, MergeDecisionType.UNDECIDED);
assertEquals(1, list.size());
item = list.get(0);
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
}
@Test
public void testDecideMultiple() {
TagMergeModel model = new TagMergeModel();
for (int i = 0; i < 10; i++) {
model.addItem(new TagMergeItem("key-" + i, "myvalue-" + i, "theirvalue-" +i));
}
List<TagMergeItem> list = field("tagMergeItems")
.ofType(List.class)
.in(model)
.get();
assertEquals(10, list.size());
model.decide(new int[] {0, 3, 5}, MergeDecisionType.KEEP_MINE);
for (int i = 0; i < 10; i++) {
TagMergeItem item = list.get(i);
if (i == 0 || i == 3 || i == 5) {
assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
} else {
assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
}
}
}
}